diff --git a/.hermes/shared-memory/decision-log.md b/.hermes/shared-memory/decision-log.md index 7447fd68..d4ca26f6 100644 --- a/.hermes/shared-memory/decision-log.md +++ b/.hermes/shared-memory/decision-log.md @@ -16,14 +16,38 @@ --- -## 2026-05-22 敲木鱼图片创作采用双图 image2 链路 +## 2026-05-23 寓教于乐玩法入口收敛为马路街区式横向延展 -- 背景:敲木鱼自定义题材只生成中央敲击物时,运行态缺少与新主题匹配的竖屏背景;若直接让背景 prompt 自由发挥,又容易把敲击物或木槌画进背景里。 -- 决策:敲木鱼 `compile-draft` / `regenerate-hit-object` 图片链路固定为两步 image2 edits。第一步调用 VectorEngine `/v1/images/edits` + `gpt-image-2`,以默认木鱼图作为结构和画风参考,用户上传参考图只作为同次请求的新主题参考,结合用户题材关键词或参考图主题生成 `1:1` 透明底新敲击物并写回 `hitObjectAsset`;第二步以新敲击物图作为主题和画风参考,结合用户原始题材生成 `9:16` 背景环境图并写回 `backgroundAsset`。两步 prompt 使用 PRD 中固定隐藏关键词,不追加额外 negative prompt;背景图不得包含敲击物本体或木槌互动物品。 -- 影响范围:`api-server` 木鱼图片生成编排、`wooden_fish_work_profile.background_asset_json`、shared contracts、前端结果页 / 运行态背景展示、敲木鱼 PRD 和平台链路文档。 +- 背景:参考图和视频表明,寓教于乐板块的图形化入口更接近 Toca Life World 式的“中央马路串联主题小建筑群街区”,而不是乐园分区、环形岛屿或世界球体结构。 +- 决策:后续寓教于乐入口概念图统一采用“横屏 16:9、中央灰蓝色马路贯穿、建筑群沿路两侧聚集、左右边缘持续出画可接下一屏”的结构;马路必须带车道线、斑马线、路口和小汽车,区域通过水果店、画笔工坊、运动馆、音乐剧场、树屋温室等主题小建筑群暗示,不再使用乐园式分区组织。 +- 影响范围:寓教于乐入口概念图、image2 prompt 生成脚本、设计文档、后续横向世界地图探索稿。 +- 验证方式:新生成概念图必须满足“马路是主脊线、建筑群成街区聚合、左右边缘可延展、无品牌乐园元素”四项约束;若图面再跑回环形乐园或漂浮岛,需要重新收敛 prompt。 +- 关联文档:`docs/design/【前端体验】寓教于乐Toca式横向世界地图入口概念图-2026-05-23.md`、`scripts/generate-edutainment-road-town-map-concepts.mjs`、`output/imagegen/edutainment-road-town-map-concepts-20260523/`。 + +## 2026-05-22 敲木鱼图片创作采用三图 image2 链路 + +- 背景:敲木鱼自定义题材只生成中央敲击物时,运行态缺少与新主题匹配的竖屏背景和主题化返回按钮;若直接让背景 prompt 自由发挥,又容易把敲击物或木槌画进背景里。 +- 决策:敲木鱼 `compile-draft` / `regenerate-hit-object` 图片链路固定为三步 image2 edits。第一步调用 VectorEngine `/v1/images/edits` + `gpt-image-2`,以默认木鱼图作为结构和画风参考,用户上传参考图只作为同次请求的新主题参考,结合用户题材关键词或参考图主题生成 `1:1` 绿色背景主体图;`api-server` 先对这张绿幕图执行去绿背景处理并写回 `hitObjectAsset`。第二步必须以第一步抠图完成后的透明敲击物图作为参考,结合用户原始题材生成 `9:16` 背景环境图并写回 `backgroundAsset`,避免背景图继承绿幕或纯绿色画布。第三步必须以去绿后的敲击物主体图和背景环境图为参考,生成 `1:1` 绿色背景返回按钮图,服务端去绿后写回 `backButtonAsset`。三步 prompt 使用 PRD 中固定隐藏关键词,不追加额外 negative prompt;返回按钮只允许参考图约束圆形底色和箭头配色,不允许继承复杂造型、花纹、浮雕边、异形外框或装饰图案;背景图不得包含敲击物本体或木槌互动物品,返回按钮图不得包含文字、数字、水印或额外 UI 面板。 +- 影响范围:`api-server` 木鱼图片生成编排、`wooden_fish_work_profile.background_asset_json`、`wooden_fish_work_profile.back_button_asset_json`、shared contracts、前端结果页 / 运行态背景与返回按钮展示、敲木鱼 PRD 和平台链路文档。 - 验证方式:执行 `cargo test -p api-server wooden_fish --manifest-path server-rs/Cargo.toml`、`cargo test -p spacetime-client wooden_fish --manifest-path server-rs/Cargo.toml`、`npm run spacetime:generate`、`npm run check:spacetime-schema`、`npm run typecheck`。 - 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。 +## 2026-05-22 敲木鱼敲击物暂不做服务端抠图后处理 + +- 背景:gpt-image-2 偶尔会把木鱼图直接回成带黑底或其它实底背景的 PNG,但服务端抠图后处理在玉米等主题上误伤过主体像素。 +- 决策:敲木鱼 hit object 落盘前暂不做服务端抠图后处理,当前只通过 prompt 强约束真实透明 alpha PNG、透明底、禁止黑底 / 白底 / 棋盘格 / 实底背景。后续若重启后处理,必须先有可验证的保守策略,只能清理画布边缘连通背景,不能抠掉主体内部深色结构或主题细节。 +- 影响范围:`server-rs/crates/api-server/src/wooden_fish.rs`、敲木鱼 PRD、平台链路文档、后续同类 image2 单图资产落盘策略。 +- 验证方式:`cargo test -p api-server wooden_fish --manifest-path server-rs/Cargo.toml`,并在试玩阶段确认主体像素未被后处理误删。 +- 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。 + +## 2026-05-22 敲木鱼背景中央禁主体要写成硬约束 + +- 背景:苹果等主题在试玩时,背景图中央仍可能残留主题主体,说明“外围设计”这种软描述不够。 +- 决策:敲木鱼背景 prompt 必须显式要求中央主体预留区保持干净,中央 40% 区域禁止出现主题主体、主体局部特写、轮廓影子、重复元素或主题主体碎片;主题元素只允许出现在外围氛围。 +- 影响范围:`server-rs/crates/api-server/src/wooden_fish.rs`、敲木鱼 PRD、平台链路文档、后续 image2 背景类玩法 prompt。 +- 验证方式:背景 prompt 单测应包含中央禁区硬约束,试玩图中央不再出现苹果或其它主题主体。 +- 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。 + ## 2026-05-21 外部 API 失败必须 OTLP 上报并落库 - 背景:图片生成等外部供应商调用失败时,仅返回 502/504 或普通日志无法支持后续按 provider、阶段和重试属性聚合排障。 @@ -165,12 +189,12 @@ - 验证方式:执行敲木鱼契约 / module / facade / runtime model / platform entry 定向测试、`npm run typecheck`、`npm run check:encoding`、`npm run check:spacetime-schema`、`cargo check -p api-server --manifest-path server-rs\Cargo.toml`,本地 smoke 使用 mock 短信配置后检查 `/healthz`。 - 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。 -## 2026-05-21 敲木鱼敲击音效复用通用 Vidu 音效链路 +## 2026-05-21 敲木鱼敲击音效当前只接受上传、录音或默认音 -- 背景:敲木鱼创作需要通过“敲击音效”描述生成真实短音频,不能继续由 `spacetime-client` 合成 `/generated-wooden-fish-assets/...` 假路径;同时拼图和抓大鹅音频生成入口仍需保持关闭。 -- 决策:通用 `/api/creation/audio/sound-effect` 提交 Vidu 音效任务;`/api/creation/audio/sound-effect/{task_id}/asset` 只对木鱼 `hit_sound` 目标开放,完成查询、下载、OSS 私有对象、`asset_object` 和 entity binding 写入。木鱼 `compile-draft` / `generate-hit-sound` 在 `api-server` 内复用同一 helper 生成并注入 `hitSoundAsset`,`spacetime-client` 缺少真实 `hitSoundAsset` 时拒绝编译。拼图和抓大鹅相关目标继续返回 `410 Gone`。 +- 背景:敲木鱼按关键词生成的敲击音效约束不够稳定;当前创作阶段需要先关闭提示词生成音效,避免生成结果不符合敲击体验。 +- 决策:通用 `/api/creation/audio/sound-effect` 对木鱼 `hit_sound` 目标也返回 `410 Gone`。木鱼工作台只支持上传或麦克风录制音频;若用户未提供音频,`api-server` 写回内置默认木鱼音 `/wooden-fish/default-hit-sound.mp3`。`hitSoundPrompt` 只作为历史兼容字段保留,当前创作流程不使用;`spacetime-client` 不得合成 `/generated-wooden-fish-assets/...` 假路径。 - 影响范围:`server-rs/crates/api-server/src/vector_engine_audio_generation.rs`、`server-rs/crates/api-server/src/wooden_fish.rs`、`server-rs/crates/spacetime-client/src/wooden_fish.rs`、`shared-contracts` / `packages/shared` 的 `creationAudio` 契约、敲木鱼 PRD 与平台链路文档。 -- 验证方式:执行 `cargo test -p shared-contracts creation_audio --manifest-path server-rs\Cargo.toml`、`cargo test -p spacetime-client wooden_fish --manifest-path server-rs\Cargo.toml`、`cargo test -p api-server wooden_fish --manifest-path server-rs\Cargo.toml`、`cargo test -p api-server disabled_creation_audio_targets_return_gone_except_wooden_fish_sound_effects --manifest-path server-rs\Cargo.toml`、`npm run typecheck`、`npm run check:encoding`,本地 smoke 检查 `/healthz`;真实生成需同时配置 VectorEngine 与 OSS AccessKey。 +- 验证方式:执行 `cargo test -p shared-contracts creation_audio --manifest-path server-rs\Cargo.toml`、`cargo test -p spacetime-client wooden_fish --manifest-path server-rs\Cargo.toml`、`cargo test -p api-server wooden_fish --manifest-path server-rs\Cargo.toml`、`cargo test -p api-server disabled_creation_audio_targets_return_gone_including_wooden_fish_sound_effects --manifest-path server-rs\Cargo.toml`、`npm run typecheck`、`npm run check:encoding`,本地 smoke 检查 `/healthz`。 - 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`、`docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`。 ## 2026-05-21 敲木鱼默认敲击物使用内置透明 PNG @@ -181,6 +205,14 @@ - 验证方式:默认 `compile-draft` 返回的 `hitObjectAsset.generationProvider` 应为 `bundled-default` 且 `imageSrc=/wooden-fish/default-hit-object.png`;自定义关键词或参考图仍走 image2;前端静态资源可通过 Vite 直接访问。 - 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。 +## 2026-05-23 敲木鱼创作请求需要独立长超时 + +- 背景:敲木鱼 `createSession` 和 `executeAction` 都会串行等待多段 image2 生成、去绿背景处理和 OSS 落库;共享创作工厂默认 15 秒对这条链路太短,容易让前端先报 `请求超时:15000ms`。 +- 决策:敲木鱼 client 单独配置长等待窗口,同时覆盖会话创建和执行动作请求,不修改共享工厂默认值,避免影响其它轻量创作玩法。 +- 影响范围:`src/services/wooden-fish/woodenFishClient.ts`、`src/services/creation-agent/creationAgentClientFactory.ts`、敲木鱼工作台与生成页请求行为。 +- 验证方式:`npm test -- src/services/wooden-fish/woodenFishClient.test.ts`,并在本地敲木鱼创作时不再提前触发 15 秒超时。 +- 关联文档:`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。 + ## 2026-05-21 RPG publish_world 设定文本以后端草稿真相派生 - 背景:RPG 结果页发布动作只保证提交 `{ action: 'publish_world' }`;旧 agent 会话可能没有 `seed_text`,但 `draft_profile_json` 已经通过 `publish_gate` 并可发布。 diff --git a/.hermes/shared-memory/pitfalls.md b/.hermes/shared-memory/pitfalls.md index 25c1b2df..abd649a6 100644 --- a/.hermes/shared-memory/pitfalls.md +++ b/.hermes/shared-memory/pitfalls.md @@ -39,6 +39,38 @@ - 验证:`cargo test -p api-server puzzle_ui_spritesheet_postprocess_turns_green_screen_transparent --manifest-path server-rs\Cargo.toml`、`cargo test -p api-server puzzle_level_scene_spritesheet_and_background_requests_use_references --manifest-path server-rs\Cargo.toml`、`cargo test -p api-server match3d_derived_asset_prompts_match_three_sheet_pipeline --manifest-path server-rs\Cargo.toml`。 - 关联:`server-rs/crates/api-server/src/puzzle/generation.rs`、`server-rs/crates/api-server/src/match3d/works.rs`、`server-rs/crates/api-server/src/generated_asset_sheets.rs`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。 +## 敲木鱼 hit object 不要只相信透明底 prompt + +- 现象:苹果等主题试玩时,中央敲击物图带明显黑底;背景图中央还可能出现苹果主体,或背景环境图偶发变成纯绿色底,和“中央只叠加 hitObjectAsset”的运行态设定冲突。 +- 原因:gpt-image-2 对“透明底”和“背景只做外围氛围”的遵循不稳定。若 hit object 直接入库,黑底会被当成真实像素展示;若背景 prompt 只有软描述,模型会把主题主体画进中央。第一步为了去背刻意要求绿幕图时,如果第二步参考图或 prompt 没有切断绿幕语义,背景图也可能继承纯绿色画布。 +- 处理:敲木鱼 hit object prompt 固定要求先输出 `1:1` 绿色背景主体图(纯绿色绿幕、单一 `#00FF00` 背景),再由 `api-server` 只对绿幕背景做去绿透明化;不要回到黑底 / 白底 / 透明底 prompt 后再做泛抠图。背景生成必须使用第一步抠图完成后的透明图作为参考图,并在 prompt 中显式禁止继承绿色底色、绿幕底色或纯绿色画布;背景 prompt 还要固定要求中央 40% 主体预留区干净,禁止主题主体、局部特写、轮廓影子、重复元素和主题碎片,只允许外围氛围。 +- 验证:`cargo test -p api-server wooden_fish --manifest-path server-rs\Cargo.toml`,并用花朵 / 苹果 / 玉米主题跑试玩图确认绿幕被去除、主体未被抠除、背景中央不出现主题主体,背景环境图不再出现纯绿色底。 +- 关联:`server-rs/crates/api-server/src/wooden_fish.rs`、`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。 + +## 敲木鱼返回按钮不要让模型自由发挥外圈花纹 + +- 现象:返回按钮试玩图有时会被画成徽章、花盘、浮雕圆牌,甚至出现复杂外圈和装饰花纹,左箭头反而不够突出。 +- 原因:prompt 只说“主题化返回按钮”时,image2 会把参考图里的装饰语言一起学进去;如果没有把形状收束到“标准圆形 + 单个居中左箭头”,模型会优先补造型而不是补图标。 +- 处理:返回按钮生成 prompt 必须只允许参考图约束圆形底色与箭头配色,明确禁止复杂造型、花纹、浮雕边、异形外框和装饰图案,按钮本体固定为标准圆形。 +- 验证:`cargo test -p api-server wooden_fish --manifest-path server-rs\Cargo.toml`,并重新试玩确认返回按钮只剩圆形底色和中央左箭头。 +- 关联:`server-rs/crates/api-server/src/wooden_fish.rs`、`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`. + +## 敲木鱼创作生成不要沿用 15 秒会话超时 + +- 现象:敲木鱼工作台点击“生成”后,前端直接提示 `请求超时:15000ms`,但后端和 VectorEngine 未必已经失败。 +- 原因:`createCreationAgentClient` 的 `createSessionTimeoutMs` 默认是 15 秒;敲木鱼创作链路会继续进入生成页并执行多次 image2 edits、去绿背景处理和 OSS 写入,单次请求窗口如果继承共享默认值,会早于业务生成完成被前端中断。 +- 处理:敲木鱼 client 必须单独配置长等待窗口,同时覆盖 `createSessionTimeoutMs` 与 `executeActionTimeoutMs`;不要修改共享默认值影响其它轻量创作 Agent。 +- 验证:`npm run test -- src/services/wooden-fish/woodenFishClient.test.ts`,并在本地触发一次木鱼创作确认不再出现 15 秒前端超时。 +- 关联:`src/services/wooden-fish/woodenFishClient.ts`、`src/services/creation-agent/creationAgentClientFactory.ts`、`docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md`。 + +## 敲木鱼点击生成出现 SpacetimeDB procedure 超时先查版本错配 + +- 现象:敲木鱼创作时点击“生成”,前端提示 `SpacetimeDB procedure 调用超时`,但服务端日志更早出现 `Failed to BSATN deserialize procedure return value` 或类似反序列化错误。 +- 原因:本机 `spacetime` CLI / standalone 版本与 `server-rs/Cargo.toml` 锁定的 `spacetimedb` 版本不一致时,procedure 返回值会在宿主侧反序列化失败,api-server 继续等待就表现成调用超时。若旧 standalone 进程还在复用,也会把这个错配继续带进新一轮创作。 +- 处理:先用 `spacetime --version` 确认 `spacetimedb tool version`,再和 `server-rs/Cargo.toml` 的 `spacetimedb = "..."` 对齐;必要时执行 `spacetime version install && spacetime version use `,然后重启 `npm run dev:spacetime`。当前 dev 脚本会在启动和复用本地 SpacetimeDB 前写入并校验 `dev-spacetime-tool-version`,避免继续复用旧宿主。 +- 验证:`spacetime --version` 输出与 `server-rs/Cargo.toml` 一致,`http://127.0.0.1:3101/v1/ping` 正常,`npm run test -- scripts/dev.test.ts` 通过,敲木鱼创作点击生成不再卡在 procedure timeout。 +- 关联:`scripts/dev.mjs`、`scripts/dev.test.ts`、`server-rs/Cargo.toml`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。 + ## 拼图 UI spritesheet 运行态不要二次包圆底或拉伸比例 - 现象:拼图运行态左上返回和右上设置按钮外面出现白色圆圈;底部“提示 / 原图 / 冻结”三枚素材被压扁、拉宽或拉成正圆,和图集原始按钮比例不一致。 @@ -1331,6 +1363,14 @@ - 验证:`npm run test -- scripts/dev.test.ts`;重新运行 `npm run dev` 后 api-server 启动日志不再出现上述 subscribe 401,`/healthz` 返回 200。 - 关联:`scripts/dev.mjs`、`scripts/dev.test.ts`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。 +## 创作作品架或公开列表异常先查本地 SpacetimeDB schema 漂移 + +- 现象:本地 `http://127.0.0.1:3000/` 启动后,`api-server` 日志反复出现 `Host returned error when processing subscription query: no such table: puzzle_gallery_card_view`;或创作中心草稿 / 已发布作品整块消失,`GET /api/creation-entry/config` 返回 `502` 且 details 为 `No such procedure`。 +- 原因:本地 `.env.local` 或 `spacetime.local.json` 指向的 SpacetimeDB 库没有发布当前 `spacetime-module`,或当前 CLI 身份无权发布该库;例如旧 `xushi-p4wfr` 库缺 `get_creation_entry_config` / `puzzle_gallery_card_view`,但当前代码的 `spacetime-client` 启动时会长期订阅这些公开 read model。 +- 处理:先用 `spacetime sql "SELECT * FROM puzzle_gallery_card_view LIMIT 1" --server http://127.0.0.1:3101` 确认目标库是否有当前 view;若只是本地验证,可用 gitignored 的 `spacetime.local.json` 指向可发布且已包含当前 schema 的库,例如 `{"database":"genarrative-dev-codex"}`。该 JSON 必须无 UTF-8 BOM,否则 `scripts/dev.mjs` 会忽略它。修改后用 `npm run dev:api-server -- --database --spacetime-port 3101 --api-port 8082 --no-interactive` 重启。 +- 验证:`curl.exe -i http://127.0.0.1:8082/healthz` 返回 `200`;`curl.exe -i http://127.0.0.1:8082/api/runtime/puzzle/gallery` 返回 `200`;浏览器打开 `http://127.0.0.1:3000/` 无 `puzzle_gallery_card_view` 控制台或后端日志错误。 +- 关联:`scripts/dev.mjs`、`server-rs/crates/spacetime-client/src/lib.rs`、`docs/【开发运维】本地开发验证与生产运维-2026-05-15.md`。 + ## 创作作品架消失先查入口配置 procedure 与本地库权限 - 现象:寓教于乐或创作中心下草稿 / 已发布作品突然整块消失,`GET /api/creation-entry/config` 返回 `502`,details 中为 `No such procedure`。 diff --git a/docs/design/【前端体验】寓教于乐Toca式横向世界地图入口概念图-2026-05-23.md b/docs/design/【前端体验】寓教于乐Toca式横向世界地图入口概念图-2026-05-23.md new file mode 100644 index 00000000..fa0de027 --- /dev/null +++ b/docs/design/【前端体验】寓教于乐Toca式横向世界地图入口概念图-2026-05-23.md @@ -0,0 +1,48 @@ +# 寓教于乐 马路街区式横向世界入口概念图 + +更新时间:`2026-05-23` + +## 背景 + +寓教于乐板块需要继续探索图形化玩法入口。前一轮“乐园地图 / 世界地图”方向已被证明不够贴近参考图,本轮进一步收敛为“中央马路串联主题小建筑群街区”的结构,让每一屏都像一个可横向滑动的儿童小镇街区。 + +## 参考结论 + +从参考图和视频里提炼出的关键结构是: + +1. 每一屏都是一组主题小建筑群,不是稀疏乐园点位。 +2. 中央马路是主路径,汽车沿路通过,边缘继续延伸到下一屏。 +3. 建筑群贴着道路两侧聚合,形成清晰街区,而不是围绕中央广场或环形路径展开。 +4. 左右两边都要有明确“可继续探索”的出画感,方便后续做横向滑动世界。 + +## 目标 + +- 视觉上像可滑动的儿童街区地图。 +- 每一屏都能作为独立探索单元,并且能自然接到前后相邻屏。 +- 保持寓教于乐既有的卡通绘本风,不借用真实品牌乐园或现成 IP。 +- 适合后续叠加入口按钮、焦点框和中文标题。 + +## 本次概念方向 + +1. 识物认知主街 +2. 绘画创作工坊街 +3. 运动音乐街区 +4. 自然探索实验大道 + +## 推荐方向 + +优先推荐 `绘画创作工坊街` 与 `运动音乐街区`。这两条在当前批次里最接近“中央马路 + 两侧主题小建筑群 + 左右可延展”的参考结构。 + +## 生图脚本 + +- 生成脚本:`scripts/generate-edutainment-road-town-map-concepts.mjs` +- 输出目录:`output/imagegen/edutainment-road-town-map-concepts-20260523/` +- 风格参考:`public/child-motion-demo/picture-book-grass-stage.png` + +## 说明 + +本次产物是设计概念稿,不直接进入正式资源目录。后续如果继续收敛,可以以 `城市公园脊` 为母版,向左、向右补相邻屏幕的区域内容。 + +## 当前结论 + +乐园分区结构可以抛弃,后续所有概念都优先按“马路街区式一屏一屏延展”的结构继续迭代。 diff --git a/docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md b/docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md index a660755c..21eba04e 100644 --- a/docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md +++ b/docs/prd/【玩法创作】敲木鱼玩法模板PRD-2026-05-20.md @@ -14,7 +14,7 @@ 创作入口 -> 工作台 -> 生成页 -> 结果页 -> 试玩 -> 发布 -> 运行态 -> 公开详情/分享 ``` -首版默认屏幕中央展示内置卡通透明敲击物图案 `/wooden-fish/default-hit-object.png`。玩家点击运行态非功能区时触发一次敲击:播放敲击音效、敲击物图案执行被敲击动画,并在敲击物上方随机飘出一条祝福词。顶部计数器只在某条祝福词首次出现时创建,之后该词每次出现都累加。计数仅属于当前单次 run,不进入账号长期账本。 +首版默认屏幕中央展示内置卡通透明敲击物图案 `/wooden-fish/default-hit-object.png`。玩家点击运行态非功能区时触发一次敲击:播放敲击音效、敲击物图案执行被敲击动画,并在敲击物上方随机飘出一条祝福词。顶部只展示总数记录;子项计数收纳到总数卡片下方的折叠面板中,总数卡片点击后展开各子项计数,词条在面板中预置显示,未出现时初始值为 0,点击面板外收起。计数仅属于当前单次 run,不进入账号长期账本。 ## 2. 模板定位 @@ -86,9 +86,9 @@ WF-* - `slotId=hit-sound` - `slotType=hit-sound-audio` - `slotName=敲击音效` - - 来源:`hitSoundPrompt` 生成,或上传/麦克风录制音频 + - 来源:用户上传/麦克风录制音频,或使用默认木鱼音 - 写回字段:`hitSoundAsset` - - 描述生成能力:复用通用创作音频接口 `/api/creation/audio/sound-effect` 的 VectorEngine Vidu 音效生成与 OSS 持久化链路 + - 默认兜底:`/wooden-fish/default-hit-sound.mp3` - API 命名空间: - `/api/creation/wooden-fish/...` - `/api/runtime/wooden-fish/...` @@ -122,8 +122,8 @@ WF-* 1. `workDescription`:作品简介; 2. `themeTags[]`:最多 6 个标签; 3. `hitObjectReferenceImageSrc`:上传或历史图引用,只能作为 image2 参考,不可直接进入运行态; -4. `hitSoundPrompt`:生成音效描述; -5. `hitSoundAsset`:用户上传或录音产生的音频资产。 +4. `hitSoundPrompt`:历史兼容字段,当前创作流程不再使用; +5. `hitSoundAsset`:用户上传、录音或默认音频资产。 默认祝福词: @@ -142,39 +142,54 @@ WF-* ## 6. 生成规则 -### 6.1 敲击物图案与背景环境图 +### 6.1 敲击物图案、背景环境图与返回按钮图 -默认模板在用户未自定义关键词且未上传参考图时,`compile-draft` 使用内置透明 PNG `/wooden-fish/default-hit-object.png` 写回 `hitObjectAsset`,`generationProvider="bundled-default"`。这张图来自 image2 对原始参考图的卡通风格化重绘,固定为模板默认资源,避免默认关键词在每次生成时改变造型。即使使用内置默认敲击物,首版仍需要生成 `backgroundAsset`,背景环境图使用默认敲击物作为主题和画风参考。 +默认模板在用户未自定义关键词且未上传参考图时,`compile-draft` 使用内置透明 PNG `/wooden-fish/default-hit-object.png` 写回 `hitObjectAsset`,`generationProvider="bundled-default"`。这张图来自 image2 对原始参考图的卡通风格化重绘,固定为模板默认资源,避免默认关键词在每次生成时改变造型。即使使用内置默认敲击物,首版仍需要生成 `backgroundAsset` 与 `backButtonAsset`,背景环境图和主题返回按钮图都使用默认敲击物作为主题和画风参考。 -用户输入自定义关键词、上传参考图,或在结果页主动重生成敲击物时,`compile-draft` 与 `regenerate-hit-object` 必须先为敲击物图案生成 image2 单图资产,再基于新敲击物图案生成背景环境图,并由 `api-server` 注入写回 `hitObjectAsset` 与 `backgroundAsset`。前端 action 请求不得自带 `hitObjectAsset` 或 `backgroundAsset` 短路生成。如果用户上传参考图,后端只能把该图作为 image2 参考图或主题参考;运行态不得直接使用上传图。 +用户输入自定义关键词、上传参考图,或在结果页主动重生成敲击物时,`compile-draft` 与 `regenerate-hit-object` 必须先为敲击物图案生成 image2 单图资产,再基于新敲击物图案生成背景环境图,最后基于去绿后的敲击物主体和背景环境图生成主题返回按钮图,并由 `api-server` 注入写回 `hitObjectAsset`、`backgroundAsset` 与 `backButtonAsset`。前端 action 请求不得自带 `hitObjectAsset`、`backgroundAsset` 或 `backButtonAsset` 短路生成。如果用户上传参考图,后端只能把该图作为 image2 参考图或主题参考;运行态不得直接使用上传图。 敲击物图案生成流程固定为: 1. 调用 VectorEngine `/v1/images/edits`,模型固定为 `gpt-image-2`; 2. multipart 参考图固定包含默认木鱼图 `/wooden-fish/default-hit-object.png`,作为基础结构和画风参考; 3. 若用户上传参考图,该图只作为新主题参考追加到同一次 image2 edits 请求,不直接进入运行态; -4. 尺寸固定 `1:1`,透明底; +4. 尺寸固定 `1:1`,必须输出绿色背景主体图(纯绿色绿幕),背景为单一纯绿色 `#00FF00`,并显式禁止黑底、白底、棋盘格、纸板底或任何其它实底背景; 5. 提示词严格使用: ```text -生成敲木鱼新样式,要求结构,画风与参考图保持高度一致,新样式颜色搭配使用新主题对应的颜色。 +生成敲木鱼新样式,要求结构,画风与参考图保持高度一致,新样式颜色搭配使用新主题对应的颜色。尺寸1:1,先输出绿色背景主体图(纯绿色绿幕),背景必须是单一纯绿色 #00FF00 且平整无纹理、无渐变、无阴影、无道具,主体完整居中,主体边缘必须干净,不要直接输出透明底。随后由服务端对绿色背景主体图做抠图去除绿色背景。最终结果只保留单个敲击物图案,禁止黑底、白底、棋盘格、纸板底或任何实底背景;主体本身不要使用与绿幕接近的纯绿色,若新主题天然包含绿色,请改用偏深、偏黄或偏蓝的绿色并与绿幕清晰区分。 新主题为:(用户提供参考图或用户输入关键词) ``` +敲击物图案落盘前,`api-server` 必须只对第一步生成的纯绿色绿幕背景执行去绿处理,把绿色背景转成真实透明 alpha PNG;不得对黑底、白底或其它未知实底执行泛抠图,避免误伤玉米等主体像素。去绿处理必须保留主体内部深色结构和主题细节。 + 背景环境图生成流程固定为: 1. 调用 VectorEngine `/v1/images/edits`,模型固定为 `gpt-image-2`; -2. multipart 参考图固定为第一步新生成的敲击物图案;默认未生成新敲击物时使用内置默认敲击物图案; +2. multipart 参考图固定为第一步敲击物图案抠图完成后的透明图;默认未生成新敲击物时使用内置默认敲击物图案的透明兜底图; 3. 尺寸固定竖屏 `9:16`; -4. 背景环境图只适配新敲击物主题和画风,背景中不得包含新敲击物本体,也不得增加木槌互动物品; +4. 背景环境图只适配新敲击物主题和画风,背景中不得包含新敲击物本体,也不得增加木槌互动物品;中央主体预留区必须保持干净,画面中央 40% 区域禁止出现主题主体、主体局部特写、主体轮廓影子、重复元素或主题主体的局部碎片; 5. 提示词严格使用: ```text -生成敲木鱼背景,要求主题,画风与参考图保持高度一致,背景元素和颜色搭配与主题对应,木鱼预设在屏幕中央位置,木鱼主体周围元素保持干净,背景氛围围绕外围设计,背景环境图中不包含新木鱼物品,背景氛围中不增加木槌互动物品。 +生成敲木鱼背景,要求主题,画风与参考图保持高度一致,背景元素和颜色搭配与主题对应,木鱼预设在屏幕中央位置,木鱼主体周围元素保持干净,背景氛围围绕外围设计,背景环境图中不包含新木鱼物品,背景氛围中不增加木槌互动物品。尺寸竖屏9:16。参考图必须是第一步敲击物抠图完成后的透明图,不继承任何绿色底色、绿幕底色或纯绿色画布,并要求最终输出完整不透明的背景环境图。中央主体预留区必须保持干净,画面中央 40% 区域禁止出现主题主体、主体局部特写、主体轮廓影子、重复元素或主题主体的局部碎片;主题元素只允许出现在外围氛围,不得把主题物品画在画面中央,也不要把主题物品作为背景中心装饰。 主题为:(用户提供参考图或用户输入关键词) ``` -落库链路固定为:`api-server` 调用 VectorEngine `/v1/images/edits` -> 服务端上传 OSS 私有对象 -> `confirm_asset_object` 登记资产对象 -> `bind_asset_object_to_entity` 绑定到 `entityKind='wooden_fish_work'`。敲击物绑定 `slot='hit_object'`、`assetKind='wooden_fish_hit_object'`,背景绑定 `slot='background'`、`assetKind='wooden_fish_background'`。写回时把 `legacyPublicPath` 分别写入 `hitObjectAsset.imageSrc` 与 `backgroundAsset.imageSrc`。不得只拼 `/generated-wooden-fish-assets/...` 占位路径;前端会对 generated legacy path 走 `/api/assets/read-url` 换签,OSS 中没有真实对象时图片无法显示。 +返回按钮图生成流程固定为: + +1. 调用 VectorEngine `/v1/images/edits`,模型固定为 `gpt-image-2`; +2. multipart 参考图固定包含第一步去除绿色背景后的敲击物主体图,以及第二步生成的背景环境图; +3. 尺寸固定 `1:1`,必须输出绿色背景主体图(纯绿色绿幕),后端落库前执行同一套去绿背景处理; +4. 按主题、画风、材质和配色生成左上角返回按钮图,但参考图只用于约束圆形底色和中央左箭头的颜色搭配,不得借鉴复杂造型、花纹、浮雕边、异形外框或装饰图案;按钮必须始终是标准圆形,中央只保留单个清晰左箭头或返回箭头,不得包含文字、数字、水印、额外 UI 面板、木槌或敲击道具; +5. 提示词严格使用: + +```text +生成敲木鱼左上角返回按钮图。要求以参考图-去除绿色背景后的敲击物主体和背景环境图为主题、画风、材质和配色参考,但参考图只用来约束圆形底色和中央左箭头的颜色搭配,不要继承复杂造型、花纹、浮雕边、异形外框或装饰图案。按钮必须始终是标准圆形,整体像单个圆形图标,圆心居中,圆形内部只保留一个清晰、简洁、居中的向左返回箭头,不要出现文字、数字、水印、按钮外标签、额外 UI 面板、木槌或敲击道具。尺寸1:1,输出绿色背景主体图(纯绿色绿幕),背景必须是单一纯绿色 #00FF00 且平整无纹理、无渐变、无阴影。按钮主体边缘干净,后续由服务端扣除绿色背景;按钮底色不要使用与绿幕接近的纯绿色,若主题天然包含绿色,请仅在圆形底色上使用偏深、偏黄或偏蓝的主题绿色,并用更高对比的箭头颜色区分。 +主题为:(用户提供参考图或用户输入关键词) +``` + +落库链路固定为:`api-server` 调用 VectorEngine `/v1/images/edits` -> 服务端上传 OSS 私有对象 -> `confirm_asset_object` 登记资产对象 -> `bind_asset_object_to_entity` 绑定到 `entityKind='wooden_fish_work'`。敲击物绑定 `slot='hit_object'`、`assetKind='wooden_fish_hit_object'`,背景绑定 `slot='background'`、`assetKind='wooden_fish_background'`,返回按钮绑定 `slot='back_button'`、`assetKind='wooden_fish_back_button'`。写回时把 `legacyPublicPath` 分别写入 `hitObjectAsset.imageSrc`、`backgroundAsset.imageSrc` 与 `backButtonAsset.imageSrc`。不得只拼 `/generated-wooden-fish-assets/...` 占位路径;前端会对 generated legacy path 走 `/api/assets/read-url` 换签,OSS 中没有真实对象时图片无法显示。 默认图案要求: @@ -188,18 +203,18 @@ WF-* 音效统一写回 `hitSoundAsset`。 -生成或写回规则: +写回规则: 1. 若 payload 已包含上传/录音音频资产,`compile-draft` 跳过音效生成,直接持久化该资产; -2. 若 payload 只包含 `hitSoundPrompt`,`api-server` 复用通用创作音频能力提交 VectorEngine Vidu `sound_effect` 任务,轮询生成结果,下载音频,写入 OSS 私有对象,登记 `asset_object`,并绑定到 `entityKind='wooden_fish_work'`、`slot='hit_sound'`、`assetKind='wooden_fish_hit_sound'`,最后注入 `hitSoundAsset`; -3. 若两者都没有,后端生成默认“清脆短促木鱼敲击声”; +2. 若 payload 已上传或录制音频,则直接写回 `hitSoundAsset`; +3. 若两者都没有,后端写回默认木鱼音 `/wooden-fish/default-hit-sound.mp3`; 4. 音效资产必须包含可播放地址、对象键、asset object id、来源和可选时长; -5. 通用创作音频接口对 `wooden_fish` 的 `hit_sound` 目标不得返回 `410 Gone`,对应 `storagePrefix='wooden_fish_assets'`; -6. `spacetime-client` 不得自行合成 `/generated-wooden-fish-assets/...` 音效占位路径,缺少真实 `hitSoundAsset` 时必须拒绝编译。 +5. 通用创作音频接口当前对 `wooden_fish` 的 `hit_sound` 目标返回 `410 Gone`,不得在创作流程中按提示词生成音效; +6. `spacetime-client` 不得自行合成 `/generated-wooden-fish-assets/...` 音效占位路径;缺少真实 `hitSoundAsset` 时应使用默认木鱼音兜底展示与播放。 ### 6.3 封面 -首版封面使用 `hitObjectAsset.imageSrc` 作为 `coverImageSrc`。背景环境图不作为封面图,不单独新增第三次图片生成。 +首版封面使用 `hitObjectAsset.imageSrc` 作为 `coverImageSrc`。背景环境图与返回按钮图不作为封面图。 ## 7. 契约草案 @@ -213,13 +228,14 @@ WF-* 6. `themeTags[]`; 7. `hitObjectPrompt`; 8. `hitObjectReferenceImageSrc`; -9. `hitSoundPrompt`; +9. `hitSoundPrompt`,历史兼容字段,当前创作流程恒为 `null`; 10. `floatingWords[]`; 11. `hitObjectAsset`; 12. `backgroundAsset`; -13. `hitSoundAsset`; -14. `coverImageSrc`; -15. `generationStatus`。 +13. `backButtonAsset`; +14. `hitSoundAsset`; +15. `coverImageSrc`; +16. `generationStatus`。 `WoodenFishImageAsset` 至少包含: @@ -238,7 +254,7 @@ WF-* 2. `audioSrc`; 3. `audioObjectKey`; 4. `assetObjectId`; -5. `source = generated | uploaded | recorded | placeholder`; +5. `source = uploaded | recorded | bundled-default`; 6. `prompt`; 7. `durationMs`。 @@ -277,7 +293,6 @@ GET /api/runtime/wooden-fish/gallery/{publicWorkCode} ```text compile-draft regenerate-hit-object -generate-hit-sound replace-hit-sound update-work-meta update-floating-words @@ -289,19 +304,21 @@ finish `compile-draft` 是长耗时动作。前端进入生成页后应展示可恢复进度;如果请求失败,标记失败前必须复读 session,确认后端是否已经生成并写回草稿。 +敲木鱼创作请求在前端必须使用长等待窗口,避免 `createSession` 或 `executeAction` 仍沿用共享创作工厂默认的 15 秒超时。因为 `compile-draft` 会串行等待敲击物、背景、返回按钮和 OSS 落库,木鱼 client 需要单独配置与整条 image2 链路匹配的超时。 + ## 9. SpacetimeDB 表和 view 新增表: 1. `wooden_fish_agent_session`; -2. `wooden_fish_work_profile`,其中 `background_asset_json` 保存背景环境图资产快照; +2. `wooden_fish_work_profile`,其中 `background_asset_json` 保存背景环境图资产快照,`back_button_asset_json` 保存主题返回按钮图资产快照; 3. `wooden_fish_runtime_run`; 4. `wooden_fish_event`。 新增 view: 1. `wooden_fish_gallery_card_view`:公开列表卡片投影,只暴露已发布作品; -2. `wooden_fish_gallery_view`:公开详情兼容投影,包含图案、音效和祝福词配置。 +2. `wooden_fish_gallery_view`:公开详情兼容投影,包含图案、背景、返回按钮、音效和祝福词配置。 新增或调整表、procedure、view 后必须同步 `migration.rs`、后端表目录、生成 bindings,并执行 `npm run check:spacetime-schema`。 @@ -322,11 +339,11 @@ finish 结果页必须支持: 1. 重生成敲击物图案; -2. 生成、上传或替换敲击音效; +2. 上传、录制或替换敲击音效;未提供时使用默认木鱼音; 3. 修改标题、简介和标签; 4. 修改祝福词,最多 8 条。 -图案重生成和音效生成是独立局部生成态,不得把已有可查看结果重新变成不可打开的全局生成中。 +图案重生成是独立局部生成态,不得把已有可查看结果重新变成不可打开的全局生成中。音效替换只接受上传或录音资产,不触发提示词音效生成。 ## 11. 运行态规则 @@ -334,7 +351,7 @@ finish 功能区: -1. 顶部计数器; +1. 顶部总数记录卡和其下拉的子项计数器面板; 2. 设置、暂停、返回、发布分享等按钮; 3. 结果弹层和音频授权提示。 @@ -343,11 +360,13 @@ finish 1. 点击非功能区才算一次敲击; 2. 每次敲击立即本地累加 `totalTapCount`; 3. 随机等概率从 `floatingWords[]` 中取一个词条; -4. 若词条首次出现,顶部创建对应计数器; +4. 子项计数面板中预置展示所有词条,未出现词条初始值为 0; 5. 后续同词条出现时对应计数器 +1; 6. 播放敲击音效; 7. 敲击物图案执行压缩、回弹或轻微震动动画; -8. 木鱼上方飘出“词条+1”并淡出。 +8. 木鱼上方飘出“词条+1”并淡出,飘字只显示文字本体,不加底板、胶囊背景或说明面板。 + +运行态左上角返回按钮必须优先使用 `backButtonAsset` 渲染主题化按钮图;缺失时才回退通用图标按钮。运行态不提供右上角重开按钮。 音频播放: @@ -367,18 +386,20 @@ finish ## 13. 验收 1. 创作入口能看到 `敲木鱼` 模板; -2. 工作台可以填写敲击物描述、上传参考图、配置音效和祝福词; +2. 工作台可以填写敲击物描述、上传参考图、上传或录制音效、配置祝福词; 3. 提交后按默认木鱼参考图生成 image2 敲击物图案; 4. 提交后按新敲击物图案参考图生成 9:16 背景环境图; -5. 上传图不会直接进入运行态; -6. 用户上传或录制音效时跳过音效生成并持久化该资产; -7. 结果页能看到背景、图案、试听音效、编辑祝福词并试玩; -8. 运行态功能区点击不触发敲击; -9. 非功能区点击会计数、播放音效、播放敲击动画并飘字; -10. 顶部计数器只在词条首次出现时创建; -11. 连点不丢计数; -12. `checkpoint` 和 `finish` 只保存单次 run 摘要; -13. 作品可以发布、进入公开列表和公开详情; -14. `WF-*` 公开作品号能进入分享和运行态; -15. `npm run check:encoding` 通过; -16. schema 变更后 `npm run check:spacetime-schema` 通过。 +5. 提交后按去绿后的敲击物主体和背景环境图生成主题返回按钮图; +6. 上传图不会直接进入运行态; +7. 用户上传或录制音效时直接持久化该资产,未提供时使用默认木鱼音; +8. 结果页能看到背景、图案、试听音效、编辑祝福词并试玩; +9. 运行态功能区点击不触发敲击; +10. 运行态左上角使用主题返回按钮图,右上角不出现重开按钮; +11. 非功能区点击会计数、播放音效、播放敲击动画并飘出无底板大号文字; +12. 顶部总数卡点击后展开子项计数器面板,面板内预置全部词条且未出现词条初始值为 0,面板外点击可收起; +13. 连点不丢计数; +14. `checkpoint` 和 `finish` 只保存单次 run 摘要; +15. 作品可以发布、进入公开列表和公开详情; +16. `WF-*` 公开作品号能进入分享和运行态; +17. `npm run check:encoding` 通过; +18. schema 变更后 `npm run check:spacetime-schema` 通过。 diff --git a/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md b/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md index a0cb47fe..53bfaaeb 100644 --- a/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md +++ b/docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md @@ -160,9 +160,9 @@ npm run check:server-rs-ddd - Match3D 物品 sheet:关卡整图完成后走 VectorEngine `/v1/images/edits` multipart `image`,模型为 `gpt-image-2`,`2K 1:1` 输出 `10*10` spritesheet;物品 sheet prompt 固定要求纯绿色绿幕背景,后端上传 OSS 前必须把绿幕扣成透明 PNG,并把透明整图写入 `itemSpritesheetImageSrc/itemSpritesheetImageObjectKey`。后端固定从该 sheet 解析并持久化 20 个物品、每个 5 个形态;通用系列素材图集的行列索引按每行 2 个物品计算,必须落在 `1..=10`,难度只决定运行态加载 3 / 9 / 15 / 20 种。 - Match3D UI spritesheet 和背景派生图:关卡整图作为参考图并发生成 `1K 1:1` UI spritesheet 与 `1K 9:16` 背景图,模型均为 `gpt-image-2`。UI spritesheet prompt 固定要求纯绿色绿幕背景,后端上传 OSS 前必须把绿幕扣成透明 PNG;背景图必须合成为全画幅不透明 PNG。 - Match3D 1:1 容器 UI:VectorEngine `/v1/images/edits` multipart 参考图。该容器参考图是后端生图协议输入,必须通过 `include_bytes!` 随 `api-server` 编译进二进制,避免 API 单独发布或运行目录缺少 `public/` 时生成失败。 -- 敲木鱼敲击物和背景环境图:VectorEngine `/v1/images/edits`,模型固定 `gpt-image-2`。敲击物支持 multipart 多参考图,第一张固定为后端内嵌默认木鱼图,用户上传图只作为新主题参考;背景环境图只使用新敲击物图作为参考。 +- 敲木鱼敲击物和背景环境图:VectorEngine `/v1/images/edits`,模型固定 `gpt-image-2`。敲击物支持 multipart 多参考图,第一张固定为后端内嵌默认木鱼图,用户上传图只作为新主题参考;prompt 必须要求 `1:1` 真实透明 alpha PNG 并禁止黑底、白底、棋盘格和任何实底背景。当前敲击物上传 OSS 前不做服务端抠图后处理,避免误伤玉米等主体像素。背景环境图只使用第一步抠图完成后的透明敲击物图作为参考,prompt 必须要求中央主体预留区保持干净,中央 40% 区域禁止出现主题主体、主体局部特写、轮廓影子或重复元素,主题元素只能作为外围氛围,且必须显式声明不继承任何绿色底色、绿幕底色或纯绿色画布。 - Hyper3D / Rodin:只保留后端安全代理和旧数据兼容;新 Match3D 草稿和批量新增不再生成 GLB。 -- 音频:视觉小说专用音频路由保留;拼图和抓大鹅生成入口暂时关闭,通用 `/api/creation/audio/*` 对相关目标返回 `410 Gone`;敲木鱼 `hit_sound` 目标例外开放,复用 VectorEngine Vidu 音效生成、OSS 私有对象、`asset_object` 和 entity binding 链路,目标字段固定为 `entityKind='wooden_fish_work'`、`slot='hit_sound'`、`assetKind='wooden_fish_hit_sound'`、`storagePrefix='wooden_fish_assets'`。 +- 音频:视觉小说专用音频路由保留;拼图、抓大鹅和敲木鱼提示词生成音效入口暂时关闭,通用 `/api/creation/audio/*` 对这些目标返回 `410 Gone`。敲木鱼创作只接收上传 / 录音音频资产;未提供时由 `api-server` 写回内置默认木鱼音 `/wooden-fish/default-hit-sound.mp3`。 - OSS:私有 generated legacy path 进入浏览器前必须通过 `/api/assets/read-url` 换签;不要裸请求 `/generated-*`。 - 外部 API 失败审计:外部供应商调用未成功时,`api-server` 必须发送 OTLP 失败事件并写入 `tracking_event`。当前通用 VectorEngine `gpt-image-2-all` 图片生成 / 编辑适配器在 `request_send`、`response_body`、`upstream_status`、`response_parse`、`missing_image` 和 `image_download` 阶段失败时记录 `external_api_call_failure`,`scope_kind = module`、`scope_id = provider`、`module_key = external-api`;metadata 固定包含 provider、endpoint、operation、failureStage、statusCode、statusClass、timeout、retryable、errorMessage、latencyMs、promptChars、referenceImageCount 和 imageModel。入库优先复用 tracking outbox,outbox 不可写或保护阈值拒绝时回退同步写 SpacetimeDB;不得新增前端兜底或在 SpacetimeDB reducer 内做外部 I/O。 @@ -423,7 +423,7 @@ npm run check:server-rs-ddd - Rust 结构体:`WoodenFishWorkProfileRow` - 源码:`server-rs/crates/spacetime-module/src/wooden_fish/tables.rs` -- 说明:敲木鱼作品 profile 真相,包含敲击物图案、背景环境图、敲击音效、飘字配置、发布状态和公开计数;`background_asset_json` 是后加入字段,保存 image2 生成的 9:16 背景环境图资产快照,旧迁移数据按 `None` 兼容。 +- 说明:敲木鱼作品 profile 真相,包含敲击物图案、背景环境图、主题返回按钮图、敲击音效、飘字配置、发布状态和公开计数;`background_asset_json` 保存 image2 生成的 9:16 背景环境图资产快照,`back_button_asset_json` 保存 image2 生成并去绿后的 1:1 返回按钮图资产快照,旧迁移数据按 `None` 兼容。 ### SpacetimeDB view:`wooden_fish_gallery_card_view` @@ -437,7 +437,7 @@ npm run check:server-rs-ddd - Rust view:`wooden_fish_gallery_view` - 返回类型:`Vec` - 源码:`server-rs/crates/spacetime-module/src/wooden_fish.rs` -- 说明:敲木鱼公开详情兼容投影,包含敲击物图案、敲击音效和飘字配置;公开列表主路径优先使用 `wooden_fish_gallery_card_view`。 +- 说明:敲木鱼公开详情兼容投影,包含敲击物图案、背景环境图、主题返回按钮图、敲击音效和飘字配置;公开列表主路径优先使用 `wooden_fish_gallery_card_view`。 ### `match3d_agent_message` diff --git a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md index 21bf0711..dd9ad8ec 100644 --- a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md +++ b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md @@ -45,10 +45,20 @@ npm run dev:api-server 后端日志默认写入 `logs/api-server/`。后端 API smoke 使用 `npm run dev:api-server` 并检查 `/healthz`;不要使用旧 `api-server:maincloud` 或任何 `GENARRATIVE_SPACETIME_MAINCLOUD_*` 口径。 -如果本地 `GET /api/creation-entry/config` 返回 `No such procedure`,通常是 `.env.local` 指向的 SpacetimeDB 库还没有发布当前 `spacetime-module`,或当前 CLI 身份无权发布该库。debug 构建的 `api-server` 会临时使用后端默认入口配置兜底,避免创作作品架整块消失;正式修复仍应切换到拥有目标库权限的 SpacetimeDB 身份后重新运行 `npm run dev` 完成发布,或用 gitignored 的 `spacetime.local.json` 指向可发布的本地库。 +如果本地 `GET /api/creation-entry/config` 返回 `No such procedure`,或 `api-server` 日志出现 `no such table: puzzle_gallery_card_view` / `no such table: wooden_fish_gallery_card_view` 这类公开 view 缺失,通常是 `.env.local` 指向的 SpacetimeDB 库还没有发布当前 `spacetime-module`,或当前 CLI 身份无权发布该库。debug 构建的 `api-server` 会临时使用后端默认入口配置兜底,避免创作作品架整块消失;正式修复仍应切换到拥有目标库权限的 SpacetimeDB 身份后重新运行 `npm run dev` 完成发布,或用 gitignored 的 `spacetime.local.json` 指向可发布的本地库。 + +本地排查 schema 漂移时,先用当前 dev server 显式查询目标库,例如: + +```bash +spacetime sql "SELECT * FROM puzzle_gallery_card_view LIMIT 1" --server http://127.0.0.1:3101 +``` + +如果旧 `.env.local` 仍指向缺少当前 view 的库,例如 `xushi-p4wfr`,而当前可发布库已经包含这些 view,可在 gitignored 的 `spacetime.local.json` 写入 `{"database":"genarrative-dev-codex"}` 作为本机覆盖;写入时不要带 UTF-8 BOM,否则 `scripts/dev.mjs` 会忽略该文件。修改后重启 `api-server`,再检查 `/healthz` 和 `/api/runtime/puzzle/gallery`。 本地 `npm run dev:spacetime` 发布模块时必须显式忽略仓库根目录的 `spacetime.json`,由脚本固定追加 `--no-config` 并使用命令参数里传入的数据库名和 `--server http://127.0.0.1:3101`。否则 CLI 可能把发布目标改写到配置文件里的其他数据库,导致 `dev:spacetime` 启动后又因发布失败自动退出,浏览器随后会在 `ws://127.0.0.1:3101/v1/database/.../subscribe` 看到连接拒绝。 +本地 `spacetime` CLI / standalone 版本必须和 `server-rs/Cargo.toml` 里锁定的 `spacetimedb` 版本一致。若版本错配,procedure 返回值可能在宿主侧触发 `Failed to BSATN deserialize procedure return value`,api-server 最终表现为敲木鱼等创作动作的 `SpacetimeDB procedure 调用超时`。排障时先运行 `spacetime --version`,再对照 `server-rs/Cargo.toml` 的 `spacetimedb = "..."`;需要切版本时执行 `spacetime version install && spacetime version use `,然后重新启动 `npm run dev:spacetime`。当前 `scripts/dev.mjs` 会在启动和复用本地 SpacetimeDB 前写入并校验 `dev-spacetime-tool-version`,避免把旧 standalone 继续带进新一轮创作。 + 本地 `.env`、`.env.local` 或 `.env.secrets.local` 修改后必须重启 `api-server` 才会生效;若已经通过 `npm run dev` 启动完整联调,可在该终端输入 `rs api-server`。排查 RPG / 拼图 / 抓大鹅等 VectorEngine 生图链路时,确认 `VECTOR_ENGINE_BASE_URL`、`VECTOR_ENGINE_API_KEY` 和 `VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS` 只在本地或服务器密钥文件中配置,不能写入 Git。开局 CG 故事板、首图、背景和图集都属于长耗时图片请求;后端默认会把 `VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS` 下限收口到 `1000000`,旧进程仍可能沿用重启前的短超时。若开局 CG 故事板在 `send()` 阶段失败且日志显示 `SendRequest`,先看同一 request_id 的 `request_body_bytes`、`reference_data_url_bytes`、`sourceChain` 和 `rootSource`;当前开局 CG 会把角色图与首幕背景图压到单边 768 的 JPEG 后再作为 generations `image` 数组发送,`/v1/images/generations` 使用默认 HTTP 协商,只有 multipart `/v1/images/edits` 单独强制 HTTP/1.1。 查看本地 Rust / SpacetimeDB 日志: diff --git a/docs/【玩法创作】平台入口与玩法链路-2026-05-15.md b/docs/【玩法创作】平台入口与玩法链路-2026-05-15.md index ad3b3c28..8e0ef674 100644 --- a/docs/【玩法创作】平台入口与玩法链路-2026-05-15.md +++ b/docs/【玩法创作】平台入口与玩法链路-2026-05-15.md @@ -133,12 +133,12 @@ RPG / 拼图等运行态存档选择入口统一在个人中心 `常用功能 > 创作输入固定为: 1. `敲什么`:敲击物单图资产槽位。默认模板使用内置透明 PNG `/wooden-fish/default-hit-object.png` 作为 `bundled-default` 敲击物资产,避免默认关键词被重新语义化改形;用户输入自定义关键词或上传参考图时,后端必须以默认木鱼图作为基础结构和画风参考,使用 image2 生成最终敲击物图案,上传图只作为新主题参考,不直接进入运行态。自定义 `compile-draft` / `regenerate-hit-object` 必须完成 image2 -> OSS 私有对象 -> asset object 登记和绑定后,再由 `api-server` 注入真实 `hitObjectAsset.imageSrc`,不能只写 `/generated-wooden-fish-assets/...` 占位路径,也不能接受前端请求自带的 `hitObjectAsset` 短路生成。 -2. `敲击音效`:音频资产槽位,支持描述生成、上传和麦克风录制,统一写回 `hitSoundAsset`。描述生成复用通用 `/api/creation/audio/sound-effect` 的 VectorEngine Vidu 音效生成、下载、OSS 私有对象、asset object 登记和 entity binding 链路;木鱼目标固定为 `entityKind='wooden_fish_work'`、`slot='hit_sound'`、`assetKind='wooden_fish_hit_sound'`、`storagePrefix='wooden_fish_assets'`,不得再返回 `410 Gone`,也不得由 `spacetime-client` 合成假音频路径。 -3. `功德有什么`:最多 8 条飘字,默认 `幸运、健康、财富、姻缘、幸福、事业、成功、功德`;创作态只保存词条名,运行态飘字展示时再追加 `+1`。 +2. `敲击音效`:音频资产槽位,当前创作阶段只支持用户上传或麦克风录制;未提供音频时统一写回内置默认木鱼音 `/wooden-fish/default-hit-sound.mp3`。提示词生成音效入口临时关闭,通用 `/api/creation/audio/sound-effect` 对木鱼 `hit_sound` 目标也返回 `410 Gone`;`hitSoundPrompt` 只作为历史兼容字段保留,不参与当前创作流程,也不得由 `spacetime-client` 合成假音频路径。 +3. `功德有什么`:最多 8 条飘字,默认 `幸运、健康、财富、姻缘、幸福、事业、成功、功德`;创作态只保存词条名,运行态飘字展示时再追加 `+1`。运行态顶部总数卡采用品牌化徽标样式,子项计数器预置展示在可展开面板中,未出现词条初始值为 0。 -图片生成链路固定为双图 image2 流程:第一步用默认木鱼图作为结构和画风参考,按用户题材关键词或参考图主题生成 `1:1` 透明底新敲击物;第二步用新敲击物作为主题和画风参考生成 `9:16` 背景环境图,背景图只适配主题和画风,不能包含新敲击物本体,也不能增加木槌互动物品。两个资产分别写回 `hitObjectAsset` 与 `backgroundAsset`,并绑定到 `wooden_fish_work` 的 `hit_object` / `background` 槽位。运行态和结果页消费 `backgroundAsset` 做竖屏背景,中央再叠加 `hitObjectAsset`。 +图片生成链路固定为三图 image2 流程:第一步用默认木鱼图作为结构和画风参考,按用户题材关键词或参考图主题生成 `1:1` 绿色背景主体图(纯绿色绿幕),prompt 必须显式要求背景为单一纯绿色 `#00FF00` 且平整无纹理、无渐变、无阴影、无道具,主体完整居中,且禁止黑底、白底、棋盘格和任何实底背景;后端在落库前只对这张绿幕主体图执行去绿背景处理,不做泛抠图,避免误伤玉米等主体像素。第二步必须使用第一步抠图完成后的透明图作为参考图,再用新敲击物作为主题和画风参考生成 `9:16` 背景环境图,背景图只适配主题和画风,不能包含新敲击物本体,也不能增加木槌互动物品;画面中央主体预留区必须干净,中央 40% 区域禁止出现主题主体、主体局部特写、轮廓影子或重复元素,主题元素只能作为外围氛围。第三步必须使用去绿后的敲击物主体图和背景环境图作为参考图生成 `1:1` 返回按钮图,返回按钮必须始终是标准圆形,中央只保留单个左箭头,参考图只约束圆形底色和箭头配色,不得延伸到复杂造型和花纹;按钮不得出现文字、数字、水印、额外 UI 面板或木槌物品。三个资产分别写回 `hitObjectAsset`、`backgroundAsset` 与 `backButtonAsset`,并绑定到 `wooden_fish_work` 的 `hit_object` / `background` / `back_button` 槽位。运行态和结果页消费 `backgroundAsset` 做竖屏背景,中央再叠加 `hitObjectAsset`,左上角返回按钮消费 `backButtonAsset`。 -运行态规则真相以后端 run 摘要为准,前端只做点击低延迟表现、敲击动画、音频播放和飘字渲染。每次非功能区点击在当前 run 内累计 `totalTapCount` 和 `wordCounters`;计数不进入账号长期账本,不做排行榜。顶部计数器仅在词条首次出现时创建,后续同词条继续累加。 +运行态规则真相以后端 run 摘要为准,前端只做点击低延迟表现、敲击动画、音频播放和飘字渲染。每次非功能区点击在当前 run 内累计 `totalTapCount` 和 `wordCounters`;计数不进入账号长期账本,不做排行榜。顶部总数卡点击后展开子项计数器面板,子项计数在面板中按词条纵列预置展示,未出现词条初始值为 0,后续同词条继续累加;运行态左上角使用主题化返回按钮图,不提供右上角重开按钮。 平台首页推荐、精选、最新、公开详情、搜索、已玩作品和公开试玩统一按 `sourceType='wooden-fish'` 与 `WF-*` 公开作品号识别敲木鱼作品;公开列表应走 `wooden_fish_gallery_card_view` 订阅缓存,公开详情或运行态启动时卡片摘要不足则补读完整 work profile。 diff --git a/packages/shared/src/contracts/woodenFish.ts b/packages/shared/src/contracts/woodenFish.ts index ae035f8f..ffb2729e 100644 --- a/packages/shared/src/contracts/woodenFish.ts +++ b/packages/shared/src/contracts/woodenFish.ts @@ -57,6 +57,7 @@ export interface WoodenFishActionRequest { hitObjectReferenceImageSrc?: string | null; hitObjectAsset?: WoodenFishImageAsset | null; backgroundAsset?: WoodenFishImageAsset | null; + backButtonAsset?: WoodenFishImageAsset | null; hitSoundPrompt?: string | null; hitSoundAsset?: WoodenFishAudioAsset | null; floatingWords?: string[] | null; @@ -80,6 +81,7 @@ export interface WoodenFishDraftResponse { floatingWords: string[]; hitObjectAsset: WoodenFishImageAsset | null; backgroundAsset: WoodenFishImageAsset | null; + backButtonAsset?: WoodenFishImageAsset | null; hitSoundAsset: WoodenFishAudioAsset | null; coverImageSrc: string | null; generationStatus: WoodenFishGenerationStatus; @@ -127,6 +129,7 @@ export interface WoodenFishWorkProfileResponse { draft: WoodenFishDraftResponse; hitObjectAsset: WoodenFishImageAsset; backgroundAsset: WoodenFishImageAsset | null; + backButtonAsset: WoodenFishImageAsset | null; hitSoundAsset: WoodenFishAudioAsset; floatingWords: string[]; } diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-bean.png b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-bean.png deleted file mode 100644 index e329f426..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-bean.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-bean.svg b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-bean.svg deleted file mode 100644 index d34d831e..00000000 --- a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-bean.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-seed.png b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-seed.png deleted file mode 100644 index b204cdcb..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-seed.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-seed.svg b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-seed.svg deleted file mode 100644 index 83afaa50..00000000 --- a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-clay-seed.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-dot-face.png b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-dot-face.png deleted file mode 100644 index 8c2a2c71..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-dot-face.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-dot-face.svg b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-dot-face.svg deleted file mode 100644 index 28dfbae7..00000000 --- a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-dot-face.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-mold-baby.png b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-mold-baby.png deleted file mode 100644 index 232354cd..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-mold-baby.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-mold-baby.svg b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-mold-baby.svg deleted file mode 100644 index 8e8663cc..00000000 --- a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-mold-baby.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-soft-totem.png b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-soft-totem.png deleted file mode 100644 index fa6b72cd..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-soft-totem.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-soft-totem.svg b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-soft-totem.svg deleted file mode 100644 index 12507cfc..00000000 --- a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-soft-totem.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-work-puppet.png b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-work-puppet.png deleted file mode 100644 index e066e780..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-work-puppet.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-work-puppet.svg b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-work-puppet.svg deleted file mode 100644 index cdbce26f..00000000 --- a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-abstract-mascot-work-puppet.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-logo-abstract-mascot-contact-sheet.png b/public/branding/taonier-logo-abstract-mascot-concepts/taonier-logo-abstract-mascot-contact-sheet.png deleted file mode 100644 index ed90840b..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-concepts/taonier-logo-abstract-mascot-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-clay-pocket-token.png b/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-clay-pocket-token.png deleted file mode 100644 index 8d5c2341..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-clay-pocket-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-clay-spirit-glyph.png b/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-clay-spirit-glyph.png deleted file mode 100644 index cc632ad9..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-clay-spirit-glyph.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-mold-blob-companion.png b/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-mold-blob-companion.png deleted file mode 100644 index c94a4883..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-mold-blob-companion.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-pinched-seed-mascot.png b/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-pinched-seed-mascot.png deleted file mode 100644 index aa532f78..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-pinched-seed-mascot.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-soft-totem-creature.png b/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-soft-totem-creature.png deleted file mode 100644 index eff2d606..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-soft-totem-creature.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-work-core-puppet.png b/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-work-core-puppet.png deleted file mode 100644 index 15c01392..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-image2-work-core-puppet.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-logo-abstract-mascot-image2-contact-sheet.png b/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-logo-abstract-mascot-image2-contact-sheet.png deleted file mode 100644 index fd7e6242..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-image2-concepts/taonier-logo-abstract-mascot-image2-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-logo-abstract-mascot-minimal-contact-sheet.png b/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-logo-abstract-mascot-minimal-contact-sheet.png deleted file mode 100644 index 64265b7b..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-logo-abstract-mascot-minimal-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-clay-core.png b/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-clay-core.png deleted file mode 100644 index ebdb8271..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-clay-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-clay-token.png b/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-clay-token.png deleted file mode 100644 index ec9e5b81..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-clay-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-mold-bud.png b/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-mold-bud.png deleted file mode 100644 index c4821821..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-mold-bud.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-seed-glyph.png b/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-seed-glyph.png deleted file mode 100644 index 02382e2a..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-minimal-concepts/taonier-minimal-seed-glyph.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-orb.png b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-orb.png deleted file mode 100644 index d7f955b9..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-orb.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-orb.svg b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-orb.svg deleted file mode 100644 index e750a4f6..00000000 --- a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-orb.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-sprite.png b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-sprite.png deleted file mode 100644 index d30d257f..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-sprite.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-sprite.svg b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-sprite.svg deleted file mode 100644 index 7cccc846..00000000 --- a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-clay-sprite.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-pinch-orbit.png b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-pinch-orbit.png deleted file mode 100644 index 2ebd29f3..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-pinch-orbit.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-pinch-orbit.svg b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-pinch-orbit.svg deleted file mode 100644 index 1868c073..00000000 --- a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-pinch-orbit.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-seed-totem.png b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-seed-totem.png deleted file mode 100644 index 64130ad6..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-seed-totem.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-seed-totem.svg b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-seed-totem.svg deleted file mode 100644 index 2c2a9848..00000000 --- a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-seed-totem.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-soft-mold.png b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-soft-mold.png deleted file mode 100644 index de237d1b..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-soft-mold.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-soft-mold.svg b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-soft-mold.svg deleted file mode 100644 index b5f0bc73..00000000 --- a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-soft-mold.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-work-glyph.png b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-work-glyph.png deleted file mode 100644 index 18ee0410..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-work-glyph.png and /dev/null differ diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-work-glyph.svg b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-work-glyph.svg deleted file mode 100644 index b403b89f..00000000 --- a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-abstract-mascot-v2-work-glyph.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-logo-abstract-mascot-v2-contact-sheet.png b/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-logo-abstract-mascot-v2-contact-sheet.png deleted file mode 100644 index aef75e68..00000000 Binary files a/public/branding/taonier-logo-abstract-mascot-v2-concepts/taonier-logo-abstract-mascot-v2-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-app-token.png b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-app-token.png deleted file mode 100644 index 189c193d..00000000 Binary files a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-app-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-app-token.svg b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-app-token.svg deleted file mode 100644 index 60c5380f..00000000 --- a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-app-token.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-clay-drop.png b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-clay-drop.png deleted file mode 100644 index 75427ba3..00000000 Binary files a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-clay-drop.png and /dev/null differ diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-clay-drop.svg b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-clay-drop.svg deleted file mode 100644 index 85836184..00000000 --- a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-clay-drop.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-core.png b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-core.png deleted file mode 100644 index 221ab801..00000000 Binary files a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-core.svg b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-core.svg deleted file mode 100644 index fa315c43..00000000 --- a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-core.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-creation-base.png b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-creation-base.png deleted file mode 100644 index f6455307..00000000 Binary files a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-creation-base.png and /dev/null differ diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-creation-base.svg b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-creation-base.svg deleted file mode 100644 index 2a526a39..00000000 --- a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-creation-base.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-soft-slab.png b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-soft-slab.png deleted file mode 100644 index b95f6d77..00000000 Binary files a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-soft-slab.png and /dev/null differ diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-soft-slab.svg b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-soft-slab.svg deleted file mode 100644 index 945b0e32..00000000 --- a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-soft-slab.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-work-stack.png b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-work-stack.png deleted file mode 100644 index 799de34c..00000000 Binary files a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-work-stack.png and /dev/null differ diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-work-stack.svg b/public/branding/taonier-logo-anchor-concepts/taonier-anchor-work-stack.svg deleted file mode 100644 index 78fde2f0..00000000 --- a/public/branding/taonier-logo-anchor-concepts/taonier-anchor-work-stack.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/public/branding/taonier-logo-anchor-concepts/taonier-logo-anchor-contact-sheet.png b/public/branding/taonier-logo-anchor-concepts/taonier-logo-anchor-contact-sheet.png deleted file mode 100644 index 1a9f0f77..00000000 Binary files a/public/branding/taonier-logo-anchor-concepts/taonier-logo-anchor-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-01-matte-clay-stamp.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-01-matte-clay-stamp.png deleted file mode 100644 index 0209b888..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-01-matte-clay-stamp.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-02-kiln-mark-core.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-02-kiln-mark-core.png deleted file mode 100644 index c7030159..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-02-kiln-mark-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-03-cutout-negative-star.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-03-cutout-negative-star.png deleted file mode 100644 index c0e800de..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-03-cutout-negative-star.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-04-dry-clay-grain.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-04-dry-clay-grain.png deleted file mode 100644 index c98ccf3a..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-04-dry-clay-grain.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-05-hand-pressed-token.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-05-hand-pressed-token.png deleted file mode 100644 index afffd04d..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-05-hand-pressed-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-06-digital-clay-glyph.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-06-digital-clay-glyph.png deleted file mode 100644 index 47c8e465..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-06-digital-clay-glyph.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-07-premium-flat-mark.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-07-premium-flat-mark.png deleted file mode 100644 index 39db1d7e..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-07-premium-flat-mark.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-08-monochrome-proof.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-08-monochrome-proof.png deleted file mode 100644 index 285a1828..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-anti-candy-08-monochrome-proof.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-logo-anti-candy-contact-sheet.png b/public/branding/taonier-logo-anti-candy-concepts/taonier-logo-anti-candy-contact-sheet.png deleted file mode 100644 index fa9cfd8f..00000000 Binary files a/public/branding/taonier-logo-anti-candy-concepts/taonier-logo-anti-candy-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-anti-candy-concepts/taonier-logo-anti-candy-manifest.json b/public/branding/taonier-logo-anti-candy-concepts/taonier-logo-anti-candy-manifest.json deleted file mode 100644 index 0b4c3d76..00000000 --- a/public/branding/taonier-logo-anti-candy-concepts/taonier-logo-anti-candy-manifest.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T18:03:02.694Z", - "creativeDirection": { - "name": "陶泥儿反糖果化脑洞泥印图形标", - "textPolicy": "no Chinese, no English, no wordmark", - "palette": "灰米白、陶土白、陶土褐、深泥灰、少量暗金土黄", - "motif": "哑光软方圆陶泥印章 + 星核凹印/负形 + 极少量刻点", - "antiCandyRules": "no glossy highlight, no cream filling, no jelly, no cookie, no chocolate, no candy star" - }, - "variants": [ - { - "id": "01-matte-clay-stamp", - "title": "哑光陶泥印章", - "file": "taonier-anti-candy-01-matte-clay-stamp.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:最克制的陶泥印章。灰米白软方圆主体,中间是压进去的暗陶土星核凹印,只有 2 个微小刻点。几乎无高光。" - }, - { - "id": "02-kiln-mark-core", - "title": "窑印星核", - "file": "taonier-anti-candy-02-kiln-mark-core.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:窑印感。中间星核像烧陶后的浅浮雕窑印,用深泥灰边缘和陶土褐阴影表现,不要任何金属或糖果光泽。" - }, - { - "id": "03-cutout-negative-star", - "title": "负形星核", - "file": "taonier-anti-candy-03-cutout-negative-star.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:负形。星核用干净的镂空负形或深泥灰内孔表达,主体是单块哑光陶泥,整体更像可注册商标图形。" - }, - { - "id": "04-dry-clay-grain", - "title": "干陶颗粒", - "file": "taonier-anti-candy-04-dry-clay-grain.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:干陶质感。加入非常细微的陶土颗粒和粉陶纹理,但保持扁平图标,不要照片写实,不要脏乱。" - }, - { - "id": "05-hand-pressed-token", - "title": "手压泥币", - "file": "taonier-anti-candy-05-hand-pressed-token.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:手压泥币。像一枚被手工压平的陶泥代币,边缘不完全对称,中间星核为凹刻符号,但不要出现手或工具。" - }, - { - "id": "06-digital-clay-glyph", - "title": "数字泥符", - "file": "taonier-anti-candy-06-digital-clay-glyph.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:AI 与 UGC 暗示更强。用 3 个极小方形刻点围绕星核,像生成节点,但必须像刻在陶泥上的小孔。" - }, - { - "id": "07-premium-flat-mark", - "title": "精品扁平标", - "file": "taonier-anti-candy-07-premium-flat-mark.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:更互联网精品。减少纹理,强化几何平衡和负形,灰米白主体、深泥灰星核、陶土褐小刻痕,适合 App 图标。" - }, - { - "id": "08-monochrome-proof", - "title": "单色验证版", - "file": "taonier-anti-candy-08-monochrome-proof.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须反糖果化:第一眼必须像哑光陶泥、泥章、窑印、创作印记,绝对不能像糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力或食品包装。\n核心隐喻:脑洞泥印。一块被轻轻捏平的不规则软方圆陶泥印章,中间有一个抽象星核凹印或镂空星形泥印,表达灵感被压印成作品。\n风格:扁平矢量商标为主,低高光、低饱和、哑光粉陶质感;轮廓清楚,可后续矢量化,适合商标、App 图标、社区头像。\n主色:灰米白、未经上釉的陶土白、陶土褐、深泥灰、少量暗金土黄;颜色必须干燥、克制、低甜度。不使用亮金、糖果黄、奶油黄、粉色、青色、蓝色、紫色、荧光色或彩虹色。\n形态:保留不规则软方圆,但不要鼓胀、不要胶状、不要可食用的圆润光泽。边缘可以有少量粗糙泥料纹理、压痕、手捏不均匀。\n数字感:只允许 2 到 3 个很小的深泥灰或暗土黄刻点,像生成节点或 UGC 扩散点;不要闪亮星星,不要糖珠。\n构图:正方形画布,居中图形标,干净浅灰米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和中间星核凹印。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、旋涡环形旧稿、三色花瓣旧稿。\n强禁止食品感:不要 glossy 高光、不要果冻质感、不要奶油夹心、不要糖霜、不要撒糖粒、不要饼干边、不要巧克力流心、不要金色膨胀星糖。\n本张重点:黑白商标验证。尽量用单色深浅关系表达软方圆和星核凹印,减少装饰,确保黑白化后轮廓仍成立。" - } - ] -} diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-01-minimal-braincore.png b/public/branding/taonier-logo-braincore-concepts/taonier-braincore-01-minimal-braincore.png deleted file mode 100644 index 99674899..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-01-minimal-braincore.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-02-soft-square-clay-seal.png b/public/branding/taonier-logo-braincore-concepts/taonier-braincore-02-soft-square-clay-seal.png deleted file mode 100644 index d8f385df..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-02-soft-square-clay-seal.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-03-warm-brown-embedded-core.png b/public/branding/taonier-logo-braincore-concepts/taonier-braincore-03-warm-brown-embedded-core.png deleted file mode 100644 index f821f583..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-03-warm-brown-embedded-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-04-subtle-pinch-marks.png b/public/branding/taonier-logo-braincore-concepts/taonier-braincore-04-subtle-pinch-marks.png deleted file mode 100644 index 0b106a60..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-04-subtle-pinch-marks.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-05-premium-geometric-balance.png b/public/branding/taonier-logo-braincore-concepts/taonier-braincore-05-premium-geometric-balance.png deleted file mode 100644 index 9292cbe7..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-05-premium-geometric-balance.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-06-soft-clay-texture.png b/public/branding/taonier-logo-braincore-concepts/taonier-braincore-06-soft-clay-texture.png deleted file mode 100644 index aa717de5..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-06-soft-clay-texture.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-07-app-icon-ready.png b/public/branding/taonier-logo-braincore-concepts/taonier-braincore-07-app-icon-ready.png deleted file mode 100644 index 9994dc61..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-07-app-icon-ready.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-08-trademark-monochrome-ready.png b/public/branding/taonier-logo-braincore-concepts/taonier-braincore-08-trademark-monochrome-ready.png deleted file mode 100644 index d9758eba..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-braincore-08-trademark-monochrome-ready.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-logo-braincore-contact-sheet.png b/public/branding/taonier-logo-braincore-concepts/taonier-logo-braincore-contact-sheet.png deleted file mode 100644 index 6bdf198a..00000000 Binary files a/public/branding/taonier-logo-braincore-concepts/taonier-logo-braincore-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-braincore-concepts/taonier-logo-braincore-manifest.json b/public/branding/taonier-logo-braincore-concepts/taonier-logo-braincore-manifest.json deleted file mode 100644 index 5fba5f9c..00000000 --- a/public/branding/taonier-logo-braincore-concepts/taonier-logo-braincore-manifest.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T17:45:55.245Z", - "creativeDirection": { - "name": "陶泥儿脑洞星核图形标", - "textPolicy": "no Chinese, no English, no wordmark", - "palette": "奶白、米白、暖棕、陶土棕、少量暖金", - "motif": "不规则软方圆陶泥团 + 脑洞星核 + 极少量星点" - }, - "variants": [ - { - "id": "01-minimal-braincore", - "title": "极简脑洞星核", - "file": "taonier-braincore-01-minimal-braincore.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:极简。只保留一个奶白不规则软方圆陶泥主体、一个居中的暖金四角星核、2 个极小暖金星点。不要额外装饰。" - }, - { - "id": "02-soft-square-clay-seal", - "title": "软方圆陶泥印记", - "file": "taonier-braincore-02-soft-square-clay-seal.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:陶泥印记。主体像被轻轻按压成型的软方圆印章,边缘有自然手捏起伏,但不能像儿童玩具。星核略微偏心。" - }, - { - "id": "03-warm-brown-embedded-core", - "title": "暖棕星核嵌入", - "file": "taonier-braincore-03-warm-brown-embedded-core.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:嵌入感。用暖棕内凹形或陶土棕阴影承托暖金星核,像灵感被嵌进陶泥里,仍保持扁平商标质感。" - }, - { - "id": "04-subtle-pinch-marks", - "title": "轻微捏痕版本", - "file": "taonier-braincore-04-subtle-pinch-marks.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:捏痕。在陶泥主体边缘加入 2 到 3 个极轻微暖棕捏痕或凹口,表现可塑性;捏痕必须抽象、克制、可矢量化。" - }, - { - "id": "05-premium-geometric-balance", - "title": "精品几何比例", - "file": "taonier-braincore-05-premium-geometric-balance.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:精品比例。整体更接近高级互联网 App 图标,几何平衡、负形干净、软方圆轮廓稳定,陶泥质感只保留一点点。" - }, - { - "id": "06-soft-clay-texture", - "title": "柔软陶泥质感", - "file": "taonier-braincore-06-soft-clay-texture.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:柔软质感。在不破坏扁平矢量感的前提下,加入细腻奶油陶泥的微妙高光和暖棕渐层,不能变成 3D 玩具。" - }, - { - "id": "07-app-icon-ready", - "title": "App 图标优先", - "file": "taonier-braincore-07-app-icon-ready.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:App 图标。图形占画面约 72%,轮廓饱满有记忆点,星核清晰醒目,适合放入圆角方形 App icon。" - }, - { - "id": "08-trademark-monochrome-ready", - "title": "商标黑白提炼", - "file": "taonier-braincore-08-trademark-monochrome-ready.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n核心隐喻:脑洞星核。一团奶白色、暖棕色调的不规则软方圆陶泥包裹一枚暖金色创意星核,表达灵感被捏造成型。\n风格:扁平矢量商标为主,带非常轻微的软陶质感;结构简洁、边缘柔和、轮廓清晰,适合商标、App 图标、社区头像。\n主色:奶白、米白、暖棕、陶土棕、少量暖金;整体温暖高级,不使用粉色、青色、蓝色、紫色、荧光色或彩虹色。\n数字感:只允许在星核周围出现 2 到 4 个极小暖金星点或像素点,暗示 AI 生成、UGC 传播和轻游戏趣味。\n构图:正方形画布,居中图形标,干净浅米白背景,留足安全边距;缩小到 64px 时仍能看清软方圆轮廓和星核。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、儿童黏土玩具感、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标、拟物甜品感。\n必须保持全新构图,不参考任何既有陶泥儿 logo 方案,不做旋涡环形旧稿,不做三色花瓣旧稿。\n本张重点:商标注册。优先保证黑白化后仍清楚,减少渐变和细节,用奶白主体、暖棕负形和暖金星核形成强轮廓。" - } - ] -} diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-01-closed-curve-mark.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-01-closed-curve-mark.png deleted file mode 100644 index 35ef5de9..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-01-closed-curve-mark.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-02-friendly-geo-seed.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-02-friendly-geo-seed.png deleted file mode 100644 index 9678ad88..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-02-friendly-geo-seed.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-03-premium-soft-contour.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-03-premium-soft-contour.png deleted file mode 100644 index bfbeedbc..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-03-premium-soft-contour.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-04-playful-closed-tile.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-04-playful-closed-tile.png deleted file mode 100644 index 513ff218..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-04-playful-closed-tile.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-05-monochrome-first.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-05-monochrome-first.png deleted file mode 100644 index 0f3fac18..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-05-monochrome-first.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-06-digital-clay-accent.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-06-digital-clay-accent.png deleted file mode 100644 index f096d762..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-06-digital-clay-accent.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-07-compact-avatar-symbol.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-07-compact-avatar-symbol.png deleted file mode 100644 index 77a78203..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-07-compact-avatar-symbol.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-08-designer-vector-ready.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-08-designer-vector-ready.png deleted file mode 100644 index 982814f4..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-08-designer-vector-ready.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-contact-sheet.png b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-contact-sheet.png deleted file mode 100644 index 10d4d76a..00000000 Binary files a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-manifest.json b/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-manifest.json deleted file mode 100644 index 6a013631..00000000 --- a/public/branding/taonier-logo-brief-concepts/taonier-logo-brief-manifest.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T20:18:49.419Z", - "logoSkillSummary": { - "requiredReview": "visual inspection, 32px readability, black-white viability", - "outputStatus": "AI concept only; final logo needs vector cleanup" - }, - "brief": { - "brand": "陶泥儿", - "logoType": "symbol/icon-only mark, no wordmark", - "product": "AI UGC 轻休闲小游戏创作与传播平台,用户像捏陶泥一样把脑洞、梗和灵感塑造成作品", - "personality": [ - "亲和", - "精品", - "创作感", - "轻松", - "年轻", - "有传播记忆点" - ], - "mustHave": [ - "闭合不规则几何底盘", - "外轮廓由流畅曲线组成", - "整体是一个完整符号而不是自由飘带", - "32px 仍能识别", - "黑白化后仍成立", - "无中文、无英文、无字标" - ], - "avoid": [ - "整体方形或圆角方块", - "中心星星或任何星形", - "自由飘带、旋涡、S/G 字母感", - "巧克力面包、甜点、饼干、糖果等食物感", - "砖块、土块、泥饼、陶片、考古印章", - "脸、表情、吉祥物、手、工具" - ] - }, - "variants": [ - { - "id": "01-closed-curve-mark", - "title": "闭合曲线标", - "file": "taonier-logo-brief-01-closed-curve-mark.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: the cleanest closed irregular curve mark. Use two large color areas separated by one smooth internal curve. Maximize 32px readability." - }, - { - "id": "02-friendly-geo-seed", - "title": "亲和几何种", - "file": "taonier-logo-brief-02-friendly-geo-seed.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: a friendly seed-like closed geometric base, but not a literal seed, not food. Rounded and approachable with one teal accent curve." - }, - { - "id": "03-premium-soft-contour", - "title": "精品软轮廓", - "file": "taonier-logo-brief-03-premium-soft-contour.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: premium, calm, fewer colors. Strong outer contour with a dark mud-gray internal negative curve. Very logo-like, not illustrative." - }, - { - "id": "04-playful-closed-tile", - "title": "轻玩闭合片", - "file": "taonier-logo-brief-04-playful-closed-tile.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: a more playful closed irregular tile with warm terracotta and ceramic white. The internal curve should suggest creation flow, not filling." - }, - { - "id": "05-monochrome-first", - "title": "黑白优先", - "file": "taonier-logo-brief-05-monochrome-first.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: design as if it will be converted to black and white. Use bold positive and negative shapes; color only supports the structure." - }, - { - "id": "06-digital-clay-accent", - "title": "数字陶泥点", - "file": "taonier-logo-brief-06-digital-clay-accent.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: include at most two tiny geometric accent dots or notches that imply AI/UGC, but they must not look like candy sprinkles or decorative confetti." - }, - { - "id": "07-compact-avatar-symbol", - "title": "头像紧凑标", - "file": "taonier-logo-brief-07-compact-avatar-symbol.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: compact social-avatar readability. The closed contour should be slightly fuller and more iconic, but not a rounded-square app background." - }, - { - "id": "08-designer-vector-ready", - "title": "矢量定稿感", - "file": "taonier-logo-brief-08-designer-vector-ready.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand personality: friendly, premium, creative, lightweight, young, memorable, suitable for an AI UGC casual game creation platform.\nCore metaphor: users shape imagination like clay. The logo should communicate soft creative material becoming a refined digital product symbol.\nLogo type: abstract symbol/icon only. Not an emblem with text, not a mascot, not an app-icon rounded-square background.\nMain element: one closed irregular geometric base shape made from smooth flowing curves. The outer contour must be closed, continuous, recognizable, organic, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, or loose strip. It should feel like a refined custom symbol with 5-7 soft curve turns.\nInternal design: use only 1-2 broad smooth curve partitions or negative-shape cuts to make the mark memorable. No center icon inserted. No star, no spark, no hole shaped like a star.\nStyle: modern minimalist vector logo with very subtle matte clay warmth. Clean edges, broad shapes, high contrast, no tiny details. It must look good and recognizable at 32px favicon size.\nColor: warm ceramic white, light terracotta, clay orange, warm brown, with optional small low-saturation teal, indigo-gray, or dark mud gray accent. Avoid sweet candy colors. No glossy highlights.\nFood avoidance is critical: the mark must not look like bread, chocolate bread, croissant, pastry, cookie, candy, donut, cream filling, sauce, baked dough, dessert, or food packaging.\nMaterial avoidance: do not make it look like brick, dirt clod, mud pie, pottery shard, stone, archaeological stamp, or rough handmade craft class object.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the large shape should be recognizable at 32px.\nVariant focus: make it look like a designer-ready vector concept: 2-3 flat shapes, crisp boundaries, distinctive closed outer contour, minimal material texture." - } - ] -} diff --git a/public/branding/taonier-logo-broad-concepts/taonier-broad-creation-spark.png b/public/branding/taonier-logo-broad-concepts/taonier-broad-creation-spark.png deleted file mode 100644 index 163fc3b3..00000000 Binary files a/public/branding/taonier-logo-broad-concepts/taonier-broad-creation-spark.png and /dev/null differ diff --git a/public/branding/taonier-logo-broad-concepts/taonier-broad-game-mold.png b/public/branding/taonier-logo-broad-concepts/taonier-broad-game-mold.png deleted file mode 100644 index 619b54f1..00000000 Binary files a/public/branding/taonier-logo-broad-concepts/taonier-broad-game-mold.png and /dev/null differ diff --git a/public/branding/taonier-logo-broad-concepts/taonier-broad-soft-portal.png b/public/branding/taonier-logo-broad-concepts/taonier-broad-soft-portal.png deleted file mode 100644 index 6442e7c4..00000000 Binary files a/public/branding/taonier-logo-broad-concepts/taonier-broad-soft-portal.png and /dev/null differ diff --git a/public/branding/taonier-logo-broad-concepts/taonier-broad-soft-totem.png b/public/branding/taonier-logo-broad-concepts/taonier-broad-soft-totem.png deleted file mode 100644 index b1ec5c3f..00000000 Binary files a/public/branding/taonier-logo-broad-concepts/taonier-broad-soft-totem.png and /dev/null differ diff --git a/public/branding/taonier-logo-broad-concepts/taonier-broad-work-embryo.png b/public/branding/taonier-logo-broad-concepts/taonier-broad-work-embryo.png deleted file mode 100644 index 6239fcc2..00000000 Binary files a/public/branding/taonier-logo-broad-concepts/taonier-broad-work-embryo.png and /dev/null differ diff --git a/public/branding/taonier-logo-broad-concepts/taonier-logo-broad-contact-sheet.png b/public/branding/taonier-logo-broad-concepts/taonier-logo-broad-contact-sheet.png deleted file mode 100644 index f57edfe7..00000000 Binary files a/public/branding/taonier-logo-broad-concepts/taonier-logo-broad-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-creator-totem.png b/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-creator-totem.png deleted file mode 100644 index 99c54fc5..00000000 Binary files a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-creator-totem.png and /dev/null differ diff --git a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-figurine-token.png b/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-figurine-token.png deleted file mode 100644 index 6b340f6f..00000000 Binary files a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-figurine-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-idol-mask.png b/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-idol-mask.png deleted file mode 100644 index 8f79f462..00000000 Binary files a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-idol-mask.png and /dev/null differ diff --git a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-little-maker.png b/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-little-maker.png deleted file mode 100644 index 889e2ba1..00000000 Binary files a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-little-maker.png and /dev/null differ diff --git a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-pocket-figure.png b/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-pocket-figure.png deleted file mode 100644 index fdc93722..00000000 Binary files a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-pocket-figure.png and /dev/null differ diff --git a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-soft-doll.png b/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-soft-doll.png deleted file mode 100644 index cd1dc043..00000000 Binary files a/public/branding/taonier-logo-clay-mascot-concepts/taonier-clay-mascot-soft-doll.png and /dev/null differ diff --git a/public/branding/taonier-logo-clay-mascot-concepts/taonier-logo-clay-mascot-contact-sheet.png b/public/branding/taonier-logo-clay-mascot-concepts/taonier-logo-clay-mascot-contact-sheet.png deleted file mode 100644 index c5372711..00000000 Binary files a/public/branding/taonier-logo-clay-mascot-concepts/taonier-logo-clay-mascot-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-01-organic-closed-badge.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-01-organic-closed-badge.png deleted file mode 100644 index c0c2efd3..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-01-organic-closed-badge.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-02-smooth-clay-shield.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-02-smooth-clay-shield.png deleted file mode 100644 index f25bea89..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-02-smooth-clay-shield.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-03-asymmetric-pebble-glyph.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-03-asymmetric-pebble-glyph.png deleted file mode 100644 index 9a2fe06a..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-03-asymmetric-pebble-glyph.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-04-inlaid-curve-plate.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-04-inlaid-curve-plate.png deleted file mode 100644 index 9337dc00..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-04-inlaid-curve-plate.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-05-flat-vector-symbol.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-05-flat-vector-symbol.png deleted file mode 100644 index 31a79304..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-05-flat-vector-symbol.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-06-friendly-solid-form.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-06-friendly-solid-form.png deleted file mode 100644 index 8e90a44e..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-06-friendly-solid-form.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-07-digital-clay-panel.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-07-digital-clay-panel.png deleted file mode 100644 index 26c06170..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-07-digital-clay-panel.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-08-trademark-ready-contour.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-08-trademark-ready-contour.png deleted file mode 100644 index 2c250fe3..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-closed-geo-08-trademark-ready-contour.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-logo-closed-geo-contact-sheet.png b/public/branding/taonier-logo-closed-geo-concepts/taonier-logo-closed-geo-contact-sheet.png deleted file mode 100644 index e1f291be..00000000 Binary files a/public/branding/taonier-logo-closed-geo-concepts/taonier-logo-closed-geo-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-closed-geo-concepts/taonier-logo-closed-geo-manifest.json b/public/branding/taonier-logo-closed-geo-concepts/taonier-logo-closed-geo-manifest.json deleted file mode 100644 index a7ef4ecd..00000000 --- a/public/branding/taonier-logo-closed-geo-concepts/taonier-logo-closed-geo-manifest.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T18:57:38.302Z", - "creativeDirection": { - "name": "陶泥儿闭合不规则几何底盘图形标", - "textPolicy": "no Chinese, no English, no wordmark", - "correction": "closed irregular smooth geometry, not free ribbon, not food, not square base", - "motif": "闭合曲线几何底盘 + 内部曲线分区 + 轻陶泥温度" - }, - "variants": [ - { - "id": "01-organic-closed-badge", - "title": "有机闭合徽形", - "file": "taonier-closed-geo-01-organic-closed-badge.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次的核心要求:底盘必须是由流畅曲线组成的「闭合不规则几何体图案」。它要像一个完整的品牌徽形轮廓,而不是自由飘带、旋涡、S 形、G 形、开放环或散开的泥条。\n外轮廓:闭合、连续、平滑、非方形、非圆形、非椭圆、非圆角方块。可以有 5 到 7 个柔和转折点,像自然捏出来的抽象几何石/软陶徽形,但必须干净、可矢量化。\n内部结构:可以用 1 到 2 条平滑曲线切分色块或形成负形,但内部结构必须服务整体闭合底盘,不能出现中心星星、中心洞、脸、眼睛、嘴巴或角色感。\n识别方向:通过闭合外轮廓和内部曲线分区形成记忆点,不靠星形、不靠文字、不靠食物质感。远看要像互联网产品 logo。\n材质与风格:现代扁平矢量商标,极轻微陶泥温度;低高光、低拟物、干净边缘。不要 3D 面包感,不要巧克力、面团、糕点、糖果、饼干或烘焙质感。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主体;允许少量低饱和孔雀青、靛蓝灰或深泥灰作为内部曲线色块,占比 6% 到 15%。整体要温暖、有吸引力,但不甜、不像食品。\n构图:正方形画布,居中图形标,图形占画面约 68% 到 76%,干净浅色背景,留足安全边距。缩小到 64px 时仍能看出闭合外轮廓和内部曲线分区。\n强禁止:自由飘带、开口环、旋涡、S 形、G 形、云朵、面包、巧克力面包、可颂、甜甜圈、糖果、饼干、糕点、奶油、夹心、亮油高光、烘焙纹理、食物摄影感。\n强禁止:整体方形底、圆角方块、中心星星、任何星形、闪光、徽章文字、印章文字、脸、表情、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:最基础的闭合不规则几何体。暖陶白主体,陶土橙内部曲线切分,外轮廓像柔和抽象鹅卵石但不是圆形。" - }, - { - "id": "02-smooth-clay-shield", - "title": "柔曲陶盾", - "file": "taonier-closed-geo-02-smooth-clay-shield.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次的核心要求:底盘必须是由流畅曲线组成的「闭合不规则几何体图案」。它要像一个完整的品牌徽形轮廓,而不是自由飘带、旋涡、S 形、G 形、开放环或散开的泥条。\n外轮廓:闭合、连续、平滑、非方形、非圆形、非椭圆、非圆角方块。可以有 5 到 7 个柔和转折点,像自然捏出来的抽象几何石/软陶徽形,但必须干净、可矢量化。\n内部结构:可以用 1 到 2 条平滑曲线切分色块或形成负形,但内部结构必须服务整体闭合底盘,不能出现中心星星、中心洞、脸、眼睛、嘴巴或角色感。\n识别方向:通过闭合外轮廓和内部曲线分区形成记忆点,不靠星形、不靠文字、不靠食物质感。远看要像互联网产品 logo。\n材质与风格:现代扁平矢量商标,极轻微陶泥温度;低高光、低拟物、干净边缘。不要 3D 面包感,不要巧克力、面团、糕点、糖果、饼干或烘焙质感。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主体;允许少量低饱和孔雀青、靛蓝灰或深泥灰作为内部曲线色块,占比 6% 到 15%。整体要温暖、有吸引力,但不甜、不像食品。\n构图:正方形画布,居中图形标,图形占画面约 68% 到 76%,干净浅色背景,留足安全边距。缩小到 64px 时仍能看出闭合外轮廓和内部曲线分区。\n强禁止:自由飘带、开口环、旋涡、S 形、G 形、云朵、面包、巧克力面包、可颂、甜甜圈、糖果、饼干、糕点、奶油、夹心、亮油高光、烘焙纹理、食物摄影感。\n强禁止:整体方形底、圆角方块、中心星星、任何星形、闪光、徽章文字、印章文字、脸、表情、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:更稳定的品牌底盘。外轮廓略像柔化盾形或种子形,但没有尖角;内部一条孔雀青曲线增加识别度。" - }, - { - "id": "03-asymmetric-pebble-glyph", - "title": "非对称陶符", - "file": "taonier-closed-geo-03-asymmetric-pebble-glyph.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次的核心要求:底盘必须是由流畅曲线组成的「闭合不规则几何体图案」。它要像一个完整的品牌徽形轮廓,而不是自由飘带、旋涡、S 形、G 形、开放环或散开的泥条。\n外轮廓:闭合、连续、平滑、非方形、非圆形、非椭圆、非圆角方块。可以有 5 到 7 个柔和转折点,像自然捏出来的抽象几何石/软陶徽形,但必须干净、可矢量化。\n内部结构:可以用 1 到 2 条平滑曲线切分色块或形成负形,但内部结构必须服务整体闭合底盘,不能出现中心星星、中心洞、脸、眼睛、嘴巴或角色感。\n识别方向:通过闭合外轮廓和内部曲线分区形成记忆点,不靠星形、不靠文字、不靠食物质感。远看要像互联网产品 logo。\n材质与风格:现代扁平矢量商标,极轻微陶泥温度;低高光、低拟物、干净边缘。不要 3D 面包感,不要巧克力、面团、糕点、糖果、饼干或烘焙质感。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主体;允许少量低饱和孔雀青、靛蓝灰或深泥灰作为内部曲线色块,占比 6% 到 15%。整体要温暖、有吸引力,但不甜、不像食品。\n构图:正方形画布,居中图形标,图形占画面约 68% 到 76%,干净浅色背景,留足安全边距。缩小到 64px 时仍能看出闭合外轮廓和内部曲线分区。\n强禁止:自由飘带、开口环、旋涡、S 形、G 形、云朵、面包、巧克力面包、可颂、甜甜圈、糖果、饼干、糕点、奶油、夹心、亮油高光、烘焙纹理、食物摄影感。\n强禁止:整体方形底、圆角方块、中心星星、任何星形、闪光、徽章文字、印章文字、脸、表情、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:非对称但平衡。闭合外轮廓左右不一样,有 6 个柔和转折点,内部用深泥灰负形曲线形成品牌记忆。" - }, - { - "id": "04-inlaid-curve-plate", - "title": "嵌曲陶牌", - "file": "taonier-closed-geo-04-inlaid-curve-plate.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次的核心要求:底盘必须是由流畅曲线组成的「闭合不规则几何体图案」。它要像一个完整的品牌徽形轮廓,而不是自由飘带、旋涡、S 形、G 形、开放环或散开的泥条。\n外轮廓:闭合、连续、平滑、非方形、非圆形、非椭圆、非圆角方块。可以有 5 到 7 个柔和转折点,像自然捏出来的抽象几何石/软陶徽形,但必须干净、可矢量化。\n内部结构:可以用 1 到 2 条平滑曲线切分色块或形成负形,但内部结构必须服务整体闭合底盘,不能出现中心星星、中心洞、脸、眼睛、嘴巴或角色感。\n识别方向:通过闭合外轮廓和内部曲线分区形成记忆点,不靠星形、不靠文字、不靠食物质感。远看要像互联网产品 logo。\n材质与风格:现代扁平矢量商标,极轻微陶泥温度;低高光、低拟物、干净边缘。不要 3D 面包感,不要巧克力、面团、糕点、糖果、饼干或烘焙质感。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主体;允许少量低饱和孔雀青、靛蓝灰或深泥灰作为内部曲线色块,占比 6% 到 15%。整体要温暖、有吸引力,但不甜、不像食品。\n构图:正方形画布,居中图形标,图形占画面约 68% 到 76%,干净浅色背景,留足安全边距。缩小到 64px 时仍能看出闭合外轮廓和内部曲线分区。\n强禁止:自由飘带、开口环、旋涡、S 形、G 形、云朵、面包、巧克力面包、可颂、甜甜圈、糖果、饼干、糕点、奶油、夹心、亮油高光、烘焙纹理、食物摄影感。\n强禁止:整体方形底、圆角方块、中心星星、任何星形、闪光、徽章文字、印章文字、脸、表情、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:内部嵌色曲线。像一块闭合陶牌上嵌入一条平滑色带,色带不能像馅料、巧克力或奶油夹心。" - }, - { - "id": "05-flat-vector-symbol", - "title": "扁平矢量符", - "file": "taonier-closed-geo-05-flat-vector-symbol.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次的核心要求:底盘必须是由流畅曲线组成的「闭合不规则几何体图案」。它要像一个完整的品牌徽形轮廓,而不是自由飘带、旋涡、S 形、G 形、开放环或散开的泥条。\n外轮廓:闭合、连续、平滑、非方形、非圆形、非椭圆、非圆角方块。可以有 5 到 7 个柔和转折点,像自然捏出来的抽象几何石/软陶徽形,但必须干净、可矢量化。\n内部结构:可以用 1 到 2 条平滑曲线切分色块或形成负形,但内部结构必须服务整体闭合底盘,不能出现中心星星、中心洞、脸、眼睛、嘴巴或角色感。\n识别方向:通过闭合外轮廓和内部曲线分区形成记忆点,不靠星形、不靠文字、不靠食物质感。远看要像互联网产品 logo。\n材质与风格:现代扁平矢量商标,极轻微陶泥温度;低高光、低拟物、干净边缘。不要 3D 面包感,不要巧克力、面团、糕点、糖果、饼干或烘焙质感。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主体;允许少量低饱和孔雀青、靛蓝灰或深泥灰作为内部曲线色块,占比 6% 到 15%。整体要温暖、有吸引力,但不甜、不像食品。\n构图:正方形画布,居中图形标,图形占画面约 68% 到 76%,干净浅色背景,留足安全边距。缩小到 64px 时仍能看出闭合外轮廓和内部曲线分区。\n强禁止:自由飘带、开口环、旋涡、S 形、G 形、云朵、面包、巧克力面包、可颂、甜甜圈、糖果、饼干、糕点、奶油、夹心、亮油高光、烘焙纹理、食物摄影感。\n强禁止:整体方形底、圆角方块、中心星星、任何星形、闪光、徽章文字、印章文字、脸、表情、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:最扁平、最商标化。减少材质,只用 2 到 3 个大色块形成闭合不规则几何符号,线条极简。" - }, - { - "id": "06-friendly-solid-form", - "title": "亲和实体形", - "file": "taonier-closed-geo-06-friendly-solid-form.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次的核心要求:底盘必须是由流畅曲线组成的「闭合不规则几何体图案」。它要像一个完整的品牌徽形轮廓,而不是自由飘带、旋涡、S 形、G 形、开放环或散开的泥条。\n外轮廓:闭合、连续、平滑、非方形、非圆形、非椭圆、非圆角方块。可以有 5 到 7 个柔和转折点,像自然捏出来的抽象几何石/软陶徽形,但必须干净、可矢量化。\n内部结构:可以用 1 到 2 条平滑曲线切分色块或形成负形,但内部结构必须服务整体闭合底盘,不能出现中心星星、中心洞、脸、眼睛、嘴巴或角色感。\n识别方向:通过闭合外轮廓和内部曲线分区形成记忆点,不靠星形、不靠文字、不靠食物质感。远看要像互联网产品 logo。\n材质与风格:现代扁平矢量商标,极轻微陶泥温度;低高光、低拟物、干净边缘。不要 3D 面包感,不要巧克力、面团、糕点、糖果、饼干或烘焙质感。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主体;允许少量低饱和孔雀青、靛蓝灰或深泥灰作为内部曲线色块,占比 6% 到 15%。整体要温暖、有吸引力,但不甜、不像食品。\n构图:正方形画布,居中图形标,图形占画面约 68% 到 76%,干净浅色背景,留足安全边距。缩小到 64px 时仍能看出闭合外轮廓和内部曲线分区。\n强禁止:自由飘带、开口环、旋涡、S 形、G 形、云朵、面包、巧克力面包、可颂、甜甜圈、糖果、饼干、糕点、奶油、夹心、亮油高光、烘焙纹理、食物摄影感。\n强禁止:整体方形底、圆角方块、中心星星、任何星形、闪光、徽章文字、印章文字、脸、表情、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:亲和力。闭合底盘像一个柔软、温和、完整的小世界,但不是角色、不是脸、不是食物。" - }, - { - "id": "07-digital-clay-panel", - "title": "数字陶泥面", - "file": "taonier-closed-geo-07-digital-clay-panel.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次的核心要求:底盘必须是由流畅曲线组成的「闭合不规则几何体图案」。它要像一个完整的品牌徽形轮廓,而不是自由飘带、旋涡、S 形、G 形、开放环或散开的泥条。\n外轮廓:闭合、连续、平滑、非方形、非圆形、非椭圆、非圆角方块。可以有 5 到 7 个柔和转折点,像自然捏出来的抽象几何石/软陶徽形,但必须干净、可矢量化。\n内部结构:可以用 1 到 2 条平滑曲线切分色块或形成负形,但内部结构必须服务整体闭合底盘,不能出现中心星星、中心洞、脸、眼睛、嘴巴或角色感。\n识别方向:通过闭合外轮廓和内部曲线分区形成记忆点,不靠星形、不靠文字、不靠食物质感。远看要像互联网产品 logo。\n材质与风格:现代扁平矢量商标,极轻微陶泥温度;低高光、低拟物、干净边缘。不要 3D 面包感,不要巧克力、面团、糕点、糖果、饼干或烘焙质感。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主体;允许少量低饱和孔雀青、靛蓝灰或深泥灰作为内部曲线色块,占比 6% 到 15%。整体要温暖、有吸引力,但不甜、不像食品。\n构图:正方形画布,居中图形标,图形占画面约 68% 到 76%,干净浅色背景,留足安全边距。缩小到 64px 时仍能看出闭合外轮廓和内部曲线分区。\n强禁止:自由飘带、开口环、旋涡、S 形、G 形、云朵、面包、巧克力面包、可颂、甜甜圈、糖果、饼干、糕点、奶油、夹心、亮油高光、烘焙纹理、食物摄影感。\n强禁止:整体方形底、圆角方块、中心星星、任何星形、闪光、徽章文字、印章文字、脸、表情、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:AI/UGC 暗示。闭合底盘内有 2 到 3 个很小的几何刻点或短曲线节点,但不能像电路板,也不能像撒糖。" - }, - { - "id": "08-trademark-ready-contour", - "title": "商标轮廓款", - "file": "taonier-closed-geo-08-trademark-ready-contour.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次的核心要求:底盘必须是由流畅曲线组成的「闭合不规则几何体图案」。它要像一个完整的品牌徽形轮廓,而不是自由飘带、旋涡、S 形、G 形、开放环或散开的泥条。\n外轮廓:闭合、连续、平滑、非方形、非圆形、非椭圆、非圆角方块。可以有 5 到 7 个柔和转折点,像自然捏出来的抽象几何石/软陶徽形,但必须干净、可矢量化。\n内部结构:可以用 1 到 2 条平滑曲线切分色块或形成负形,但内部结构必须服务整体闭合底盘,不能出现中心星星、中心洞、脸、眼睛、嘴巴或角色感。\n识别方向:通过闭合外轮廓和内部曲线分区形成记忆点,不靠星形、不靠文字、不靠食物质感。远看要像互联网产品 logo。\n材质与风格:现代扁平矢量商标,极轻微陶泥温度;低高光、低拟物、干净边缘。不要 3D 面包感,不要巧克力、面团、糕点、糖果、饼干或烘焙质感。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主体;允许少量低饱和孔雀青、靛蓝灰或深泥灰作为内部曲线色块,占比 6% 到 15%。整体要温暖、有吸引力,但不甜、不像食品。\n构图:正方形画布,居中图形标,图形占画面约 68% 到 76%,干净浅色背景,留足安全边距。缩小到 64px 时仍能看出闭合外轮廓和内部曲线分区。\n强禁止:自由飘带、开口环、旋涡、S 形、G 形、云朵、面包、巧克力面包、可颂、甜甜圈、糖果、饼干、糕点、奶油、夹心、亮油高光、烘焙纹理、食物摄影感。\n强禁止:整体方形底、圆角方块、中心星星、任何星形、闪光、徽章文字、印章文字、脸、表情、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:可注册轮廓。优先保证黑白化后的闭合外轮廓和内部曲线仍有辨识度,避免渐变和复杂纹理。" - } - ] -} diff --git a/public/branding/taonier-logo-concepts/taonier-clay-spark.png b/public/branding/taonier-logo-concepts/taonier-clay-spark.png deleted file mode 100644 index dddc5be4..00000000 Binary files a/public/branding/taonier-logo-concepts/taonier-clay-spark.png and /dev/null differ diff --git a/public/branding/taonier-logo-concepts/taonier-creation-loop.png b/public/branding/taonier-logo-concepts/taonier-creation-loop.png deleted file mode 100644 index fa4a1ad3..00000000 Binary files a/public/branding/taonier-logo-concepts/taonier-creation-loop.png and /dev/null differ diff --git a/public/branding/taonier-logo-concepts/taonier-logo-contact-sheet.png b/public/branding/taonier-logo-concepts/taonier-logo-contact-sheet.png deleted file mode 100644 index 39379c44..00000000 Binary files a/public/branding/taonier-logo-concepts/taonier-logo-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-concepts/taonier-meme-bubble.png b/public/branding/taonier-logo-concepts/taonier-meme-bubble.png deleted file mode 100644 index 4ac66ce1..00000000 Binary files a/public/branding/taonier-logo-concepts/taonier-meme-bubble.png and /dev/null differ diff --git a/public/branding/taonier-logo-concepts/taonier-play-mold.png b/public/branding/taonier-logo-concepts/taonier-play-mold.png deleted file mode 100644 index 05abdcc8..00000000 Binary files a/public/branding/taonier-logo-concepts/taonier-play-mold.png and /dev/null differ diff --git a/public/branding/taonier-logo-concepts/taonier-premium-seal.png b/public/branding/taonier-logo-concepts/taonier-premium-seal.png deleted file mode 100644 index 80634e3b..00000000 Binary files a/public/branding/taonier-logo-concepts/taonier-premium-seal.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-01-teal-core-pop.png b/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-01-teal-core-pop.png deleted file mode 100644 index 963d4d1a..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-01-teal-core-pop.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-02-indigo-cut-mark.png b/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-02-indigo-cut-mark.png deleted file mode 100644 index a6a10d20..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-02-indigo-cut-mark.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-03-cinnabar-clay-spark.png b/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-03-cinnabar-clay-spark.png deleted file mode 100644 index 3ca851d9..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-03-cinnabar-clay-spark.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-04-bold-outline-token.png b/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-04-bold-outline-token.png deleted file mode 100644 index a6657d8a..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-04-bold-outline-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-05-clay-pixel-seed.png b/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-05-clay-pixel-seed.png deleted file mode 100644 index 0f952fe9..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-05-clay-pixel-seed.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-06-dynamic-squircle.png b/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-06-dynamic-squircle.png deleted file mode 100644 index a607f183..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-06-dynamic-squircle.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-07-app-store-icon.png b/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-07-app-store-icon.png deleted file mode 100644 index b770f607..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-07-app-store-icon.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-08-trademark-flat-glyph.png b/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-08-trademark-flat-glyph.png deleted file mode 100644 index 29b08dac..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-distinctive-08-trademark-flat-glyph.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-logo-distinctive-contact-sheet.png b/public/branding/taonier-logo-distinctive-concepts/taonier-logo-distinctive-contact-sheet.png deleted file mode 100644 index 65a8389f..00000000 Binary files a/public/branding/taonier-logo-distinctive-concepts/taonier-logo-distinctive-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-distinctive-concepts/taonier-logo-distinctive-manifest.json b/public/branding/taonier-logo-distinctive-concepts/taonier-logo-distinctive-manifest.json deleted file mode 100644 index 53148e50..00000000 --- a/public/branding/taonier-logo-distinctive-concepts/taonier-logo-distinctive-manifest.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T18:18:06.003Z", - "creativeDirection": { - "name": "陶泥儿高辨识可塑星核图形标", - "textPolicy": "no Chinese, no English, no wordmark", - "palette": "暖陶白/浅陶土主体 + 8%-18% 孔雀青、靛蓝灰、朱砂橙或暗金土黄点缀", - "motif": "强轮廓软方圆 + 独特可塑星核 + 少量 AI/UGC 刻点", - "correction": "avoid candy, avoid brick, avoid plain mud stamp, increase brand recognition" - }, - "variants": [ - { - "id": "01-teal-core-pop", - "title": "孔雀青星核", - "file": "taonier-distinctive-01-teal-core-pop.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次目标是高辨识度和传播吸引力:第一眼要像一个有记忆点的互联网产品 logo,而不是普通泥块、砖块、陶片、印章、饼干或糖果。\n核心隐喻:可塑星核。一个独特的「软方圆陶泥外轮廓 + 中心可塑星核」符号,星核像脑洞被捏出的一瞬间,造型要有专属轮廓,不能是普通五角星或普通四角闪光。\n风格:现代扁平矢量商标,带轻微哑光陶泥质感;边缘干净、对比清楚、轮廓强,适合 App 图标、社区头像、启动页和商标注册前期筛选。\n材质:要能看出陶泥温度,但不要过度粗糙、不要砖、不要土块、不要考古泥片。质感只做轻量表面颗粒和柔和压痕。\n配色:以暖陶白或浅陶土色为主体,加入一个高识别点缀色。允许使用低饱和孔雀青、靛蓝灰、朱砂橙、暗金土黄中的一种;点缀色只占 8% 到 18%。整体要更醒目、更年轻,但不要糖果色。\n图案:中心星核必须是品牌记忆点,可用负形、嵌色、切口、泥痕、像素刻点形成独特轮廓;周围最多 2 到 3 个小刻点暗示 AI/UGC 扩散。\n构图:正方形画布,居中图形标,图形占画面约 70% 到 78%,干净浅色背景,留足安全边距。缩小到 64px 时仍然能认出外轮廓和中心符号。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标。\n强禁止低辨识:不要普通圆泥饼、不要普通砖块、不要石头、不要考古印章、不要单纯凹星孔、不要灰扑扑单色泥片。\n强禁止食品感:不要糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力、果冻高光、亮金膨胀星糖。\n本张重点:孔雀青识别点。暖陶白软方圆主体,中间是孔雀青负形可塑星核,少量陶土褐压痕,整体清爽年轻。" - }, - { - "id": "02-indigo-cut-mark", - "title": "靛蓝切口", - "file": "taonier-distinctive-02-indigo-cut-mark.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次目标是高辨识度和传播吸引力:第一眼要像一个有记忆点的互联网产品 logo,而不是普通泥块、砖块、陶片、印章、饼干或糖果。\n核心隐喻:可塑星核。一个独特的「软方圆陶泥外轮廓 + 中心可塑星核」符号,星核像脑洞被捏出的一瞬间,造型要有专属轮廓,不能是普通五角星或普通四角闪光。\n风格:现代扁平矢量商标,带轻微哑光陶泥质感;边缘干净、对比清楚、轮廓强,适合 App 图标、社区头像、启动页和商标注册前期筛选。\n材质:要能看出陶泥温度,但不要过度粗糙、不要砖、不要土块、不要考古泥片。质感只做轻量表面颗粒和柔和压痕。\n配色:以暖陶白或浅陶土色为主体,加入一个高识别点缀色。允许使用低饱和孔雀青、靛蓝灰、朱砂橙、暗金土黄中的一种;点缀色只占 8% 到 18%。整体要更醒目、更年轻,但不要糖果色。\n图案:中心星核必须是品牌记忆点,可用负形、嵌色、切口、泥痕、像素刻点形成独特轮廓;周围最多 2 到 3 个小刻点暗示 AI/UGC 扩散。\n构图:正方形画布,居中图形标,图形占画面约 70% 到 78%,干净浅色背景,留足安全边距。缩小到 64px 时仍然能认出外轮廓和中心符号。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标。\n强禁止低辨识:不要普通圆泥饼、不要普通砖块、不要石头、不要考古印章、不要单纯凹星孔、不要灰扑扑单色泥片。\n强禁止食品感:不要糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力、果冻高光、亮金膨胀星糖。\n本张重点:靛蓝灰切口。用一条干净的靛蓝灰泥痕切出中心星核,让图形远看有强剪影,不能像旋涡旧稿。" - }, - { - "id": "03-cinnabar-clay-spark", - "title": "朱砂陶火", - "file": "taonier-distinctive-03-cinnabar-clay-spark.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次目标是高辨识度和传播吸引力:第一眼要像一个有记忆点的互联网产品 logo,而不是普通泥块、砖块、陶片、印章、饼干或糖果。\n核心隐喻:可塑星核。一个独特的「软方圆陶泥外轮廓 + 中心可塑星核」符号,星核像脑洞被捏出的一瞬间,造型要有专属轮廓,不能是普通五角星或普通四角闪光。\n风格:现代扁平矢量商标,带轻微哑光陶泥质感;边缘干净、对比清楚、轮廓强,适合 App 图标、社区头像、启动页和商标注册前期筛选。\n材质:要能看出陶泥温度,但不要过度粗糙、不要砖、不要土块、不要考古泥片。质感只做轻量表面颗粒和柔和压痕。\n配色:以暖陶白或浅陶土色为主体,加入一个高识别点缀色。允许使用低饱和孔雀青、靛蓝灰、朱砂橙、暗金土黄中的一种;点缀色只占 8% 到 18%。整体要更醒目、更年轻,但不要糖果色。\n图案:中心星核必须是品牌记忆点,可用负形、嵌色、切口、泥痕、像素刻点形成独特轮廓;周围最多 2 到 3 个小刻点暗示 AI/UGC 扩散。\n构图:正方形画布,居中图形标,图形占画面约 70% 到 78%,干净浅色背景,留足安全边距。缩小到 64px 时仍然能认出外轮廓和中心符号。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标。\n强禁止低辨识:不要普通圆泥饼、不要普通砖块、不要石头、不要考古印章、不要单纯凹星孔、不要灰扑扑单色泥片。\n强禁止食品感:不要糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力、果冻高光、亮金膨胀星糖。\n本张重点:朱砂橙活力。中心星核或侧边小泥片使用低饱和朱砂橙,像创作火花,但整体保持陶泥材质和精品克制。" - }, - { - "id": "04-bold-outline-token", - "title": "强轮廓泥符", - "file": "taonier-distinctive-04-bold-outline-token.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次目标是高辨识度和传播吸引力:第一眼要像一个有记忆点的互联网产品 logo,而不是普通泥块、砖块、陶片、印章、饼干或糖果。\n核心隐喻:可塑星核。一个独特的「软方圆陶泥外轮廓 + 中心可塑星核」符号,星核像脑洞被捏出的一瞬间,造型要有专属轮廓,不能是普通五角星或普通四角闪光。\n风格:现代扁平矢量商标,带轻微哑光陶泥质感;边缘干净、对比清楚、轮廓强,适合 App 图标、社区头像、启动页和商标注册前期筛选。\n材质:要能看出陶泥温度,但不要过度粗糙、不要砖、不要土块、不要考古泥片。质感只做轻量表面颗粒和柔和压痕。\n配色:以暖陶白或浅陶土色为主体,加入一个高识别点缀色。允许使用低饱和孔雀青、靛蓝灰、朱砂橙、暗金土黄中的一种;点缀色只占 8% 到 18%。整体要更醒目、更年轻,但不要糖果色。\n图案:中心星核必须是品牌记忆点,可用负形、嵌色、切口、泥痕、像素刻点形成独特轮廓;周围最多 2 到 3 个小刻点暗示 AI/UGC 扩散。\n构图:正方形画布,居中图形标,图形占画面约 70% 到 78%,干净浅色背景,留足安全边距。缩小到 64px 时仍然能认出外轮廓和中心符号。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标。\n强禁止低辨识:不要普通圆泥饼、不要普通砖块、不要石头、不要考古印章、不要单纯凹星孔、不要灰扑扑单色泥片。\n强禁止食品感:不要糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力、果冻高光、亮金膨胀星糖。\n本张重点:强轮廓。用深泥灰细描边或深色负形强化外轮廓和中心符号,确保黑白化后仍有高辨识度。" - }, - { - "id": "05-clay-pixel-seed", - "title": "像素创作种", - "file": "taonier-distinctive-05-clay-pixel-seed.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次目标是高辨识度和传播吸引力:第一眼要像一个有记忆点的互联网产品 logo,而不是普通泥块、砖块、陶片、印章、饼干或糖果。\n核心隐喻:可塑星核。一个独特的「软方圆陶泥外轮廓 + 中心可塑星核」符号,星核像脑洞被捏出的一瞬间,造型要有专属轮廓,不能是普通五角星或普通四角闪光。\n风格:现代扁平矢量商标,带轻微哑光陶泥质感;边缘干净、对比清楚、轮廓强,适合 App 图标、社区头像、启动页和商标注册前期筛选。\n材质:要能看出陶泥温度,但不要过度粗糙、不要砖、不要土块、不要考古泥片。质感只做轻量表面颗粒和柔和压痕。\n配色:以暖陶白或浅陶土色为主体,加入一个高识别点缀色。允许使用低饱和孔雀青、靛蓝灰、朱砂橙、暗金土黄中的一种;点缀色只占 8% 到 18%。整体要更醒目、更年轻,但不要糖果色。\n图案:中心星核必须是品牌记忆点,可用负形、嵌色、切口、泥痕、像素刻点形成独特轮廓;周围最多 2 到 3 个小刻点暗示 AI/UGC 扩散。\n构图:正方形画布,居中图形标,图形占画面约 70% 到 78%,干净浅色背景,留足安全边距。缩小到 64px 时仍然能认出外轮廓和中心符号。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标。\n强禁止低辨识:不要普通圆泥饼、不要普通砖块、不要石头、不要考古印章、不要单纯凹星孔、不要灰扑扑单色泥片。\n强禁止食品感:不要糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力、果冻高光、亮金膨胀星糖。\n本张重点:AI/UGC 暗示。中心星核周围有 3 个小方形刻点,像生成像素从陶泥里浮现,但不要复杂电路线。" - }, - { - "id": "06-dynamic-squircle", - "title": "动态软方圆", - "file": "taonier-distinctive-06-dynamic-squircle.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次目标是高辨识度和传播吸引力:第一眼要像一个有记忆点的互联网产品 logo,而不是普通泥块、砖块、陶片、印章、饼干或糖果。\n核心隐喻:可塑星核。一个独特的「软方圆陶泥外轮廓 + 中心可塑星核」符号,星核像脑洞被捏出的一瞬间,造型要有专属轮廓,不能是普通五角星或普通四角闪光。\n风格:现代扁平矢量商标,带轻微哑光陶泥质感;边缘干净、对比清楚、轮廓强,适合 App 图标、社区头像、启动页和商标注册前期筛选。\n材质:要能看出陶泥温度,但不要过度粗糙、不要砖、不要土块、不要考古泥片。质感只做轻量表面颗粒和柔和压痕。\n配色:以暖陶白或浅陶土色为主体,加入一个高识别点缀色。允许使用低饱和孔雀青、靛蓝灰、朱砂橙、暗金土黄中的一种;点缀色只占 8% 到 18%。整体要更醒目、更年轻,但不要糖果色。\n图案:中心星核必须是品牌记忆点,可用负形、嵌色、切口、泥痕、像素刻点形成独特轮廓;周围最多 2 到 3 个小刻点暗示 AI/UGC 扩散。\n构图:正方形画布,居中图形标,图形占画面约 70% 到 78%,干净浅色背景,留足安全边距。缩小到 64px 时仍然能认出外轮廓和中心符号。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标。\n强禁止低辨识:不要普通圆泥饼、不要普通砖块、不要石头、不要考古印章、不要单纯凹星孔、不要灰扑扑单色泥片。\n强禁止食品感:不要糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力、果冻高光、亮金膨胀星糖。\n本张重点:动态轮廓。外形不是静态泥块,而像正在被捏动的软方圆,有一个明显但简洁的非对称记忆点。" - }, - { - "id": "07-app-store-icon", - "title": "应用图标款", - "file": "taonier-distinctive-07-app-store-icon.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次目标是高辨识度和传播吸引力:第一眼要像一个有记忆点的互联网产品 logo,而不是普通泥块、砖块、陶片、印章、饼干或糖果。\n核心隐喻:可塑星核。一个独特的「软方圆陶泥外轮廓 + 中心可塑星核」符号,星核像脑洞被捏出的一瞬间,造型要有专属轮廓,不能是普通五角星或普通四角闪光。\n风格:现代扁平矢量商标,带轻微哑光陶泥质感;边缘干净、对比清楚、轮廓强,适合 App 图标、社区头像、启动页和商标注册前期筛选。\n材质:要能看出陶泥温度,但不要过度粗糙、不要砖、不要土块、不要考古泥片。质感只做轻量表面颗粒和柔和压痕。\n配色:以暖陶白或浅陶土色为主体,加入一个高识别点缀色。允许使用低饱和孔雀青、靛蓝灰、朱砂橙、暗金土黄中的一种;点缀色只占 8% 到 18%。整体要更醒目、更年轻,但不要糖果色。\n图案:中心星核必须是品牌记忆点,可用负形、嵌色、切口、泥痕、像素刻点形成独特轮廓;周围最多 2 到 3 个小刻点暗示 AI/UGC 扩散。\n构图:正方形画布,居中图形标,图形占画面约 70% 到 78%,干净浅色背景,留足安全边距。缩小到 64px 时仍然能认出外轮廓和中心符号。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标。\n强禁止低辨识:不要普通圆泥饼、不要普通砖块、不要石头、不要考古印章、不要单纯凹星孔、不要灰扑扑单色泥片。\n强禁止食品感:不要糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力、果冻高光、亮金膨胀星糖。\n本张重点:App Store 图标。构图饱满、中心符号强、背景干净,视觉冲击比泥章更强,但不出现文字和脸。" - }, - { - "id": "08-trademark-flat-glyph", - "title": "商标扁平符", - "file": "taonier-distinctive-08-trademark-flat-glyph.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次目标是高辨识度和传播吸引力:第一眼要像一个有记忆点的互联网产品 logo,而不是普通泥块、砖块、陶片、印章、饼干或糖果。\n核心隐喻:可塑星核。一个独特的「软方圆陶泥外轮廓 + 中心可塑星核」符号,星核像脑洞被捏出的一瞬间,造型要有专属轮廓,不能是普通五角星或普通四角闪光。\n风格:现代扁平矢量商标,带轻微哑光陶泥质感;边缘干净、对比清楚、轮廓强,适合 App 图标、社区头像、启动页和商标注册前期筛选。\n材质:要能看出陶泥温度,但不要过度粗糙、不要砖、不要土块、不要考古泥片。质感只做轻量表面颗粒和柔和压痕。\n配色:以暖陶白或浅陶土色为主体,加入一个高识别点缀色。允许使用低饱和孔雀青、靛蓝灰、朱砂橙、暗金土黄中的一种;点缀色只占 8% 到 18%。整体要更醒目、更年轻,但不要糖果色。\n图案:中心星核必须是品牌记忆点,可用负形、嵌色、切口、泥痕、像素刻点形成独特轮廓;周围最多 2 到 3 个小刻点暗示 AI/UGC 扩散。\n构图:正方形画布,居中图形标,图形占画面约 70% 到 78%,干净浅色背景,留足安全边距。缩小到 64px 时仍然能认出外轮廓和中心符号。\n禁止:脸、眼睛、嘴巴、表情、角色身体、吉祥物立绘、陶艺工具、手、笔刷、复杂场景、按钮、UI、边框、水印、文字、商标字标。\n强禁止低辨识:不要普通圆泥饼、不要普通砖块、不要石头、不要考古印章、不要单纯凹星孔、不要灰扑扑单色泥片。\n强禁止食品感:不要糖果、软糖、奶油、饼干、夹心甜点、月饼、巧克力、果冻高光、亮金膨胀星糖。\n本张重点:最终商标潜力。减少材质和阴影,以 2 到 3 个大色块形成独特符号,保留陶泥可塑感和中心可塑星核。" - } - ] -} diff --git a/public/branding/taonier-logo-flat-concepts/taonier-flat-loop-mold.png b/public/branding/taonier-logo-flat-concepts/taonier-flat-loop-mold.png deleted file mode 100644 index 22f8d58f..00000000 Binary files a/public/branding/taonier-logo-flat-concepts/taonier-flat-loop-mold.png and /dev/null differ diff --git a/public/branding/taonier-logo-flat-concepts/taonier-flat-meme-smile.png b/public/branding/taonier-logo-flat-concepts/taonier-flat-meme-smile.png deleted file mode 100644 index 01522897..00000000 Binary files a/public/branding/taonier-logo-flat-concepts/taonier-flat-meme-smile.png and /dev/null differ diff --git a/public/branding/taonier-logo-flat-concepts/taonier-flat-play-clay.png b/public/branding/taonier-logo-flat-concepts/taonier-flat-play-clay.png deleted file mode 100644 index 20d59156..00000000 Binary files a/public/branding/taonier-logo-flat-concepts/taonier-flat-play-clay.png and /dev/null differ diff --git a/public/branding/taonier-logo-flat-concepts/taonier-flat-seal-blocks.png b/public/branding/taonier-logo-flat-concepts/taonier-flat-seal-blocks.png deleted file mode 100644 index 3c361068..00000000 Binary files a/public/branding/taonier-logo-flat-concepts/taonier-flat-seal-blocks.png and /dev/null differ diff --git a/public/branding/taonier-logo-flat-concepts/taonier-flat-spark-clay.png b/public/branding/taonier-logo-flat-concepts/taonier-flat-spark-clay.png deleted file mode 100644 index 517ea03f..00000000 Binary files a/public/branding/taonier-logo-flat-concepts/taonier-flat-spark-clay.png and /dev/null differ diff --git a/public/branding/taonier-logo-flat-concepts/taonier-logo-flat-contact-sheet.png b/public/branding/taonier-logo-flat-concepts/taonier-logo-flat-contact-sheet.png deleted file mode 100644 index 7ca0380b..00000000 Binary files a/public/branding/taonier-logo-flat-concepts/taonier-logo-flat-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-flow-01-soft-ribbon-loop.png b/public/branding/taonier-logo-flow-concepts/taonier-flow-01-soft-ribbon-loop.png deleted file mode 100644 index d06a853e..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-flow-01-soft-ribbon-loop.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-flow-02-clay-wave-knot.png b/public/branding/taonier-logo-flow-concepts/taonier-flow-02-clay-wave-knot.png deleted file mode 100644 index 61258708..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-flow-02-clay-wave-knot.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-flow-03-imagination-ripple.png b/public/branding/taonier-logo-flow-concepts/taonier-flow-03-imagination-ripple.png deleted file mode 100644 index 230b1387..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-flow-03-imagination-ripple.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-flow-04-friendly-clay-comet.png b/public/branding/taonier-logo-flow-concepts/taonier-flow-04-friendly-clay-comet.png deleted file mode 100644 index ae505519..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-flow-04-friendly-clay-comet.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-flow-05-single-stroke-blob.png b/public/branding/taonier-logo-flow-concepts/taonier-flow-05-single-stroke-blob.png deleted file mode 100644 index a111d64d..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-flow-05-single-stroke-blob.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-flow-06-two-tone-soft-flow.png b/public/branding/taonier-logo-flow-concepts/taonier-flow-06-two-tone-soft-flow.png deleted file mode 100644 index fb60deeb..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-flow-06-two-tone-soft-flow.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-flow-07-open-clay-orbit.png b/public/branding/taonier-logo-flow-concepts/taonier-flow-07-open-clay-orbit.png deleted file mode 100644 index bbdc922f..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-flow-07-open-clay-orbit.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-flow-08-brand-flow-glyph.png b/public/branding/taonier-logo-flow-concepts/taonier-flow-08-brand-flow-glyph.png deleted file mode 100644 index d1da646a..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-flow-08-brand-flow-glyph.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-logo-flow-contact-sheet.png b/public/branding/taonier-logo-flow-concepts/taonier-logo-flow-contact-sheet.png deleted file mode 100644 index 5730f898..00000000 Binary files a/public/branding/taonier-logo-flow-concepts/taonier-logo-flow-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-flow-concepts/taonier-logo-flow-manifest.json b/public/branding/taonier-logo-flow-concepts/taonier-logo-flow-manifest.json deleted file mode 100644 index e7c0fbfd..00000000 --- a/public/branding/taonier-logo-flow-concepts/taonier-logo-flow-manifest.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T18:34:58.786Z", - "creativeDirection": { - "name": "陶泥儿连续曲线亲和图形标", - "textPolicy": "no Chinese, no English, no wordmark", - "correction": "no square base, no center star, use one continuous friendly clay curve structure", - "motif": "柔泥回环、脑洞涟漪、开放泥环、品牌曲线符" - }, - "variants": [ - { - "id": "01-soft-ribbon-loop", - "title": "柔泥回环", - "file": "taonier-flow-01-soft-ribbon-loop.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须彻底放弃方形底和中心星星:不要整体方形、不要圆角方块、不要 App 图标底板、不要中间星形、不要五角星、不要四角星、不要闪光、不要中心挖孔星。\n核心隐喻:连续的陶泥曲线。用一整块顺滑、亲和、可塑的陶泥大结构来表达「脑洞被揉开、灵感流动、内容成型」,图形要像一个完整的流动符号,而不是底板加中心图案。\n主结构:由平滑曲线组成的大轮廓,可以像柔软泥流、脑洞涟漪、捏合的回环、温和的旋拧、单线团块或开放结。整体必须连贯、圆润、有亲和力,不能分裂成多个碎片。\n风格:现代扁平矢量商标,轻微哑光陶泥质感;边缘干净、曲线饱满、负形明确,适合商标、App 图标、社区头像和启动页。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主,可加入少量低饱和孔雀青或深泥灰作为曲线内侧阴影或小连接点。颜色要温暖、有吸引力,但不要糖果色。\n识别度:远看必须能记住一个独特的大曲线轮廓;不要靠中心图案识别。缩小到 64px 时仍能看出整体曲线姿态。\n亲和力:整体像可以被揉捏的柔软小世界,有陪伴感和创作感,但不要做成脸、表情、角色或吉祥物。\n禁止:方形底、圆角方块、中心星星、任何星形、闪光、徽章、印章、砖块、泥饼、石头、陶片、饼干、糖果、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:一条宽厚柔软的陶泥带形成开放回环,像脑洞被揉开。轮廓连续,内部负形自然,不出现星形或方形底。" - }, - { - "id": "02-clay-wave-knot", - "title": "陶泥波结", - "file": "taonier-flow-02-clay-wave-knot.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须彻底放弃方形底和中心星星:不要整体方形、不要圆角方块、不要 App 图标底板、不要中间星形、不要五角星、不要四角星、不要闪光、不要中心挖孔星。\n核心隐喻:连续的陶泥曲线。用一整块顺滑、亲和、可塑的陶泥大结构来表达「脑洞被揉开、灵感流动、内容成型」,图形要像一个完整的流动符号,而不是底板加中心图案。\n主结构:由平滑曲线组成的大轮廓,可以像柔软泥流、脑洞涟漪、捏合的回环、温和的旋拧、单线团块或开放结。整体必须连贯、圆润、有亲和力,不能分裂成多个碎片。\n风格:现代扁平矢量商标,轻微哑光陶泥质感;边缘干净、曲线饱满、负形明确,适合商标、App 图标、社区头像和启动页。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主,可加入少量低饱和孔雀青或深泥灰作为曲线内侧阴影或小连接点。颜色要温暖、有吸引力,但不要糖果色。\n识别度:远看必须能记住一个独特的大曲线轮廓;不要靠中心图案识别。缩小到 64px 时仍能看出整体曲线姿态。\n亲和力:整体像可以被揉捏的柔软小世界,有陪伴感和创作感,但不要做成脸、表情、角色或吉祥物。\n禁止:方形底、圆角方块、中心星星、任何星形、闪光、徽章、印章、砖块、泥饼、石头、陶片、饼干、糖果、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:像一个温和波浪结,由 2 条互相捏合的平滑曲线组成,但必须视觉上像一个整体符号,不要碎片化。" - }, - { - "id": "03-imagination-ripple", - "title": "脑洞涟漪", - "file": "taonier-flow-03-imagination-ripple.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须彻底放弃方形底和中心星星:不要整体方形、不要圆角方块、不要 App 图标底板、不要中间星形、不要五角星、不要四角星、不要闪光、不要中心挖孔星。\n核心隐喻:连续的陶泥曲线。用一整块顺滑、亲和、可塑的陶泥大结构来表达「脑洞被揉开、灵感流动、内容成型」,图形要像一个完整的流动符号,而不是底板加中心图案。\n主结构:由平滑曲线组成的大轮廓,可以像柔软泥流、脑洞涟漪、捏合的回环、温和的旋拧、单线团块或开放结。整体必须连贯、圆润、有亲和力,不能分裂成多个碎片。\n风格:现代扁平矢量商标,轻微哑光陶泥质感;边缘干净、曲线饱满、负形明确,适合商标、App 图标、社区头像和启动页。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主,可加入少量低饱和孔雀青或深泥灰作为曲线内侧阴影或小连接点。颜色要温暖、有吸引力,但不要糖果色。\n识别度:远看必须能记住一个独特的大曲线轮廓;不要靠中心图案识别。缩小到 64px 时仍能看出整体曲线姿态。\n亲和力:整体像可以被揉捏的柔软小世界,有陪伴感和创作感,但不要做成脸、表情、角色或吉祥物。\n禁止:方形底、圆角方块、中心星星、任何星形、闪光、徽章、印章、砖块、泥饼、石头、陶片、饼干、糖果、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:用一整块陶泥曲面形成涟漪状大轮廓,中间负形像柔和水滴或脑洞入口,不能像星星。" - }, - { - "id": "04-friendly-clay-comet", - "title": "亲和泥流", - "file": "taonier-flow-04-friendly-clay-comet.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须彻底放弃方形底和中心星星:不要整体方形、不要圆角方块、不要 App 图标底板、不要中间星形、不要五角星、不要四角星、不要闪光、不要中心挖孔星。\n核心隐喻:连续的陶泥曲线。用一整块顺滑、亲和、可塑的陶泥大结构来表达「脑洞被揉开、灵感流动、内容成型」,图形要像一个完整的流动符号,而不是底板加中心图案。\n主结构:由平滑曲线组成的大轮廓,可以像柔软泥流、脑洞涟漪、捏合的回环、温和的旋拧、单线团块或开放结。整体必须连贯、圆润、有亲和力,不能分裂成多个碎片。\n风格:现代扁平矢量商标,轻微哑光陶泥质感;边缘干净、曲线饱满、负形明确,适合商标、App 图标、社区头像和启动页。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主,可加入少量低饱和孔雀青或深泥灰作为曲线内侧阴影或小连接点。颜色要温暖、有吸引力,但不要糖果色。\n识别度:远看必须能记住一个独特的大曲线轮廓;不要靠中心图案识别。缩小到 64px 时仍能看出整体曲线姿态。\n亲和力:整体像可以被揉捏的柔软小世界,有陪伴感和创作感,但不要做成脸、表情、角色或吉祥物。\n禁止:方形底、圆角方块、中心星星、任何星形、闪光、徽章、印章、砖块、泥饼、石头、陶片、饼干、糖果、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:亲和泥流。整体像一个流动的陶泥小世界,前端圆润、尾部自然收束,有动势但不尖锐。" - }, - { - "id": "05-single-stroke-blob", - "title": "单笔团块", - "file": "taonier-flow-05-single-stroke-blob.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须彻底放弃方形底和中心星星:不要整体方形、不要圆角方块、不要 App 图标底板、不要中间星形、不要五角星、不要四角星、不要闪光、不要中心挖孔星。\n核心隐喻:连续的陶泥曲线。用一整块顺滑、亲和、可塑的陶泥大结构来表达「脑洞被揉开、灵感流动、内容成型」,图形要像一个完整的流动符号,而不是底板加中心图案。\n主结构:由平滑曲线组成的大轮廓,可以像柔软泥流、脑洞涟漪、捏合的回环、温和的旋拧、单线团块或开放结。整体必须连贯、圆润、有亲和力,不能分裂成多个碎片。\n风格:现代扁平矢量商标,轻微哑光陶泥质感;边缘干净、曲线饱满、负形明确,适合商标、App 图标、社区头像和启动页。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主,可加入少量低饱和孔雀青或深泥灰作为曲线内侧阴影或小连接点。颜色要温暖、有吸引力,但不要糖果色。\n识别度:远看必须能记住一个独特的大曲线轮廓;不要靠中心图案识别。缩小到 64px 时仍能看出整体曲线姿态。\n亲和力:整体像可以被揉捏的柔软小世界,有陪伴感和创作感,但不要做成脸、表情、角色或吉祥物。\n禁止:方形底、圆角方块、中心星星、任何星形、闪光、徽章、印章、砖块、泥饼、石头、陶片、饼干、糖果、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:单笔成型。像用一笔连续曲线捏出的陶泥团,结构极简但有记忆点,适合后续矢量化。" - }, - { - "id": "06-two-tone-soft-flow", - "title": "双色软流", - "file": "taonier-flow-06-two-tone-soft-flow.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须彻底放弃方形底和中心星星:不要整体方形、不要圆角方块、不要 App 图标底板、不要中间星形、不要五角星、不要四角星、不要闪光、不要中心挖孔星。\n核心隐喻:连续的陶泥曲线。用一整块顺滑、亲和、可塑的陶泥大结构来表达「脑洞被揉开、灵感流动、内容成型」,图形要像一个完整的流动符号,而不是底板加中心图案。\n主结构:由平滑曲线组成的大轮廓,可以像柔软泥流、脑洞涟漪、捏合的回环、温和的旋拧、单线团块或开放结。整体必须连贯、圆润、有亲和力,不能分裂成多个碎片。\n风格:现代扁平矢量商标,轻微哑光陶泥质感;边缘干净、曲线饱满、负形明确,适合商标、App 图标、社区头像和启动页。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主,可加入少量低饱和孔雀青或深泥灰作为曲线内侧阴影或小连接点。颜色要温暖、有吸引力,但不要糖果色。\n识别度:远看必须能记住一个独特的大曲线轮廓;不要靠中心图案识别。缩小到 64px 时仍能看出整体曲线姿态。\n亲和力:整体像可以被揉捏的柔软小世界,有陪伴感和创作感,但不要做成脸、表情、角色或吉祥物。\n禁止:方形底、圆角方块、中心星星、任何星形、闪光、徽章、印章、砖块、泥饼、石头、陶片、饼干、糖果、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:双色曲线。暖陶白主体配少量孔雀青或陶土橙内侧曲线,让图形更吸引人,但不能变成多片拼贴。" - }, - { - "id": "07-open-clay-orbit", - "title": "开放泥环", - "file": "taonier-flow-07-open-clay-orbit.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须彻底放弃方形底和中心星星:不要整体方形、不要圆角方块、不要 App 图标底板、不要中间星形、不要五角星、不要四角星、不要闪光、不要中心挖孔星。\n核心隐喻:连续的陶泥曲线。用一整块顺滑、亲和、可塑的陶泥大结构来表达「脑洞被揉开、灵感流动、内容成型」,图形要像一个完整的流动符号,而不是底板加中心图案。\n主结构:由平滑曲线组成的大轮廓,可以像柔软泥流、脑洞涟漪、捏合的回环、温和的旋拧、单线团块或开放结。整体必须连贯、圆润、有亲和力,不能分裂成多个碎片。\n风格:现代扁平矢量商标,轻微哑光陶泥质感;边缘干净、曲线饱满、负形明确,适合商标、App 图标、社区头像和启动页。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主,可加入少量低饱和孔雀青或深泥灰作为曲线内侧阴影或小连接点。颜色要温暖、有吸引力,但不要糖果色。\n识别度:远看必须能记住一个独特的大曲线轮廓;不要靠中心图案识别。缩小到 64px 时仍能看出整体曲线姿态。\n亲和力:整体像可以被揉捏的柔软小世界,有陪伴感和创作感,但不要做成脸、表情、角色或吉祥物。\n禁止:方形底、圆角方块、中心星星、任何星形、闪光、徽章、印章、砖块、泥饼、石头、陶片、饼干、糖果、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:开放式泥环。不是闭合圆,也不是旋涡旧稿,而是一枚有缺口和呼吸感的平滑陶泥环形符号。" - }, - { - "id": "08-brand-flow-glyph", - "title": "品牌曲线符", - "file": "taonier-flow-08-brand-flow-glyph.png", - "prompt": "请生成一枚全新的「陶泥儿」产品商标图形标概念稿,但画面中绝对不要出现任何中文字、英文字母、数字、符号字样或品牌字标。\n产品定位:精品 AI UGC 轻休闲小游戏创作与传播平台,用户可以像捏陶泥一样把脑洞、梗和灵感塑造成小游戏或趣味内容。\n这次必须彻底放弃方形底和中心星星:不要整体方形、不要圆角方块、不要 App 图标底板、不要中间星形、不要五角星、不要四角星、不要闪光、不要中心挖孔星。\n核心隐喻:连续的陶泥曲线。用一整块顺滑、亲和、可塑的陶泥大结构来表达「脑洞被揉开、灵感流动、内容成型」,图形要像一个完整的流动符号,而不是底板加中心图案。\n主结构:由平滑曲线组成的大轮廓,可以像柔软泥流、脑洞涟漪、捏合的回环、温和的旋拧、单线团块或开放结。整体必须连贯、圆润、有亲和力,不能分裂成多个碎片。\n风格:现代扁平矢量商标,轻微哑光陶泥质感;边缘干净、曲线饱满、负形明确,适合商标、App 图标、社区头像和启动页。\n配色:暖陶白、浅陶土、陶土橙、暖棕为主,可加入少量低饱和孔雀青或深泥灰作为曲线内侧阴影或小连接点。颜色要温暖、有吸引力,但不要糖果色。\n识别度:远看必须能记住一个独特的大曲线轮廓;不要靠中心图案识别。缩小到 64px 时仍能看出整体曲线姿态。\n亲和力:整体像可以被揉捏的柔软小世界,有陪伴感和创作感,但不要做成脸、表情、角色或吉祥物。\n禁止:方形底、圆角方块、中心星星、任何星形、闪光、徽章、印章、砖块、泥饼、石头、陶片、饼干、糖果、手、陶艺工具、笔刷、复杂场景、按钮、UI、边框、水印、文字。\n本张重点:最终品牌符号潜力。减少材质和细节,用 1 到 2 个大曲线色块形成独特、亲和、可注册的图形标。" - } - ] -} diff --git a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-dot-dice.png b/public/branding/taonier-logo-fresh-concepts/taonier-fresh-dot-dice.png deleted file mode 100644 index c0aaea2b..00000000 Binary files a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-dot-dice.png and /dev/null differ diff --git a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-mold-window.png b/public/branding/taonier-logo-fresh-concepts/taonier-fresh-mold-window.png deleted file mode 100644 index c493fd70..00000000 Binary files a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-mold-window.png and /dev/null differ diff --git a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-pocket-world.png b/public/branding/taonier-logo-fresh-concepts/taonier-fresh-pocket-world.png deleted file mode 100644 index 390361bf..00000000 Binary files a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-pocket-world.png and /dev/null differ diff --git a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-punch-hole.png b/public/branding/taonier-logo-fresh-concepts/taonier-fresh-punch-hole.png deleted file mode 100644 index 4cba08fc..00000000 Binary files a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-punch-hole.png and /dev/null differ diff --git a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-stage-window.png b/public/branding/taonier-logo-fresh-concepts/taonier-fresh-stage-window.png deleted file mode 100644 index fc41e804..00000000 Binary files a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-stage-window.png and /dev/null differ diff --git a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-wheel-imprint.png b/public/branding/taonier-logo-fresh-concepts/taonier-fresh-wheel-imprint.png deleted file mode 100644 index 996ff9dd..00000000 Binary files a/public/branding/taonier-logo-fresh-concepts/taonier-fresh-wheel-imprint.png and /dev/null differ diff --git a/public/branding/taonier-logo-fresh-concepts/taonier-logo-fresh-contact-sheet.png b/public/branding/taonier-logo-fresh-concepts/taonier-logo-fresh-contact-sheet.png deleted file mode 100644 index 50b5a0cf..00000000 Binary files a/public/branding/taonier-logo-fresh-concepts/taonier-logo-fresh-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dot-gate.png b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dot-gate.png deleted file mode 100644 index 4df8762f..00000000 Binary files a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dot-gate.png and /dev/null differ diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dot-gate.svg b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dot-gate.svg deleted file mode 100644 index 2f2b6910..00000000 --- a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dot-gate.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dual-plate.png b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dual-plate.png deleted file mode 100644 index 3063ec82..00000000 Binary files a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dual-plate.png and /dev/null differ diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dual-plate.svg b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dual-plate.svg deleted file mode 100644 index 604555ac..00000000 --- a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-dual-plate.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-mold-chip.png b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-mold-chip.png deleted file mode 100644 index b137b791..00000000 Binary files a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-mold-chip.png and /dev/null differ diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-mold-chip.svg b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-mold-chip.svg deleted file mode 100644 index 5fbc3145..00000000 --- a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-mold-chip.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-offset-core.png b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-offset-core.png deleted file mode 100644 index fb25bc93..00000000 Binary files a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-offset-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-offset-core.svg b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-offset-core.svg deleted file mode 100644 index dc99f8ca..00000000 --- a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-offset-core.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-pinched-tile.png b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-pinched-tile.png deleted file mode 100644 index 6a80aa9a..00000000 Binary files a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-pinched-tile.png and /dev/null differ diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-pinched-tile.svg b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-pinched-tile.svg deleted file mode 100644 index 02c12aba..00000000 --- a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-pinched-tile.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-work-knot.png b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-work-knot.png deleted file mode 100644 index eb4ca865..00000000 Binary files a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-work-knot.png and /dev/null differ diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-work-knot.svg b/public/branding/taonier-logo-geometric-concepts/taonier-geometric-work-knot.svg deleted file mode 100644 index 7e0eea94..00000000 --- a/public/branding/taonier-logo-geometric-concepts/taonier-geometric-work-knot.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/public/branding/taonier-logo-geometric-concepts/taonier-logo-geometric-contact-sheet.png b/public/branding/taonier-logo-geometric-concepts/taonier-logo-geometric-contact-sheet.png deleted file mode 100644 index c9499943..00000000 Binary files a/public/branding/taonier-logo-geometric-concepts/taonier-logo-geometric-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-01-berry-aqua-pop.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-01-berry-aqua-pop.png deleted file mode 100644 index 6998e267..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-01-berry-aqua-pop.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-02-coral-lilac.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-02-coral-lilac.png deleted file mode 100644 index f6127a50..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-02-coral-lilac.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-03-mango-turquoise.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-03-mango-turquoise.png deleted file mode 100644 index fe048b76..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-03-mango-turquoise.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-04-neon-rose-mint.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-04-neon-rose-mint.png deleted file mode 100644 index e6b51446..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-04-neon-rose-mint.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-05-poppy-blue.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-05-poppy-blue.png deleted file mode 100644 index bac0c919..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-05-poppy-blue.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-06-violet-peach.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-06-violet-peach.png deleted file mode 100644 index 5a3266fe..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-06-violet-peach.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-07-flat-duotone.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-07-flat-duotone.png deleted file mode 100644 index d4275a70..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-07-flat-duotone.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-08-app-icon-bright.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-08-app-icon-bright.png deleted file mode 100644 index a633aa02..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-08-app-icon-bright.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-contact-sheet.png b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-contact-sheet.png deleted file mode 100644 index ad8e836f..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-manifest.json b/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-manifest.json deleted file mode 100644 index 4208aa7e..00000000 --- a/public/branding/taonier-logo-hand-spirit-bold-color-concepts/taonier-hand-spirit-bold-color-manifest.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "model": "gpt-image-2", - "endpoint": "/v1/images/edits", - "size": "1024x1024", - "referenceImage": "public\\branding\\taonier-logo-hand-spirit-ref01-logo-refine-concepts\\taonier-hand-spirit-ref01-logo-refine-01-flat-coral-cream.png", - "generatedAt": "2026-05-18T07:50:23.595Z", - "brief": { - "brand": "陶泥儿", - "goal": "更大胆、更吸引女生和年轻人的手托灵体 logo 配色探索", - "keep": "保留托举曲线与半球灵体结构,不加文字、不加脸、不加星星" - }, - "variants": [ - { - "id": "01-berry-aqua-pop", - "title": "莓粉青 aqua", - "file": "taonier-hand-spirit-bold-color-01-berry-aqua-pop.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a bolder, more attractive color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is more memorable social-platform color, more appealing to young users and women, while still premium and trademark-like.\nUse bold modern brand colors, not realistic material colors. Saturated colors are allowed, but they must read as clean brand color fields, not candy, dessert, food, jelly, bread, pastry, mochi, bun, sauce, or cosmetic packaging.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle app-logo polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: vivid raspberry pink semi-dome, bright coral side accent, fresh aqua or mint hand support, small cream negative gap. Bold, young, energetic, not sugary." - }, - { - "id": "02-coral-lilac", - "title": "珊瑚丁香", - "file": "taonier-hand-spirit-bold-color-02-coral-lilac.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a bolder, more attractive color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is more memorable social-platform color, more appealing to young users and women, while still premium and trademark-like.\nUse bold modern brand colors, not realistic material colors. Saturated colors are allowed, but they must read as clean brand color fields, not candy, dessert, food, jelly, bread, pastry, mochi, bun, sauce, or cosmetic packaging.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle app-logo polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: punchy coral-red semi-dome with warm pink accent, soft lilac-lavender hand support, tiny ivory separator. Feminine, fresh, and premium." - }, - { - "id": "03-mango-turquoise", - "title": "芒果松石", - "file": "taonier-hand-spirit-bold-color-03-mango-turquoise.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a bolder, more attractive color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is more memorable social-platform color, more appealing to young users and women, while still premium and trademark-like.\nUse bold modern brand colors, not realistic material colors. Saturated colors are allowed, but they must read as clean brand color fields, not candy, dessert, food, jelly, bread, pastry, mochi, bun, sauce, or cosmetic packaging.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle app-logo polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: bright mango-orange semi-dome, hot peach accent, turquoise hand support. High contrast and cheerful, but still flat and logo-like, not food-like." - }, - { - "id": "04-neon-rose-mint", - "title": "玫红薄荷", - "file": "taonier-hand-spirit-bold-color-04-neon-rose-mint.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a bolder, more attractive color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is more memorable social-platform color, more appealing to young users and women, while still premium and trademark-like.\nUse bold modern brand colors, not realistic material colors. Saturated colors are allowed, but they must read as clean brand color fields, not candy, dessert, food, jelly, bread, pastry, mochi, bun, sauce, or cosmetic packaging.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle app-logo polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: neon rose or magenta semi-dome, clean mint green hand support, warm ivory separator. Strong social-avatar memory, modern and playful." - }, - { - "id": "05-poppy-blue", - "title": "罂粟蓝调", - "file": "taonier-hand-spirit-bold-color-05-poppy-blue.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a bolder, more attractive color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is more memorable social-platform color, more appealing to young users and women, while still premium and trademark-like.\nUse bold modern brand colors, not realistic material colors. Saturated colors are allowed, but they must read as clean brand color fields, not candy, dessert, food, jelly, bread, pastry, mochi, bun, sauce, or cosmetic packaging.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle app-logo polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: saturated poppy orange-red semi-dome, cobalt or sky-blue support curve, cream separator. More graphic, bold, and youth-culture oriented." - }, - { - "id": "06-violet-peach", - "title": "紫桃撞色", - "file": "taonier-hand-spirit-bold-color-06-violet-peach.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a bolder, more attractive color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is more memorable social-platform color, more appealing to young users and women, while still premium and trademark-like.\nUse bold modern brand colors, not realistic material colors. Saturated colors are allowed, but they must read as clean brand color fields, not candy, dessert, food, jelly, bread, pastry, mochi, bun, sauce, or cosmetic packaging.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle app-logo polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: vivid violet-purple hand support with peach-orange semi-dome and pink accent. Keep the purple limited and crisp so the logo does not become a generic purple tech gradient." - }, - { - "id": "07-flat-duotone", - "title": "双色强记忆", - "file": "taonier-hand-spirit-bold-color-07-flat-duotone.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a bolder, more attractive color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is more memorable social-platform color, more appealing to young users and women, while still premium and trademark-like.\nUse bold modern brand colors, not realistic material colors. Saturated colors are allowed, but they must read as clean brand color fields, not candy, dessert, food, jelly, bread, pastry, mochi, bun, sauce, or cosmetic packaging.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle app-logo polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette and style: ultra-flat two-color version. Use one bold warm color for the spirit and one bold cool color for the hand. No highlight, no gradient, no shadow. Maximize trademark simplicity." - }, - { - "id": "08-app-icon-bright", - "title": "亮彩头像", - "file": "taonier-hand-spirit-bold-color-08-app-icon-bright.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a bolder, more attractive color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is more memorable social-platform color, more appealing to young users and women, while still premium and trademark-like.\nUse bold modern brand colors, not realistic material colors. Saturated colors are allowed, but they must read as clean brand color fields, not candy, dessert, food, jelly, bread, pastry, mochi, bun, sauce, or cosmetic packaging.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle app-logo polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette and style: brightest app-icon-friendly version. Use coral, hot pink, and aqua with only a very subtle broad gradient. Keep the mark bold and readable at small size." - } - ] -} diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent-manifest.json b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent-manifest.json deleted file mode 100644 index 01fe7825..00000000 --- a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent-manifest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "model": "gpt-image-2", - "endpoint": "/v1/images/edits", - "size": "1024x1024", - "source": "public\\branding\\taonier-logo-hand-spirit-concepts\\taonier-hand-spirit-01-gentle-hand-spirit.png", - "chromaSource": "public\\branding\\taonier-logo-hand-spirit-concepts\\taonier-hand-spirit-01-gentle-hand-spirit-transparent-source.png", - "finalOutput": "public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent.png", - "generatedAt": "2026-05-18T06:51:33.388Z", - "prompt": "Use the uploaded image as the exact edit target.\nPreserve the logo subject exactly: same abstract hand shape, same clay spirit shape, same proportions, same placement, same scale, same colors, same soft vector style.\nDo not redesign, simplify, recolor, crop, rotate, add details, remove highlights, change the hand, or change the clay spirit.\nReplace only the white/off-white background with a perfectly flat solid #00ff00 chroma-key background.\nThe background must be one uniform #00ff00 color with no shadows, gradients, texture, reflections, floor plane, border, or lighting variation.\nDo not use #00ff00 anywhere inside the logo subject.\nNo text, no watermark, no UI, no extra marks, no border.\nKeep crisp clean edges and generous safe area so the result can be converted into a transparent PNG." -} diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent-source.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent-source.png deleted file mode 100644 index e4749f22..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent-source.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent.png deleted file mode 100644 index cb84c46b..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit-transparent.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit.png deleted file mode 100644 index f7e97ca4..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-01-gentle-hand-spirit.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-02-sharing-palm.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-02-sharing-palm.png deleted file mode 100644 index d76ab2ea..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-02-sharing-palm.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-03-teal-support.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-03-teal-support.png deleted file mode 100644 index 52b04e49..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-03-teal-support.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-04-arched-spirit.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-04-arched-spirit.png deleted file mode 100644 index 84046fe0..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-04-arched-spirit.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-05-playful-offer.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-05-playful-offer.png deleted file mode 100644 index 014e1848..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-05-playful-offer.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-06-monochrome-first.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-06-monochrome-first.png deleted file mode 100644 index 96b07b92..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-06-monochrome-first.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-07-avatar-readable.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-07-avatar-readable.png deleted file mode 100644 index aaea7097..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-07-avatar-readable.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-08-vector-ready.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-08-vector-ready.png deleted file mode 100644 index 322a19aa..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-hand-spirit-08-vector-ready.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-logo-hand-spirit-contact-sheet.png b/public/branding/taonier-logo-hand-spirit-concepts/taonier-logo-hand-spirit-contact-sheet.png deleted file mode 100644 index ea47da42..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-concepts/taonier-logo-hand-spirit-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-concepts/taonier-logo-hand-spirit-manifest.json b/public/branding/taonier-logo-hand-spirit-concepts/taonier-logo-hand-spirit-manifest.json deleted file mode 100644 index 26d0bcab..00000000 --- a/public/branding/taonier-logo-hand-spirit-concepts/taonier-logo-hand-spirit-manifest.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T21:30:55.045Z", - "logoSkillSummary": { - "requiredReview": "visual inspection, 32px readability, black-white viability", - "outputStatus": "AI concept only; final logo needs vector cleanup" - }, - "brief": { - "brand": "陶泥儿", - "coreBelief": "好玩会创造", - "logoType": "symbol/icon-only mark, no wordmark", - "product": "AI UGC 轻休闲小游戏创作与传播平台,用户像捏陶泥一样把脑洞、梗和灵感塑造成可分享的作品", - "metaphor": "抽象化的手托举/递出一个软萌陶泥灵体", - "intent": [ - "托举", - "分享", - "传递", - "创作被捏成一个有生命感的小作品" - ], - "spiritShape": "不规则半球形陶泥灵体,参考黑底白色半圆拱形轮廓,但不照抄", - "audience": "女性用户友好、全年龄向、年轻明亮但不低幼", - "material": "只保留陶泥温度,不追求泥土质感", - "mustHave": [ - "手必须高度抽象,像托举曲线或掌形基座", - "陶泥灵体必须是主角,软萌但不出现脸", - "画面传达分享/传递,而不是供奉/宗教/医疗", - "32px 可识别", - "黑白化仍成立" - ] - }, - "variants": [ - { - "id": "01-gentle-hand-spirit", - "title": "温柔托举灵体", - "file": "taonier-hand-spirit-01-gentle-hand-spirit.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nMain metaphor: an abstract hand gently holding up and offering a cute soft clay spirit. The logo should communicate creation, sharing, passing forward, and a small idea becoming a lovable playable object.\nLogo type: abstract symbol/icon only. Not a mascot illustration, not an app-icon rounded-square background, not an emblem with text.\nComposition: one highly simplified hand-like support curve or palm base below, holding one soft clay spirit above. The hand must be abstract, smooth, and logo-like, not realistic fingers.\nClay spirit shape: a cute irregular semi-dome / half-blob / rounded arch form, inspired by a simple white arched half-circle silhouette on dark background, but transformed into a friendly original brand symbol.\nThe spirit should be soft and lovable without a face. No eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nThe hand gesture should feel like sharing or gently presenting, not worship, religion, medical care, begging, or holding a food item.\nStyle: modern minimalist vector logo. Clean broad shapes, clear silhouette, fresh bright colors, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make the spirit look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, cream filling, sauce, dessert, or food packaging.\nShape avoidance: no square base, no rounded-square app background, no free ribbon, no swirl, no S or G letter feeling, no center star.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the hand support and semi-dome clay spirit should be recognizable at 32px.\nVariant focus: the clearest version. A simple cream abstract palm curve holds a coral-peach semi-dome clay spirit. Friendly, iconic, and readable." - }, - { - "id": "02-sharing-palm", - "title": "分享掌形", - "file": "taonier-hand-spirit-02-sharing-palm.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nMain metaphor: an abstract hand gently holding up and offering a cute soft clay spirit. The logo should communicate creation, sharing, passing forward, and a small idea becoming a lovable playable object.\nLogo type: abstract symbol/icon only. Not a mascot illustration, not an app-icon rounded-square background, not an emblem with text.\nComposition: one highly simplified hand-like support curve or palm base below, holding one soft clay spirit above. The hand must be abstract, smooth, and logo-like, not realistic fingers.\nClay spirit shape: a cute irregular semi-dome / half-blob / rounded arch form, inspired by a simple white arched half-circle silhouette on dark background, but transformed into a friendly original brand symbol.\nThe spirit should be soft and lovable without a face. No eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nThe hand gesture should feel like sharing or gently presenting, not worship, religion, medical care, begging, or holding a food item.\nStyle: modern minimalist vector logo. Clean broad shapes, clear silhouette, fresh bright colors, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make the spirit look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, cream filling, sauce, dessert, or food packaging.\nShape avoidance: no square base, no rounded-square app background, no free ribbon, no swirl, no S or G letter feeling, no center star.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the hand support and semi-dome clay spirit should be recognizable at 32px.\nVariant focus: sharing intention. The abstract hand is slightly forward-facing, like offering the clay spirit outward, but still very simplified and not realistic." - }, - { - "id": "03-teal-support", - "title": "青绿托线", - "file": "taonier-hand-spirit-03-teal-support.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nMain metaphor: an abstract hand gently holding up and offering a cute soft clay spirit. The logo should communicate creation, sharing, passing forward, and a small idea becoming a lovable playable object.\nLogo type: abstract symbol/icon only. Not a mascot illustration, not an app-icon rounded-square background, not an emblem with text.\nComposition: one highly simplified hand-like support curve or palm base below, holding one soft clay spirit above. The hand must be abstract, smooth, and logo-like, not realistic fingers.\nClay spirit shape: a cute irregular semi-dome / half-blob / rounded arch form, inspired by a simple white arched half-circle silhouette on dark background, but transformed into a friendly original brand symbol.\nThe spirit should be soft and lovable without a face. No eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nThe hand gesture should feel like sharing or gently presenting, not worship, religion, medical care, begging, or holding a food item.\nStyle: modern minimalist vector logo. Clean broad shapes, clear silhouette, fresh bright colors, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make the spirit look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, cream filling, sauce, dessert, or food packaging.\nShape avoidance: no square base, no rounded-square app background, no free ribbon, no swirl, no S or G letter feeling, no center star.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the hand support and semi-dome clay spirit should be recognizable at 32px.\nVariant focus: use a clear soft teal support curve as the hand and a warm peach clay spirit above. Strong color memory, no food look." - }, - { - "id": "04-arched-spirit", - "title": "拱形泥灵", - "file": "taonier-hand-spirit-04-arched-spirit.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nMain metaphor: an abstract hand gently holding up and offering a cute soft clay spirit. The logo should communicate creation, sharing, passing forward, and a small idea becoming a lovable playable object.\nLogo type: abstract symbol/icon only. Not a mascot illustration, not an app-icon rounded-square background, not an emblem with text.\nComposition: one highly simplified hand-like support curve or palm base below, holding one soft clay spirit above. The hand must be abstract, smooth, and logo-like, not realistic fingers.\nClay spirit shape: a cute irregular semi-dome / half-blob / rounded arch form, inspired by a simple white arched half-circle silhouette on dark background, but transformed into a friendly original brand symbol.\nThe spirit should be soft and lovable without a face. No eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nThe hand gesture should feel like sharing or gently presenting, not worship, religion, medical care, begging, or holding a food item.\nStyle: modern minimalist vector logo. Clean broad shapes, clear silhouette, fresh bright colors, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make the spirit look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, cream filling, sauce, dessert, or food packaging.\nShape avoidance: no square base, no rounded-square app background, no free ribbon, no swirl, no S or G letter feeling, no center star.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the hand support and semi-dome clay spirit should be recognizable at 32px.\nVariant focus: emphasize the irregular semi-dome clay spirit shape from the reference: simple arched top, flatter base, slightly organic, no face." - }, - { - "id": "05-playful-offer", - "title": "轻玩递出", - "file": "taonier-hand-spirit-05-playful-offer.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nMain metaphor: an abstract hand gently holding up and offering a cute soft clay spirit. The logo should communicate creation, sharing, passing forward, and a small idea becoming a lovable playable object.\nLogo type: abstract symbol/icon only. Not a mascot illustration, not an app-icon rounded-square background, not an emblem with text.\nComposition: one highly simplified hand-like support curve or palm base below, holding one soft clay spirit above. The hand must be abstract, smooth, and logo-like, not realistic fingers.\nClay spirit shape: a cute irregular semi-dome / half-blob / rounded arch form, inspired by a simple white arched half-circle silhouette on dark background, but transformed into a friendly original brand symbol.\nThe spirit should be soft and lovable without a face. No eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nThe hand gesture should feel like sharing or gently presenting, not worship, religion, medical care, begging, or holding a food item.\nStyle: modern minimalist vector logo. Clean broad shapes, clear silhouette, fresh bright colors, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make the spirit look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, cream filling, sauce, dessert, or food packaging.\nShape avoidance: no square base, no rounded-square app background, no free ribbon, no swirl, no S or G letter feeling, no center star.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the hand support and semi-dome clay spirit should be recognizable at 32px.\nVariant focus: more playful and lively. The hand support suggests passing the spirit forward, with one broad curve only. Avoid decorative tiny details." - }, - { - "id": "06-monochrome-first", - "title": "黑白优先", - "file": "taonier-hand-spirit-06-monochrome-first.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nMain metaphor: an abstract hand gently holding up and offering a cute soft clay spirit. The logo should communicate creation, sharing, passing forward, and a small idea becoming a lovable playable object.\nLogo type: abstract symbol/icon only. Not a mascot illustration, not an app-icon rounded-square background, not an emblem with text.\nComposition: one highly simplified hand-like support curve or palm base below, holding one soft clay spirit above. The hand must be abstract, smooth, and logo-like, not realistic fingers.\nClay spirit shape: a cute irregular semi-dome / half-blob / rounded arch form, inspired by a simple white arched half-circle silhouette on dark background, but transformed into a friendly original brand symbol.\nThe spirit should be soft and lovable without a face. No eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nThe hand gesture should feel like sharing or gently presenting, not worship, religion, medical care, begging, or holding a food item.\nStyle: modern minimalist vector logo. Clean broad shapes, clear silhouette, fresh bright colors, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make the spirit look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, cream filling, sauce, dessert, or food packaging.\nShape avoidance: no square base, no rounded-square app background, no free ribbon, no swirl, no S or G letter feeling, no center star.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the hand support and semi-dome clay spirit should be recognizable at 32px.\nVariant focus: design for black-and-white survival first. Use strong positive and negative shapes so the hand and spirit remain readable without color." - }, - { - "id": "07-avatar-readable", - "title": "头像可读", - "file": "taonier-hand-spirit-07-avatar-readable.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nMain metaphor: an abstract hand gently holding up and offering a cute soft clay spirit. The logo should communicate creation, sharing, passing forward, and a small idea becoming a lovable playable object.\nLogo type: abstract symbol/icon only. Not a mascot illustration, not an app-icon rounded-square background, not an emblem with text.\nComposition: one highly simplified hand-like support curve or palm base below, holding one soft clay spirit above. The hand must be abstract, smooth, and logo-like, not realistic fingers.\nClay spirit shape: a cute irregular semi-dome / half-blob / rounded arch form, inspired by a simple white arched half-circle silhouette on dark background, but transformed into a friendly original brand symbol.\nThe spirit should be soft and lovable without a face. No eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nThe hand gesture should feel like sharing or gently presenting, not worship, religion, medical care, begging, or holding a food item.\nStyle: modern minimalist vector logo. Clean broad shapes, clear silhouette, fresh bright colors, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make the spirit look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, cream filling, sauce, dessert, or food packaging.\nShape avoidance: no square base, no rounded-square app background, no free ribbon, no swirl, no S or G letter feeling, no center star.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the hand support and semi-dome clay spirit should be recognizable at 32px.\nVariant focus: social avatar and favicon readability. Compact, bold silhouette, thicker hand curve, larger semi-dome spirit, no small parts." - }, - { - "id": "08-vector-ready", - "title": "矢量定稿感", - "file": "taonier-hand-spirit-08-vector-ready.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nMain metaphor: an abstract hand gently holding up and offering a cute soft clay spirit. The logo should communicate creation, sharing, passing forward, and a small idea becoming a lovable playable object.\nLogo type: abstract symbol/icon only. Not a mascot illustration, not an app-icon rounded-square background, not an emblem with text.\nComposition: one highly simplified hand-like support curve or palm base below, holding one soft clay spirit above. The hand must be abstract, smooth, and logo-like, not realistic fingers.\nClay spirit shape: a cute irregular semi-dome / half-blob / rounded arch form, inspired by a simple white arched half-circle silhouette on dark background, but transformed into a friendly original brand symbol.\nThe spirit should be soft and lovable without a face. No eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nThe hand gesture should feel like sharing or gently presenting, not worship, religion, medical care, begging, or holding a food item.\nStyle: modern minimalist vector logo. Clean broad shapes, clear silhouette, fresh bright colors, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make the spirit look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, cream filling, sauce, dessert, or food packaging.\nShape avoidance: no square base, no rounded-square app background, no free ribbon, no swirl, no S or G letter feeling, no center star.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the hand support and semi-dome clay spirit should be recognizable at 32px.\nVariant focus: designer-ready vector concept. 2-3 flat shapes, crisp boundaries, distinctive hand-support and clay-spirit silhouette, minimal material cue." - } - ] -} diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-01-dusty-rose-sage.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-01-dusty-rose-sage.png deleted file mode 100644 index 5f7f0199..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-01-dusty-rose-sage.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-02-smoke-blue-apricot.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-02-smoke-blue-apricot.png deleted file mode 100644 index cc05337c..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-02-smoke-blue-apricot.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-03-misty-lilac-clay.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-03-misty-lilac-clay.png deleted file mode 100644 index 8fb67ab9..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-03-misty-lilac-clay.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-04-butter-rose-tea.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-04-butter-rose-tea.png deleted file mode 100644 index 4c40e54e..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-04-butter-rose-tea.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-05-clay-blue-mint.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-05-clay-blue-mint.png deleted file mode 100644 index c10a8134..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-05-clay-blue-mint.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-06-powder-berry-cloud.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-06-powder-berry-cloud.png deleted file mode 100644 index 5098f639..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-06-powder-berry-cloud.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-07-sand-violet.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-07-sand-violet.png deleted file mode 100644 index 80c5d6ab..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-07-sand-violet.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-08-muted-duotone.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-08-muted-duotone.png deleted file mode 100644 index be7d9c0d..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-08-muted-duotone.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-contact-sheet.png b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-contact-sheet.png deleted file mode 100644 index c31e9b03..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-manifest.json b/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-manifest.json deleted file mode 100644 index 335ee780..00000000 --- a/public/branding/taonier-logo-hand-spirit-muted-color-concepts/taonier-hand-spirit-muted-color-manifest.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "model": "gpt-image-2", - "endpoint": "/v1/images/edits", - "size": "1024x1024", - "referenceImage": "public\\branding\\taonier-logo-hand-spirit-ref01-logo-refine-concepts\\taonier-hand-spirit-ref01-logo-refine-01-flat-coral-cream.png", - "generatedAt": "2026-05-18T08:25:13.194Z", - "brief": { - "brand": "陶泥儿", - "goal": "低饱和度但不寡淡的年轻向颜色探索", - "keep": "保留托举曲线与半球灵体结构,不加文字、不加脸、不加星星" - }, - "variants": [ - { - "id": "01-dusty-rose-sage", - "title": "雾玫鼠尾草", - "file": "taonier-hand-spirit-muted-color-01-dusty-rose-sage.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a low-saturation color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is softer, more tasteful, more wearable brand color. The palette should feel like a modern lifestyle brand, not a toy, candy, dessert, or cosmetics ad.\nUse muted but attractive colors: dusty rose, misty lavender, sage green, smoke blue, butter cream, muted coral, terracotta clay, pale apricot. Keep the image warm and youthful without becoming loud.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: dusty rose semi-dome, sage green support curve, warm ivory gap. Soft, modern, and feminine without being sweet." - }, - { - "id": "02-smoke-blue-apricot", - "title": "烟蓝杏橙", - "file": "taonier-hand-spirit-muted-color-02-smoke-blue-apricot.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a low-saturation color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is softer, more tasteful, more wearable brand color. The palette should feel like a modern lifestyle brand, not a toy, candy, dessert, or cosmetics ad.\nUse muted but attractive colors: dusty rose, misty lavender, sage green, smoke blue, butter cream, muted coral, terracotta clay, pale apricot. Keep the image warm and youthful without becoming loud.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: smoke blue support curve, pale apricot or muted peach semi-dome, cream separator. Calm, fresh, and suitable for young users." - }, - { - "id": "03-misty-lilac-clay", - "title": "雾紫陶土", - "file": "taonier-hand-spirit-muted-color-03-misty-lilac-clay.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a low-saturation color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is softer, more tasteful, more wearable brand color. The palette should feel like a modern lifestyle brand, not a toy, candy, dessert, or cosmetics ad.\nUse muted but attractive colors: dusty rose, misty lavender, sage green, smoke blue, butter cream, muted coral, terracotta clay, pale apricot. Keep the image warm and youthful without becoming loud.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: misty lilac support, soft terracotta clay spirit, off-white negative space. More boutique and refined, not purple-tech." - }, - { - "id": "04-butter-rose-tea", - "title": "黄油玫瑰茶", - "file": "taonier-hand-spirit-muted-color-04-butter-rose-tea.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a low-saturation color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is softer, more tasteful, more wearable brand color. The palette should feel like a modern lifestyle brand, not a toy, candy, dessert, or cosmetics ad.\nUse muted but attractive colors: dusty rose, misty lavender, sage green, smoke blue, butter cream, muted coral, terracotta clay, pale apricot. Keep the image warm and youthful without becoming loud.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: butter cream spirit, muted rose support curve, faint tea-green accent. Gentle, cozy, and premium with low saturation." - }, - { - "id": "05-clay-blue-mint", - "title": "陶蓝薄荷", - "file": "taonier-hand-spirit-muted-color-05-clay-blue-mint.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a low-saturation color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is softer, more tasteful, more wearable brand color. The palette should feel like a modern lifestyle brand, not a toy, candy, dessert, or cosmetics ad.\nUse muted but attractive colors: dusty rose, misty lavender, sage green, smoke blue, butter cream, muted coral, terracotta clay, pale apricot. Keep the image warm and youthful without becoming loud.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: clay orange or muted coral semi-dome, powder blue support, tiny mint accent. Softly playful but not heavy." - }, - { - "id": "06-powder-berry-cloud", - "title": "粉雾浆果", - "file": "taonier-hand-spirit-muted-color-06-powder-berry-cloud.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a low-saturation color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is softer, more tasteful, more wearable brand color. The palette should feel like a modern lifestyle brand, not a toy, candy, dessert, or cosmetics ad.\nUse muted but attractive colors: dusty rose, misty lavender, sage green, smoke blue, butter cream, muted coral, terracotta clay, pale apricot. Keep the image warm and youthful without becoming loud.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: powder berry semi-dome, cloud pink support curve, warm cream gap. Youthful, gentle, and more like a boutique brand than a toy." - }, - { - "id": "07-sand-violet", - "title": "砂紫奶雾", - "file": "taonier-hand-spirit-muted-color-07-sand-violet.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a low-saturation color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is softer, more tasteful, more wearable brand color. The palette should feel like a modern lifestyle brand, not a toy, candy, dessert, or cosmetics ad.\nUse muted but attractive colors: dusty rose, misty lavender, sage green, smoke blue, butter cream, muted coral, terracotta clay, pale apricot. Keep the image warm and youthful without becoming loud.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette: sand beige or pale almond spirit, muted violet support curve, soft cream separator. Quiet, tasteful, and logo-ready." - }, - { - "id": "08-muted-duotone", - "title": "低饱双色", - "file": "taonier-hand-spirit-muted-color-08-muted-duotone.png", - "prompt": "Use the uploaded logo as the structural reference. Keep the same icon-only mark structure: a soft semi-dome clay spirit above a smooth abstract hand-like support curve.\nCreate a low-saturation color exploration for a young women-friendly brand logo. No Chinese, no English, no letters, no numbers, no wordmark, no tagline, no text.\nPreserve the existing logo proportions, centered composition, abstract hand support, semi-dome spirit shape, and clean logo silhouette. Do not add a face, eyes, mouth, limbs, star, spark, UI, border, or watermark.\nThe goal is softer, more tasteful, more wearable brand color. The palette should feel like a modern lifestyle brand, not a toy, candy, dessert, or cosmetics ad.\nUse muted but attractive colors: dusty rose, misty lavender, sage green, smoke blue, butter cream, muted coral, terracotta clay, pale apricot. Keep the image warm and youthful without becoming loud.\nMake it flatter and clearer than the original reference: broad vector-friendly shapes, crisp edges, minimal gradients, no glossy highlight unless the variant explicitly asks for a subtle polish.\nKeep 32px readability and black-white viability. The mark must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nPalette and style: two-color muted duotone only. Use one subdued warm hue and one subdued cool hue. No shiny gloss, no intense contrast, no candy feeling." - } - ] -} diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-01-thin-outline-small-eyes.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-01-thin-outline-small-eyes.png deleted file mode 100644 index 9337613e..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-01-thin-outline-small-eyes.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-02-medium-outline-round-eyes.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-02-medium-outline-round-eyes.png deleted file mode 100644 index 3e064048..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-02-medium-outline-round-eyes.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-03-bold-outline-higher-eyes.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-03-bold-outline-higher-eyes.png deleted file mode 100644 index 98d05f8a..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-03-bold-outline-higher-eyes.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-04-warm-cocoa-outline.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-04-warm-cocoa-outline.png deleted file mode 100644 index aaf00a1a..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-04-warm-cocoa-outline.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-05-compact-avatar-cute.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-05-compact-avatar-cute.png deleted file mode 100644 index fffabed2..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-05-compact-avatar-cute.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-06-black-white-first.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-06-black-white-first.png deleted file mode 100644 index 52923768..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-06-black-white-first.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-07-soft-feminine-cute.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-07-soft-feminine-cute.png deleted file mode 100644 index 1b1cc20b..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-07-soft-feminine-cute.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-08-vector-ready-cute.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-08-vector-ready-cute.png deleted file mode 100644 index a70e5074..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-08-vector-ready-cute.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-contact-sheet.png b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-contact-sheet.png deleted file mode 100644 index 73cce156..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-manifest.json b/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-manifest.json deleted file mode 100644 index 26fc6d1a..00000000 --- a/public/branding/taonier-logo-hand-spirit-outline-eye-concepts/taonier-hand-spirit-outline-eye-manifest.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "model": "gpt-image-2", - "endpoint": "/v1/images/edits", - "size": "1024x1024", - "referenceImage": "public\\branding\\taonier-logo-hand-spirit-ref01-logo-refine-concepts\\taonier-hand-spirit-ref01-logo-refine-01-flat-coral-cream.png", - "generatedAt": "2026-05-18T08:56:23.597Z", - "brief": { - "brand": "陶泥儿", - "goal": "在上轮 01 的基础上加入描边和黑点眼睛,让标志更可爱", - "keep": "保留托举曲线与半球灵体结构,不加文字、不加星星、不改骨架" - }, - "variants": [ - { - "id": "01-thin-outline-small-eyes", - "title": "细描边小眼", - "file": "taonier-hand-spirit-outline-eye-01-thin-outline-small-eyes.png", - "prompt": "Use the uploaded logo as the exact structural reference. Keep the same icon-only composition: a soft semi-dome spirit above a smooth abstract hand-like support curve.\nCreate a cuter, more logo-like refinement. Add a clean outline around the whole symbol, and add two pure matte black dot eyes to the upper semi-dome part only.\nThe eyes must belong to the upper half-circle spirit, not the lower support curve. No nose, no mouth, no eyebrows, no blush, no limbs, no character body, no star, no spark, no text.\nDo not redesign the overall structure. Keep the same proportions, centered layout, and soft brand silhouette. Only make it more cute, more memorable, and more trademark-like.\nThe outline should feel clean, friendly, and brand-ready, not sticker-like, not cartoonish, not too thick unless the variant asks for it.\nUse the same soft warm palette family as the reference, but allow subtle low-saturation tweaks to improve charm and contrast. Keep it elegant and youthful, not loud.\nKeep 32px readability and black-white viability. It must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nVariant focus: the most restrained cute version. Use a thin warm outline and small matte black dot eyes with calm spacing." - }, - { - "id": "02-medium-outline-round-eyes", - "title": "中描边圆眼", - "file": "taonier-hand-spirit-outline-eye-02-medium-outline-round-eyes.png", - "prompt": "Use the uploaded logo as the exact structural reference. Keep the same icon-only composition: a soft semi-dome spirit above a smooth abstract hand-like support curve.\nCreate a cuter, more logo-like refinement. Add a clean outline around the whole symbol, and add two pure matte black dot eyes to the upper semi-dome part only.\nThe eyes must belong to the upper half-circle spirit, not the lower support curve. No nose, no mouth, no eyebrows, no blush, no limbs, no character body, no star, no spark, no text.\nDo not redesign the overall structure. Keep the same proportions, centered layout, and soft brand silhouette. Only make it more cute, more memorable, and more trademark-like.\nThe outline should feel clean, friendly, and brand-ready, not sticker-like, not cartoonish, not too thick unless the variant asks for it.\nUse the same soft warm palette family as the reference, but allow subtle low-saturation tweaks to improve charm and contrast. Keep it elegant and youthful, not loud.\nKeep 32px readability and black-white viability. It must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nVariant focus: medium outline thickness and slightly rounder dot eyes. Make the face read a touch more openly cute, but still minimal." - }, - { - "id": "03-bold-outline-higher-eyes", - "title": "粗描边高眼", - "file": "taonier-hand-spirit-outline-eye-03-bold-outline-higher-eyes.png", - "prompt": "Use the uploaded logo as the exact structural reference. Keep the same icon-only composition: a soft semi-dome spirit above a smooth abstract hand-like support curve.\nCreate a cuter, more logo-like refinement. Add a clean outline around the whole symbol, and add two pure matte black dot eyes to the upper semi-dome part only.\nThe eyes must belong to the upper half-circle spirit, not the lower support curve. No nose, no mouth, no eyebrows, no blush, no limbs, no character body, no star, no spark, no text.\nDo not redesign the overall structure. Keep the same proportions, centered layout, and soft brand silhouette. Only make it more cute, more memorable, and more trademark-like.\nThe outline should feel clean, friendly, and brand-ready, not sticker-like, not cartoonish, not too thick unless the variant asks for it.\nUse the same soft warm palette family as the reference, but allow subtle low-saturation tweaks to improve charm and contrast. Keep it elegant and youthful, not loud.\nKeep 32px readability and black-white viability. It must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nVariant focus: stronger bold outline and eyes placed a little higher on the upper dome, creating a sweeter peeking expression." - }, - { - "id": "04-warm-cocoa-outline", - "title": "暖可可描边", - "file": "taonier-hand-spirit-outline-eye-04-warm-cocoa-outline.png", - "prompt": "Use the uploaded logo as the exact structural reference. Keep the same icon-only composition: a soft semi-dome spirit above a smooth abstract hand-like support curve.\nCreate a cuter, more logo-like refinement. Add a clean outline around the whole symbol, and add two pure matte black dot eyes to the upper semi-dome part only.\nThe eyes must belong to the upper half-circle spirit, not the lower support curve. No nose, no mouth, no eyebrows, no blush, no limbs, no character body, no star, no spark, no text.\nDo not redesign the overall structure. Keep the same proportions, centered layout, and soft brand silhouette. Only make it more cute, more memorable, and more trademark-like.\nThe outline should feel clean, friendly, and brand-ready, not sticker-like, not cartoonish, not too thick unless the variant asks for it.\nUse the same soft warm palette family as the reference, but allow subtle low-saturation tweaks to improve charm and contrast. Keep it elegant and youthful, not loud.\nKeep 32px readability and black-white viability. It must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nVariant focus: use a warm cocoa or deep beige outline that makes the logo feel softer and more plush, with small centered black eyes." - }, - { - "id": "05-compact-avatar-cute", - "title": "头像可爱款", - "file": "taonier-hand-spirit-outline-eye-05-compact-avatar-cute.png", - "prompt": "Use the uploaded logo as the exact structural reference. Keep the same icon-only composition: a soft semi-dome spirit above a smooth abstract hand-like support curve.\nCreate a cuter, more logo-like refinement. Add a clean outline around the whole symbol, and add two pure matte black dot eyes to the upper semi-dome part only.\nThe eyes must belong to the upper half-circle spirit, not the lower support curve. No nose, no mouth, no eyebrows, no blush, no limbs, no character body, no star, no spark, no text.\nDo not redesign the overall structure. Keep the same proportions, centered layout, and soft brand silhouette. Only make it more cute, more memorable, and more trademark-like.\nThe outline should feel clean, friendly, and brand-ready, not sticker-like, not cartoonish, not too thick unless the variant asks for it.\nUse the same soft warm palette family as the reference, but allow subtle low-saturation tweaks to improve charm and contrast. Keep it elegant and youthful, not loud.\nKeep 32px readability and black-white viability. It must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nVariant focus: compact avatar readability. Enlarge the upper dome slightly, keep the hand support bold, and make the eyes more visible without adding any mouth." - }, - { - "id": "06-black-white-first", - "title": "黑白优先", - "file": "taonier-hand-spirit-outline-eye-06-black-white-first.png", - "prompt": "Use the uploaded logo as the exact structural reference. Keep the same icon-only composition: a soft semi-dome spirit above a smooth abstract hand-like support curve.\nCreate a cuter, more logo-like refinement. Add a clean outline around the whole symbol, and add two pure matte black dot eyes to the upper semi-dome part only.\nThe eyes must belong to the upper half-circle spirit, not the lower support curve. No nose, no mouth, no eyebrows, no blush, no limbs, no character body, no star, no spark, no text.\nDo not redesign the overall structure. Keep the same proportions, centered layout, and soft brand silhouette. Only make it more cute, more memorable, and more trademark-like.\nThe outline should feel clean, friendly, and brand-ready, not sticker-like, not cartoonish, not too thick unless the variant asks for it.\nUse the same soft warm palette family as the reference, but allow subtle low-saturation tweaks to improve charm and contrast. Keep it elegant and youthful, not loud.\nKeep 32px readability and black-white viability. It must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nVariant focus: black-and-white survival first. Make the outline and the eyes work clearly even if all color is removed. Very strong logo readability." - }, - { - "id": "07-soft-feminine-cute", - "title": "柔和少女感", - "file": "taonier-hand-spirit-outline-eye-07-soft-feminine-cute.png", - "prompt": "Use the uploaded logo as the exact structural reference. Keep the same icon-only composition: a soft semi-dome spirit above a smooth abstract hand-like support curve.\nCreate a cuter, more logo-like refinement. Add a clean outline around the whole symbol, and add two pure matte black dot eyes to the upper semi-dome part only.\nThe eyes must belong to the upper half-circle spirit, not the lower support curve. No nose, no mouth, no eyebrows, no blush, no limbs, no character body, no star, no spark, no text.\nDo not redesign the overall structure. Keep the same proportions, centered layout, and soft brand silhouette. Only make it more cute, more memorable, and more trademark-like.\nThe outline should feel clean, friendly, and brand-ready, not sticker-like, not cartoonish, not too thick unless the variant asks for it.\nUse the same soft warm palette family as the reference, but allow subtle low-saturation tweaks to improve charm and contrast. Keep it elegant and youthful, not loud.\nKeep 32px readability and black-white viability. It must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nVariant focus: a softer feminine-cute version. Keep the outline elegant and the eyes gentle; the whole mark should feel like a friendly brand mascot symbol." - }, - { - "id": "08-vector-ready-cute", - "title": "矢量定稿感", - "file": "taonier-hand-spirit-outline-eye-08-vector-ready-cute.png", - "prompt": "Use the uploaded logo as the exact structural reference. Keep the same icon-only composition: a soft semi-dome spirit above a smooth abstract hand-like support curve.\nCreate a cuter, more logo-like refinement. Add a clean outline around the whole symbol, and add two pure matte black dot eyes to the upper semi-dome part only.\nThe eyes must belong to the upper half-circle spirit, not the lower support curve. No nose, no mouth, no eyebrows, no blush, no limbs, no character body, no star, no spark, no text.\nDo not redesign the overall structure. Keep the same proportions, centered layout, and soft brand silhouette. Only make it more cute, more memorable, and more trademark-like.\nThe outline should feel clean, friendly, and brand-ready, not sticker-like, not cartoonish, not too thick unless the variant asks for it.\nUse the same soft warm palette family as the reference, but allow subtle low-saturation tweaks to improve charm and contrast. Keep it elegant and youthful, not loud.\nKeep 32px readability and black-white viability. It must still work as an app icon, social avatar, and trademark symbol.\nClean light background, generous safe area. Image-only logo concept.\nVariant focus: designer-ready vector concept. Clean crisp outline, balanced eye spacing, no decorative detail, very easy to trace into an SVG mark." - } - ] -} diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-01-flat-coral-cream.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-01-flat-coral-cream.png deleted file mode 100644 index ec552a7d..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-01-flat-coral-cream.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-02-warm-clay-premium.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-02-warm-clay-premium.png deleted file mode 100644 index dd5f35f2..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-02-warm-clay-premium.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-03-mint-support.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-03-mint-support.png deleted file mode 100644 index 8b3e5d06..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-03-mint-support.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-04-outline-vector.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-04-outline-vector.png deleted file mode 100644 index 2b8aba02..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-04-outline-vector.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-05-abstract-two-shape.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-05-abstract-two-shape.png deleted file mode 100644 index 5237ee53..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-05-abstract-two-shape.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-06-monochrome-first.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-06-monochrome-first.png deleted file mode 100644 index 713b2e33..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-06-monochrome-first.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-07-soft-gradient-premium.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-07-soft-gradient-premium.png deleted file mode 100644 index 49f19aff..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-07-soft-gradient-premium.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-08-compact-avatar.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-08-compact-avatar.png deleted file mode 100644 index 49a54015..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-hand-spirit-ref01-logo-refine-08-compact-avatar.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-logo-hand-spirit-ref01-logo-refine-contact-sheet.png b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-logo-hand-spirit-ref01-logo-refine-contact-sheet.png deleted file mode 100644 index 11fdd96a..00000000 Binary files a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-logo-hand-spirit-ref01-logo-refine-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-logo-hand-spirit-ref01-logo-refine-manifest.json b/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-logo-hand-spirit-ref01-logo-refine-manifest.json deleted file mode 100644 index 0a6922b8..00000000 --- a/public/branding/taonier-logo-hand-spirit-ref01-logo-refine-concepts/taonier-logo-hand-spirit-ref01-logo-refine-manifest.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "model": "gpt-image-2", - "endpoint": "/v1/images/edits", - "size": "1024x1024", - "referenceImage": "public\\branding\\taonier-logo-hand-spirit-concepts\\taonier-hand-spirit-01-gentle-hand-spirit.png", - "generatedAt": "2026-05-18T07:29:31.615Z", - "logoSkillSummary": { - "requiredReview": "visual inspection, 32px readability, black-white viability", - "outputStatus": "AI concept only; final logo needs vector cleanup" - }, - "brief": { - "brand": "陶泥儿", - "source": "基于 taonier-hand-spirit-01-gentle-hand-spirit 做商标化探索", - "logoType": "symbol/icon-only mark, no wordmark", - "product": "AI UGC 轻休闲小游戏创作与传播平台,用户把脑洞、梗和灵感塑造成可分享的作品", - "keep": [ - "上方软萌半球陶泥灵体", - "下方抽象托举手势/掌形曲线", - "托举、传递、分享的动作语义", - "无脸、无文字、无星星", - "亲和、精品、可用于商标和 App 图标" - ], - "explore": [ - "更扁平的纯色块版本", - "更精品的低饱和陶器色版本", - "更强线面结构版本", - "更抽象、更少形状的版本", - "更适合 32px 和黑白化的版本" - ], - "avoid": [ - "中文或英文字", - "眼睛、嘴巴、表情、角色身体", - "星星、闪光、魔法符号", - "真实手指、宗教托举、医疗护理感", - "面包、甜点、糖果、果冻、奶油、食物包装", - "复杂背景、边框、UI、按钮、水印" - ] - }, - "variants": [ - { - "id": "01-flat-coral-cream", - "title": "扁平珊瑚奶白", - "file": "taonier-hand-spirit-ref01-logo-refine-01-flat-coral-cream.png", - "prompt": "Use the uploaded reference image as the composition and shape reference. Keep the same core structure: an abstract hand-like support curve below, gently holding a soft semi-dome clay spirit above.\nCreate a refined icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nPreserve the brand idea: fun creation, sharing, passing a small playable idea forward. The mark should feel like a small creative object being gently offered, not a scene or illustration.\nKeep the subject face-free: no eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nMake it more like a trademark and logo than the reference: fewer shapes, cleaner silhouette, clearer positive/negative structure, more vector-friendly curves, broad flat color regions, less glossy highlight, less painterly shadow.\nThe hand must remain abstract: a smooth palm-like support curve or bowl-like gesture, not realistic fingers, not a real human hand, not worship, not medical care.\nThe spirit must remain a soft irregular semi-dome or rounded clay core. It should not become a planet, helmet, bread, bun, mochi, dumpling, pastry, candy, jelly, sauce, dessert, or food package.\nStyle target: premium friendly logo mark, all-age and women-friendly, warm but not childish, suitable for app icon, social avatar, and trademark review.\nComposition: centered on a clean light background with generous safe area. Strong readable silhouette first. It must still read at 32px and in black and white.\nAvoid UI, border, sticker outline unless explicitly requested by the variant, background scene, watermark, extra marks, and any text.\nVariant focus: the most direct flat-logo refinement. Use coral-orange clay spirit and cream hand support. Reduce the glossy highlight to nearly zero. Use 3-4 crisp flat shapes only." - }, - { - "id": "02-warm-clay-premium", - "title": "暖陶精品色", - "file": "taonier-hand-spirit-ref01-logo-refine-02-warm-clay-premium.png", - "prompt": "Use the uploaded reference image as the composition and shape reference. Keep the same core structure: an abstract hand-like support curve below, gently holding a soft semi-dome clay spirit above.\nCreate a refined icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nPreserve the brand idea: fun creation, sharing, passing a small playable idea forward. The mark should feel like a small creative object being gently offered, not a scene or illustration.\nKeep the subject face-free: no eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nMake it more like a trademark and logo than the reference: fewer shapes, cleaner silhouette, clearer positive/negative structure, more vector-friendly curves, broad flat color regions, less glossy highlight, less painterly shadow.\nThe hand must remain abstract: a smooth palm-like support curve or bowl-like gesture, not realistic fingers, not a real human hand, not worship, not medical care.\nThe spirit must remain a soft irregular semi-dome or rounded clay core. It should not become a planet, helmet, bread, bun, mochi, dumpling, pastry, candy, jelly, sauce, dessert, or food package.\nStyle target: premium friendly logo mark, all-age and women-friendly, warm but not childish, suitable for app icon, social avatar, and trademark review.\nComposition: centered on a clean light background with generous safe area. Strong readable silhouette first. It must still read at 32px and in black and white.\nAvoid UI, border, sticker outline unless explicitly requested by the variant, background scene, watermark, extra marks, and any text.\nVariant focus: warmer boutique clay palette. Muted terracotta, soft sand, and warm ivory. More mature and premium, with a compact iconic silhouette and no candy gloss." - }, - { - "id": "03-mint-support", - "title": "青绿托举线", - "file": "taonier-hand-spirit-ref01-logo-refine-03-mint-support.png", - "prompt": "Use the uploaded reference image as the composition and shape reference. Keep the same core structure: an abstract hand-like support curve below, gently holding a soft semi-dome clay spirit above.\nCreate a refined icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nPreserve the brand idea: fun creation, sharing, passing a small playable idea forward. The mark should feel like a small creative object being gently offered, not a scene or illustration.\nKeep the subject face-free: no eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nMake it more like a trademark and logo than the reference: fewer shapes, cleaner silhouette, clearer positive/negative structure, more vector-friendly curves, broad flat color regions, less glossy highlight, less painterly shadow.\nThe hand must remain abstract: a smooth palm-like support curve or bowl-like gesture, not realistic fingers, not a real human hand, not worship, not medical care.\nThe spirit must remain a soft irregular semi-dome or rounded clay core. It should not become a planet, helmet, bread, bun, mochi, dumpling, pastry, candy, jelly, sauce, dessert, or food package.\nStyle target: premium friendly logo mark, all-age and women-friendly, warm but not childish, suitable for app icon, social avatar, and trademark review.\nComposition: centered on a clean light background with generous safe area. Strong readable silhouette first. It must still read at 32px and in black and white.\nAvoid UI, border, sticker outline unless explicitly requested by the variant, background scene, watermark, extra marks, and any text.\nVariant focus: stronger color memory. Use a clear muted teal or mint support curve as the hand and a warm peach clay spirit above. Keep it flat, balanced, and not cosmetic." - }, - { - "id": "04-outline-vector", - "title": "线面商标", - "file": "taonier-hand-spirit-ref01-logo-refine-04-outline-vector.png", - "prompt": "Use the uploaded reference image as the composition and shape reference. Keep the same core structure: an abstract hand-like support curve below, gently holding a soft semi-dome clay spirit above.\nCreate a refined icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nPreserve the brand idea: fun creation, sharing, passing a small playable idea forward. The mark should feel like a small creative object being gently offered, not a scene or illustration.\nKeep the subject face-free: no eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nMake it more like a trademark and logo than the reference: fewer shapes, cleaner silhouette, clearer positive/negative structure, more vector-friendly curves, broad flat color regions, less glossy highlight, less painterly shadow.\nThe hand must remain abstract: a smooth palm-like support curve or bowl-like gesture, not realistic fingers, not a real human hand, not worship, not medical care.\nThe spirit must remain a soft irregular semi-dome or rounded clay core. It should not become a planet, helmet, bread, bun, mochi, dumpling, pastry, candy, jelly, sauce, dessert, or food package.\nStyle target: premium friendly logo mark, all-age and women-friendly, warm but not childish, suitable for app icon, social avatar, and trademark review.\nComposition: centered on a clean light background with generous safe area. Strong readable silhouette first. It must still read at 32px and in black and white.\nAvoid UI, border, sticker outline unless explicitly requested by the variant, background scene, watermark, extra marks, and any text.\nVariant focus: bolder trademark construction. Use a clean warm-brown contour line combined with flat fills. The outline should clarify the hand and spirit silhouette, modern rather than sticker-like." - }, - { - "id": "05-abstract-two-shape", - "title": "双形抽象", - "file": "taonier-hand-spirit-ref01-logo-refine-05-abstract-two-shape.png", - "prompt": "Use the uploaded reference image as the composition and shape reference. Keep the same core structure: an abstract hand-like support curve below, gently holding a soft semi-dome clay spirit above.\nCreate a refined icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nPreserve the brand idea: fun creation, sharing, passing a small playable idea forward. The mark should feel like a small creative object being gently offered, not a scene or illustration.\nKeep the subject face-free: no eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nMake it more like a trademark and logo than the reference: fewer shapes, cleaner silhouette, clearer positive/negative structure, more vector-friendly curves, broad flat color regions, less glossy highlight, less painterly shadow.\nThe hand must remain abstract: a smooth palm-like support curve or bowl-like gesture, not realistic fingers, not a real human hand, not worship, not medical care.\nThe spirit must remain a soft irregular semi-dome or rounded clay core. It should not become a planet, helmet, bread, bun, mochi, dumpling, pastry, candy, jelly, sauce, dessert, or food package.\nStyle target: premium friendly logo mark, all-age and women-friendly, warm but not childish, suitable for app icon, social avatar, and trademark review.\nComposition: centered on a clean light background with generous safe area. Strong readable silhouette first. It must still read at 32px and in black and white.\nAvoid UI, border, sticker outline unless explicitly requested by the variant, background scene, watermark, extra marks, and any text.\nVariant focus: higher abstraction. Reduce the mark to two dominant shapes: one semi-dome spirit and one sweeping hand support. Remove highlight details. Make the silhouette distinctive and vector-ready." - }, - { - "id": "06-monochrome-first", - "title": "黑白优先", - "file": "taonier-hand-spirit-ref01-logo-refine-06-monochrome-first.png", - "prompt": "Use the uploaded reference image as the composition and shape reference. Keep the same core structure: an abstract hand-like support curve below, gently holding a soft semi-dome clay spirit above.\nCreate a refined icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nPreserve the brand idea: fun creation, sharing, passing a small playable idea forward. The mark should feel like a small creative object being gently offered, not a scene or illustration.\nKeep the subject face-free: no eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nMake it more like a trademark and logo than the reference: fewer shapes, cleaner silhouette, clearer positive/negative structure, more vector-friendly curves, broad flat color regions, less glossy highlight, less painterly shadow.\nThe hand must remain abstract: a smooth palm-like support curve or bowl-like gesture, not realistic fingers, not a real human hand, not worship, not medical care.\nThe spirit must remain a soft irregular semi-dome or rounded clay core. It should not become a planet, helmet, bread, bun, mochi, dumpling, pastry, candy, jelly, sauce, dessert, or food package.\nStyle target: premium friendly logo mark, all-age and women-friendly, warm but not childish, suitable for app icon, social avatar, and trademark review.\nComposition: centered on a clean light background with generous safe area. Strong readable silhouette first. It must still read at 32px and in black and white.\nAvoid UI, border, sticker outline unless explicitly requested by the variant, background scene, watermark, extra marks, and any text.\nVariant focus: black-and-white survival first. Design with strong positive and negative shapes; color may be warm clay, but the mark must remain clear as a pure monochrome logo." - }, - { - "id": "07-soft-gradient-premium", - "title": "轻渐变精品", - "file": "taonier-hand-spirit-ref01-logo-refine-07-soft-gradient-premium.png", - "prompt": "Use the uploaded reference image as the composition and shape reference. Keep the same core structure: an abstract hand-like support curve below, gently holding a soft semi-dome clay spirit above.\nCreate a refined icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nPreserve the brand idea: fun creation, sharing, passing a small playable idea forward. The mark should feel like a small creative object being gently offered, not a scene or illustration.\nKeep the subject face-free: no eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nMake it more like a trademark and logo than the reference: fewer shapes, cleaner silhouette, clearer positive/negative structure, more vector-friendly curves, broad flat color regions, less glossy highlight, less painterly shadow.\nThe hand must remain abstract: a smooth palm-like support curve or bowl-like gesture, not realistic fingers, not a real human hand, not worship, not medical care.\nThe spirit must remain a soft irregular semi-dome or rounded clay core. It should not become a planet, helmet, bread, bun, mochi, dumpling, pastry, candy, jelly, sauce, dessert, or food package.\nStyle target: premium friendly logo mark, all-age and women-friendly, warm but not childish, suitable for app icon, social avatar, and trademark review.\nComposition: centered on a clean light background with generous safe area. Strong readable silhouette first. It must still read at 32px and in black and white.\nAvoid UI, border, sticker outline unless explicitly requested by the variant, background scene, watermark, extra marks, and any text.\nVariant focus: a polished but still logo-like version. Allow only very subtle broad gradients for premium softness. Remove small glossy highlights and avoid 3D rendering." - }, - { - "id": "08-compact-avatar", - "title": "头像强识别", - "file": "taonier-hand-spirit-ref01-logo-refine-08-compact-avatar.png", - "prompt": "Use the uploaded reference image as the composition and shape reference. Keep the same core structure: an abstract hand-like support curve below, gently holding a soft semi-dome clay spirit above.\nCreate a refined icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nPreserve the brand idea: fun creation, sharing, passing a small playable idea forward. The mark should feel like a small creative object being gently offered, not a scene or illustration.\nKeep the subject face-free: no eyes, no mouth, no expression, no limbs, no character body, no halo, no star, no spark.\nMake it more like a trademark and logo than the reference: fewer shapes, cleaner silhouette, clearer positive/negative structure, more vector-friendly curves, broad flat color regions, less glossy highlight, less painterly shadow.\nThe hand must remain abstract: a smooth palm-like support curve or bowl-like gesture, not realistic fingers, not a real human hand, not worship, not medical care.\nThe spirit must remain a soft irregular semi-dome or rounded clay core. It should not become a planet, helmet, bread, bun, mochi, dumpling, pastry, candy, jelly, sauce, dessert, or food package.\nStyle target: premium friendly logo mark, all-age and women-friendly, warm but not childish, suitable for app icon, social avatar, and trademark review.\nComposition: centered on a clean light background with generous safe area. Strong readable silhouette first. It must still read at 32px and in black and white.\nAvoid UI, border, sticker outline unless explicitly requested by the variant, background scene, watermark, extra marks, and any text.\nVariant focus: compact social-avatar readability. Enlarge the clay spirit slightly, thicken the hand support curve, reduce thin gaps, and keep the total mark bold at 32px." - } - ] -} diff --git a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-bowl.png b/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-bowl.png deleted file mode 100644 index 14b9e2d4..00000000 Binary files a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-bowl.png and /dev/null differ diff --git a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-clap.png b/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-clap.png deleted file mode 100644 index 36f5f5d0..00000000 Binary files a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-clap.png and /dev/null differ diff --git a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-cradle.png b/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-cradle.png deleted file mode 100644 index c4cfa074..00000000 Binary files a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-cradle.png and /dev/null differ diff --git a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-pop.png b/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-pop.png deleted file mode 100644 index 41682d9b..00000000 Binary files a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-pop.png and /dev/null differ diff --git a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-seal.png b/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-seal.png deleted file mode 100644 index 49e3363f..00000000 Binary files a/public/branding/taonier-logo-hands-concepts/taonier-hands-v2-seal.png and /dev/null differ diff --git a/public/branding/taonier-logo-hands-concepts/taonier-logo-hands-contact-sheet.png b/public/branding/taonier-logo-hands-concepts/taonier-logo-hands-contact-sheet.png deleted file mode 100644 index 9a7867b0..00000000 Binary files a/public/branding/taonier-logo-hands-concepts/taonier-logo-hands-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-magic-dot-concepts/taonier-logo-magic-dot-contact-sheet.png b/public/branding/taonier-logo-magic-dot-concepts/taonier-logo-magic-dot-contact-sheet.png deleted file mode 100644 index 7e757df6..00000000 Binary files a/public/branding/taonier-logo-magic-dot-concepts/taonier-logo-magic-dot-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-bloom.png b/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-bloom.png deleted file mode 100644 index 5303de6f..00000000 Binary files a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-bloom.png and /dev/null differ diff --git a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-mold.png b/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-mold.png deleted file mode 100644 index 142011c0..00000000 Binary files a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-mold.png and /dev/null differ diff --git a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-orbit.png b/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-orbit.png deleted file mode 100644 index d623a8eb..00000000 Binary files a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-orbit.png and /dev/null differ diff --git a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-seal.png b/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-seal.png deleted file mode 100644 index 781c298d..00000000 Binary files a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-seal.png and /dev/null differ diff --git a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-squish.png b/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-squish.png deleted file mode 100644 index d56b07ec..00000000 Binary files a/public/branding/taonier-logo-magic-dot-concepts/taonier-magic-dot-squish.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-logo-mascot-symbol-contact-sheet.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-logo-mascot-symbol-contact-sheet.png deleted file mode 100644 index e4257fac..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-logo-mascot-symbol-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-logo-mascot-symbol-manifest.json b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-logo-mascot-symbol-manifest.json deleted file mode 100644 index e9e220cd..00000000 --- a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-logo-mascot-symbol-manifest.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T21:47:40.073Z", - "logoSkillSummary": { - "requiredReview": "visual inspection, 32px readability, black-white viability", - "outputStatus": "AI concept only; final logo needs vector cleanup" - }, - "brief": { - "brand": "陶泥儿", - "coreBelief": "好玩会创造", - "logoType": "symbol/icon-only mascot mark, no wordmark", - "product": "AI UGC 轻休闲小游戏创作与传播平台,用户像捏陶泥一样把脑洞、梗和灵感塑造成可分享的作品", - "direction": "抽象吉祥物符号,从人形、精灵、怪物、动物等形态提炼", - "audience": "女性用户友好、全年龄向、年轻明亮但不低幼", - "mascotRules": [ - "必须是 logo 符号级别,不是完整角色立绘", - "轮廓要有记忆点,32px 可读", - "表情最多极简两点或无表情", - "身体结构要高度抽象、可矢量化", - "保留一点陶泥被捏出的柔软感" - ], - "avoid": [ - "复杂角色", - "儿童玩具感", - "怪物恐怖感", - "真实动物", - "食品感", - "文字", - "星星", - "写实泥土纹理" - ] - }, - "variants": [ - { - "id": "01-clay-humanoid", - "title": "抽象人形", - "file": "taonier-mascot-symbol-01-clay-humanoid.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nLogo type: abstract mascot symbol only. It must be a simple brand mark, not a full character illustration, not a scene, not a sticker sheet, not an app-icon rounded-square background.\nMascot meaning: a soft clay-born little being that represents playful creation, shareable ideas, and a friendly AI/UGC companion.\nStyle: modern minimalist vector mascot mark, compact silhouette, broad simple shapes, fresh bright palette, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nCharacter abstraction: use a highly simplified head/body silhouette or creature glyph. No detailed anatomy. No clothing. No props. No complex limbs. Optional face should be extremely minimal, at most two small eyes; no mouth unless it is a tiny simple mark.\nShape language: soft, rounded, slightly irregular, as if gently pinched from clay, but clean and designer-ready. Friendly and memorable, not childish.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance: do not make it look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, dessert, or food packaging.\nAvoid scary monster, aggressive teeth, claws, realistic animal, pet-shop icon, emoji face, toy mascot, chibi over-detailing, or generic blob.\nNo star, no spark, no halo, no magic wand, no hand, no pottery tool, no UI, no border, no watermark.\nComposition: centered on a clean light background, generous safe area. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the mascot silhouette should be recognizable at 32px.\nVariant focus: abstract humanoid mascot. A tiny soft clay person-like glyph with rounded head and merged body, no limbs or very minimal arms, friendly but not childish." - }, - { - "id": "02-clay-sprite", - "title": "陶泥精灵", - "file": "taonier-mascot-symbol-02-clay-sprite.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nLogo type: abstract mascot symbol only. It must be a simple brand mark, not a full character illustration, not a scene, not a sticker sheet, not an app-icon rounded-square background.\nMascot meaning: a soft clay-born little being that represents playful creation, shareable ideas, and a friendly AI/UGC companion.\nStyle: modern minimalist vector mascot mark, compact silhouette, broad simple shapes, fresh bright palette, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nCharacter abstraction: use a highly simplified head/body silhouette or creature glyph. No detailed anatomy. No clothing. No props. No complex limbs. Optional face should be extremely minimal, at most two small eyes; no mouth unless it is a tiny simple mark.\nShape language: soft, rounded, slightly irregular, as if gently pinched from clay, but clean and designer-ready. Friendly and memorable, not childish.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance: do not make it look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, dessert, or food packaging.\nAvoid scary monster, aggressive teeth, claws, realistic animal, pet-shop icon, emoji face, toy mascot, chibi over-detailing, or generic blob.\nNo star, no spark, no halo, no magic wand, no hand, no pottery tool, no UI, no border, no watermark.\nComposition: centered on a clean light background, generous safe area. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the mascot silhouette should be recognizable at 32px.\nVariant focus: clay sprite. A small semi-dome spirit with a gentle lifted silhouette, like a friendly creative helper, no wings, no magic stars, no fantasy clutter." - }, - { - "id": "03-soft-monster", - "title": "软萌怪物", - "file": "taonier-mascot-symbol-03-soft-monster.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nLogo type: abstract mascot symbol only. It must be a simple brand mark, not a full character illustration, not a scene, not a sticker sheet, not an app-icon rounded-square background.\nMascot meaning: a soft clay-born little being that represents playful creation, shareable ideas, and a friendly AI/UGC companion.\nStyle: modern minimalist vector mascot mark, compact silhouette, broad simple shapes, fresh bright palette, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nCharacter abstraction: use a highly simplified head/body silhouette or creature glyph. No detailed anatomy. No clothing. No props. No complex limbs. Optional face should be extremely minimal, at most two small eyes; no mouth unless it is a tiny simple mark.\nShape language: soft, rounded, slightly irregular, as if gently pinched from clay, but clean and designer-ready. Friendly and memorable, not childish.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance: do not make it look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, dessert, or food packaging.\nAvoid scary monster, aggressive teeth, claws, realistic animal, pet-shop icon, emoji face, toy mascot, chibi over-detailing, or generic blob.\nNo star, no spark, no halo, no magic wand, no hand, no pottery tool, no UI, no border, no watermark.\nComposition: centered on a clean light background, generous safe area. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the mascot silhouette should be recognizable at 32px.\nVariant focus: soft friendly monster glyph. Cute but not scary, no teeth, no claws, one distinctive head shape, perhaps tiny horn-like soft bumps but not devilish." - }, - { - "id": "04-animal-abstract", - "title": "抽象动物", - "file": "taonier-mascot-symbol-04-animal-abstract.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nLogo type: abstract mascot symbol only. It must be a simple brand mark, not a full character illustration, not a scene, not a sticker sheet, not an app-icon rounded-square background.\nMascot meaning: a soft clay-born little being that represents playful creation, shareable ideas, and a friendly AI/UGC companion.\nStyle: modern minimalist vector mascot mark, compact silhouette, broad simple shapes, fresh bright palette, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nCharacter abstraction: use a highly simplified head/body silhouette or creature glyph. No detailed anatomy. No clothing. No props. No complex limbs. Optional face should be extremely minimal, at most two small eyes; no mouth unless it is a tiny simple mark.\nShape language: soft, rounded, slightly irregular, as if gently pinched from clay, but clean and designer-ready. Friendly and memorable, not childish.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance: do not make it look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, dessert, or food packaging.\nAvoid scary monster, aggressive teeth, claws, realistic animal, pet-shop icon, emoji face, toy mascot, chibi over-detailing, or generic blob.\nNo star, no spark, no halo, no magic wand, no hand, no pottery tool, no UI, no border, no watermark.\nComposition: centered on a clean light background, generous safe area. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the mascot silhouette should be recognizable at 32px.\nVariant focus: abstract animal-like mascot. Suggest a small rounded creature through ears or tail-like curves, but not a specific real animal and not pet logo." - }, - { - "id": "05-clay-orb-being", - "title": "泥团小灵", - "file": "taonier-mascot-symbol-05-clay-orb-being.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nLogo type: abstract mascot symbol only. It must be a simple brand mark, not a full character illustration, not a scene, not a sticker sheet, not an app-icon rounded-square background.\nMascot meaning: a soft clay-born little being that represents playful creation, shareable ideas, and a friendly AI/UGC companion.\nStyle: modern minimalist vector mascot mark, compact silhouette, broad simple shapes, fresh bright palette, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nCharacter abstraction: use a highly simplified head/body silhouette or creature glyph. No detailed anatomy. No clothing. No props. No complex limbs. Optional face should be extremely minimal, at most two small eyes; no mouth unless it is a tiny simple mark.\nShape language: soft, rounded, slightly irregular, as if gently pinched from clay, but clean and designer-ready. Friendly and memorable, not childish.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance: do not make it look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, dessert, or food packaging.\nAvoid scary monster, aggressive teeth, claws, realistic animal, pet-shop icon, emoji face, toy mascot, chibi over-detailing, or generic blob.\nNo star, no spark, no halo, no magic wand, no hand, no pottery tool, no UI, no border, no watermark.\nComposition: centered on a clean light background, generous safe area. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the mascot silhouette should be recognizable at 32px.\nVariant focus: orb-like clay being. A simple irregular rounded body with minimal face or no face, strong silhouette, playful creation companion." - }, - { - "id": "06-playful-creature", - "title": "轻玩小怪", - "file": "taonier-mascot-symbol-06-playful-creature.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nLogo type: abstract mascot symbol only. It must be a simple brand mark, not a full character illustration, not a scene, not a sticker sheet, not an app-icon rounded-square background.\nMascot meaning: a soft clay-born little being that represents playful creation, shareable ideas, and a friendly AI/UGC companion.\nStyle: modern minimalist vector mascot mark, compact silhouette, broad simple shapes, fresh bright palette, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nCharacter abstraction: use a highly simplified head/body silhouette or creature glyph. No detailed anatomy. No clothing. No props. No complex limbs. Optional face should be extremely minimal, at most two small eyes; no mouth unless it is a tiny simple mark.\nShape language: soft, rounded, slightly irregular, as if gently pinched from clay, but clean and designer-ready. Friendly and memorable, not childish.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance: do not make it look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, dessert, or food packaging.\nAvoid scary monster, aggressive teeth, claws, realistic animal, pet-shop icon, emoji face, toy mascot, chibi over-detailing, or generic blob.\nNo star, no spark, no halo, no magic wand, no hand, no pottery tool, no UI, no border, no watermark.\nComposition: centered on a clean light background, generous safe area. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the mascot silhouette should be recognizable at 32px.\nVariant focus: more playful creature mark. Dynamic but compact, one distinctive asymmetric curve, readable at 32px, still premium and not a toy brand." - }, - { - "id": "07-avatar-readable", - "title": "头像可读", - "file": "taonier-mascot-symbol-07-avatar-readable.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nLogo type: abstract mascot symbol only. It must be a simple brand mark, not a full character illustration, not a scene, not a sticker sheet, not an app-icon rounded-square background.\nMascot meaning: a soft clay-born little being that represents playful creation, shareable ideas, and a friendly AI/UGC companion.\nStyle: modern minimalist vector mascot mark, compact silhouette, broad simple shapes, fresh bright palette, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nCharacter abstraction: use a highly simplified head/body silhouette or creature glyph. No detailed anatomy. No clothing. No props. No complex limbs. Optional face should be extremely minimal, at most two small eyes; no mouth unless it is a tiny simple mark.\nShape language: soft, rounded, slightly irregular, as if gently pinched from clay, but clean and designer-ready. Friendly and memorable, not childish.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance: do not make it look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, dessert, or food packaging.\nAvoid scary monster, aggressive teeth, claws, realistic animal, pet-shop icon, emoji face, toy mascot, chibi over-detailing, or generic blob.\nNo star, no spark, no halo, no magic wand, no hand, no pottery tool, no UI, no border, no watermark.\nComposition: centered on a clean light background, generous safe area. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the mascot silhouette should be recognizable at 32px.\nVariant focus: social avatar and favicon readability. Bold compact mascot head/body silhouette, minimal inner detail, high black-and-white clarity." - }, - { - "id": "08-vector-ready", - "title": "矢量符号感", - "file": "taonier-mascot-symbol-08-vector-ready.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works and share them with others.\nLogo type: abstract mascot symbol only. It must be a simple brand mark, not a full character illustration, not a scene, not a sticker sheet, not an app-icon rounded-square background.\nMascot meaning: a soft clay-born little being that represents playful creation, shareable ideas, and a friendly AI/UGC companion.\nStyle: modern minimalist vector mascot mark, compact silhouette, broad simple shapes, fresh bright palette, very light clay warmth only. It must look good and recognizable at 32px favicon size.\nCharacter abstraction: use a highly simplified head/body silhouette or creature glyph. No detailed anatomy. No clothing. No props. No complex limbs. Optional face should be extremely minimal, at most two small eyes; no mouth unless it is a tiny simple mark.\nShape language: soft, rounded, slightly irregular, as if gently pinched from clay, but clean and designer-ready. Friendly and memorable, not childish.\nColor direction: women-friendly and all-age fresh palette: coral orange, peach pink, cream white, clear soft teal or mint green. Use flat brand-color shapes, not candy rendering.\nAvoid realistic clay texture, dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance: do not make it look like bread, mochi, dumpling, cake, cookie, candy, jelly, donut, dessert, or food packaging.\nAvoid scary monster, aggressive teeth, claws, realistic animal, pet-shop icon, emoji face, toy mascot, chibi over-detailing, or generic blob.\nNo star, no spark, no halo, no magic wand, no hand, no pottery tool, no UI, no border, no watermark.\nComposition: centered on a clean light background, generous safe area. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the mascot silhouette should be recognizable at 32px.\nVariant focus: designer-ready vector mascot concept. 2-3 flat shapes, crisp boundaries, distinctive silhouette, minimal material cue, no illustration shading." - } - ] -} diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-01-clay-humanoid.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-01-clay-humanoid.png deleted file mode 100644 index e6c9da82..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-01-clay-humanoid.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-02-clay-sprite.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-02-clay-sprite.png deleted file mode 100644 index be1c3a66..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-02-clay-sprite.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-03-soft-monster.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-03-soft-monster.png deleted file mode 100644 index 2e1f677c..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-03-soft-monster.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-04-animal-abstract.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-04-animal-abstract.png deleted file mode 100644 index 1a8a23cc..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-04-animal-abstract.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-05-clay-orb-being.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-05-clay-orb-being.png deleted file mode 100644 index 9553a46a..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-05-clay-orb-being.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-06-playful-creature.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-06-playful-creature.png deleted file mode 100644 index b3f88980..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-06-playful-creature.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-07-avatar-readable.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-07-avatar-readable.png deleted file mode 100644 index c4daf21e..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-07-avatar-readable.png and /dev/null differ diff --git a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-08-vector-ready.png b/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-08-vector-ready.png deleted file mode 100644 index b87294ec..00000000 Binary files a/public/branding/taonier-logo-mascot-symbol-concepts/taonier-mascot-symbol-08-vector-ready.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-logo-playful-bean-contact-sheet.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-logo-playful-bean-contact-sheet.png deleted file mode 100644 index 675ba418..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-logo-playful-bean-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-logo-playful-bean-manifest.json b/public/branding/taonier-logo-playful-bean-concepts/taonier-logo-playful-bean-manifest.json deleted file mode 100644 index 48c343bb..00000000 --- a/public/branding/taonier-logo-playful-bean-concepts/taonier-logo-playful-bean-manifest.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T21:01:55.557Z", - "logoSkillSummary": { - "requiredReview": "visual inspection, 32px readability, black-white viability", - "outputStatus": "AI concept only; final logo needs vector cleanup" - }, - "brief": { - "brand": "陶泥儿", - "coreBelief": "好玩会创造", - "logoType": "symbol/icon-only mark, no wordmark", - "product": "AI UGC 轻休闲小游戏创作与传播平台,用户像捏陶泥一样把脑洞、梗和灵感塑造成可玩的作品", - "coreMetaphor": "已经成形的可玩作品胚", - "audience": "女性用户友好、全年龄向、年轻明亮但不低幼", - "visualLanguage": "抽象但有玩性的软几何玩具感", - "material": "只保留陶泥温度,不追求泥土质感", - "shape": "闭合不规则圆润豆形,外轮廓流畅、亲和、有玩性", - "colors": [ - "珊瑚橙", - "蜜桃粉", - "奶油白", - "清透青绿", - "少量暖黄或柔紫可选" - ], - "mustHave": [ - "无中文、无英文、无字标", - "无星星、无脸、无表情", - "无方形底盘", - "无食物感", - "32px 可识别", - "黑白化仍成立" - ] - }, - "variants": [ - { - "id": "01-fresh-bean-mark", - "title": "清新豆形标", - "file": "taonier-playful-bean-01-fresh-bean-mark.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works.\nLogo meaning: an already-formed playable creation embryo. It should feel like a small friendly finished creative object, not a process diagram and not raw clay.\nLogo type: abstract symbol/icon only. No wordmark, no mascot, no face, no app-icon rounded-square background.\nMain element: one closed irregular rounded bean-like soft geometric shape. The outer contour must be smooth, friendly, memorable, complete, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, loose strip, badge, stamp, or tile.\nThe symbol should be abstract but playful: it should feel like a soft geometric toy-like creation object, mature enough for a premium brand and not childish.\nInternal design: optional 1-2 broad curved color fields, soft cut-ins, or abstract playful inlays. Do not show a transformation process. Do not add a center icon.\nNo star, no spark, no star-shaped negative space, no eyes, no mouth, no character body, no hand, no pottery tool.\nStyle: modern minimalist vector logo. Flat, crisp, simple broad shapes, very light clay warmth only. No realistic texture. It must look good and recognizable at 32px favicon size.\nColor direction: fresh bright palette for women-friendly and all-age users: coral orange, peach pink, cream white, clear soft teal or mint green. Use brand-color flat shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make it look like bread, chocolate bread, pastry, cookie, candy, jelly, donut, cream filling, sauce, baked dough, dessert, fruit candy, or food packaging.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the closed bean-like silhouette should be recognizable at 32px.\nVariant focus: the cleanest fresh bean mark. Use coral orange and cream white with a tiny soft teal accent. Strong closed irregular bean silhouette, very readable." - }, - { - "id": "02-peach-soft-geometry", - "title": "蜜桃软几何", - "file": "taonier-playful-bean-02-peach-soft-geometry.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works.\nLogo meaning: an already-formed playable creation embryo. It should feel like a small friendly finished creative object, not a process diagram and not raw clay.\nLogo type: abstract symbol/icon only. No wordmark, no mascot, no face, no app-icon rounded-square background.\nMain element: one closed irregular rounded bean-like soft geometric shape. The outer contour must be smooth, friendly, memorable, complete, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, loose strip, badge, stamp, or tile.\nThe symbol should be abstract but playful: it should feel like a soft geometric toy-like creation object, mature enough for a premium brand and not childish.\nInternal design: optional 1-2 broad curved color fields, soft cut-ins, or abstract playful inlays. Do not show a transformation process. Do not add a center icon.\nNo star, no spark, no star-shaped negative space, no eyes, no mouth, no character body, no hand, no pottery tool.\nStyle: modern minimalist vector logo. Flat, crisp, simple broad shapes, very light clay warmth only. No realistic texture. It must look good and recognizable at 32px favicon size.\nColor direction: fresh bright palette for women-friendly and all-age users: coral orange, peach pink, cream white, clear soft teal or mint green. Use brand-color flat shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make it look like bread, chocolate bread, pastry, cookie, candy, jelly, donut, cream filling, sauce, baked dough, dessert, fruit candy, or food packaging.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the closed bean-like silhouette should be recognizable at 32px.\nVariant focus: peach pink and coral soft geometry. Feminine-friendly but not cosmetic, not candy. One smooth inner color field supports the closed bean shape." - }, - { - "id": "03-mint-creation-embryo", - "title": "青绿创作胚", - "file": "taonier-playful-bean-03-mint-creation-embryo.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works.\nLogo meaning: an already-formed playable creation embryo. It should feel like a small friendly finished creative object, not a process diagram and not raw clay.\nLogo type: abstract symbol/icon only. No wordmark, no mascot, no face, no app-icon rounded-square background.\nMain element: one closed irregular rounded bean-like soft geometric shape. The outer contour must be smooth, friendly, memorable, complete, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, loose strip, badge, stamp, or tile.\nThe symbol should be abstract but playful: it should feel like a soft geometric toy-like creation object, mature enough for a premium brand and not childish.\nInternal design: optional 1-2 broad curved color fields, soft cut-ins, or abstract playful inlays. Do not show a transformation process. Do not add a center icon.\nNo star, no spark, no star-shaped negative space, no eyes, no mouth, no character body, no hand, no pottery tool.\nStyle: modern minimalist vector logo. Flat, crisp, simple broad shapes, very light clay warmth only. No realistic texture. It must look good and recognizable at 32px favicon size.\nColor direction: fresh bright palette for women-friendly and all-age users: coral orange, peach pink, cream white, clear soft teal or mint green. Use brand-color flat shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make it look like bread, chocolate bread, pastry, cookie, candy, jelly, donut, cream filling, sauce, baked dough, dessert, fruit candy, or food packaging.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the closed bean-like silhouette should be recognizable at 32px.\nVariant focus: clear mint or teal as the memory accent, with warm cream and coral. The mark should feel like a playable creation object, not a leaf or seed." - }, - { - "id": "04-female-bright-mark", - "title": "女性向明亮款", - "file": "taonier-playful-bean-04-female-bright-mark.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works.\nLogo meaning: an already-formed playable creation embryo. It should feel like a small friendly finished creative object, not a process diagram and not raw clay.\nLogo type: abstract symbol/icon only. No wordmark, no mascot, no face, no app-icon rounded-square background.\nMain element: one closed irregular rounded bean-like soft geometric shape. The outer contour must be smooth, friendly, memorable, complete, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, loose strip, badge, stamp, or tile.\nThe symbol should be abstract but playful: it should feel like a soft geometric toy-like creation object, mature enough for a premium brand and not childish.\nInternal design: optional 1-2 broad curved color fields, soft cut-ins, or abstract playful inlays. Do not show a transformation process. Do not add a center icon.\nNo star, no spark, no star-shaped negative space, no eyes, no mouth, no character body, no hand, no pottery tool.\nStyle: modern minimalist vector logo. Flat, crisp, simple broad shapes, very light clay warmth only. No realistic texture. It must look good and recognizable at 32px favicon size.\nColor direction: fresh bright palette for women-friendly and all-age users: coral orange, peach pink, cream white, clear soft teal or mint green. Use brand-color flat shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make it look like bread, chocolate bread, pastry, cookie, candy, jelly, donut, cream filling, sauce, baked dough, dessert, fruit candy, or food packaging.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the closed bean-like silhouette should be recognizable at 32px.\nVariant focus: brighter women-friendly palette, soft coral, peach, cream, and one clean mint accent. Keep it premium and avoid beauty-brand cliché." - }, - { - "id": "05-all-age-play-mark", - "title": "全龄轻玩款", - "file": "taonier-playful-bean-05-all-age-play-mark.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works.\nLogo meaning: an already-formed playable creation embryo. It should feel like a small friendly finished creative object, not a process diagram and not raw clay.\nLogo type: abstract symbol/icon only. No wordmark, no mascot, no face, no app-icon rounded-square background.\nMain element: one closed irregular rounded bean-like soft geometric shape. The outer contour must be smooth, friendly, memorable, complete, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, loose strip, badge, stamp, or tile.\nThe symbol should be abstract but playful: it should feel like a soft geometric toy-like creation object, mature enough for a premium brand and not childish.\nInternal design: optional 1-2 broad curved color fields, soft cut-ins, or abstract playful inlays. Do not show a transformation process. Do not add a center icon.\nNo star, no spark, no star-shaped negative space, no eyes, no mouth, no character body, no hand, no pottery tool.\nStyle: modern minimalist vector logo. Flat, crisp, simple broad shapes, very light clay warmth only. No realistic texture. It must look good and recognizable at 32px favicon size.\nColor direction: fresh bright palette for women-friendly and all-age users: coral orange, peach pink, cream white, clear soft teal or mint green. Use brand-color flat shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make it look like bread, chocolate bread, pastry, cookie, candy, jelly, donut, cream filling, sauce, baked dough, dessert, fruit candy, or food packaging.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the closed bean-like silhouette should be recognizable at 32px.\nVariant focus: all-age casual play. More energetic and memorable, but still simple. Use two or three flat color fields, no small decorative details." - }, - { - "id": "06-monochrome-first", - "title": "黑白优先款", - "file": "taonier-playful-bean-06-monochrome-first.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works.\nLogo meaning: an already-formed playable creation embryo. It should feel like a small friendly finished creative object, not a process diagram and not raw clay.\nLogo type: abstract symbol/icon only. No wordmark, no mascot, no face, no app-icon rounded-square background.\nMain element: one closed irregular rounded bean-like soft geometric shape. The outer contour must be smooth, friendly, memorable, complete, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, loose strip, badge, stamp, or tile.\nThe symbol should be abstract but playful: it should feel like a soft geometric toy-like creation object, mature enough for a premium brand and not childish.\nInternal design: optional 1-2 broad curved color fields, soft cut-ins, or abstract playful inlays. Do not show a transformation process. Do not add a center icon.\nNo star, no spark, no star-shaped negative space, no eyes, no mouth, no character body, no hand, no pottery tool.\nStyle: modern minimalist vector logo. Flat, crisp, simple broad shapes, very light clay warmth only. No realistic texture. It must look good and recognizable at 32px favicon size.\nColor direction: fresh bright palette for women-friendly and all-age users: coral orange, peach pink, cream white, clear soft teal or mint green. Use brand-color flat shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make it look like bread, chocolate bread, pastry, cookie, candy, jelly, donut, cream filling, sauce, baked dough, dessert, fruit candy, or food packaging.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the closed bean-like silhouette should be recognizable at 32px.\nVariant focus: design for black-and-white survival first. Bold positive and negative shapes, color only supports the structure. No delicate gradients." - }, - { - "id": "07-avatar-readable", - "title": "头像小尺寸款", - "file": "taonier-playful-bean-07-avatar-readable.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works.\nLogo meaning: an already-formed playable creation embryo. It should feel like a small friendly finished creative object, not a process diagram and not raw clay.\nLogo type: abstract symbol/icon only. No wordmark, no mascot, no face, no app-icon rounded-square background.\nMain element: one closed irregular rounded bean-like soft geometric shape. The outer contour must be smooth, friendly, memorable, complete, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, loose strip, badge, stamp, or tile.\nThe symbol should be abstract but playful: it should feel like a soft geometric toy-like creation object, mature enough for a premium brand and not childish.\nInternal design: optional 1-2 broad curved color fields, soft cut-ins, or abstract playful inlays. Do not show a transformation process. Do not add a center icon.\nNo star, no spark, no star-shaped negative space, no eyes, no mouth, no character body, no hand, no pottery tool.\nStyle: modern minimalist vector logo. Flat, crisp, simple broad shapes, very light clay warmth only. No realistic texture. It must look good and recognizable at 32px favicon size.\nColor direction: fresh bright palette for women-friendly and all-age users: coral orange, peach pink, cream white, clear soft teal or mint green. Use brand-color flat shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make it look like bread, chocolate bread, pastry, cookie, candy, jelly, donut, cream filling, sauce, baked dough, dessert, fruit candy, or food packaging.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the closed bean-like silhouette should be recognizable at 32px.\nVariant focus: social avatar and favicon readability. Full, compact closed bean silhouette with one distinctive broad internal curve; no tiny dots." - }, - { - "id": "08-vector-ready", - "title": "矢量定稿感款", - "file": "taonier-playful-bean-08-vector-ready.png", - "prompt": "Create an icon-only brand logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nBrand core belief: fun creation. Users can turn imagination, memes, and ideas into playable AI/UGC casual game works.\nLogo meaning: an already-formed playable creation embryo. It should feel like a small friendly finished creative object, not a process diagram and not raw clay.\nLogo type: abstract symbol/icon only. No wordmark, no mascot, no face, no app-icon rounded-square background.\nMain element: one closed irregular rounded bean-like soft geometric shape. The outer contour must be smooth, friendly, memorable, complete, and vector-friendly.\nThe shape must not be a square, rounded square, circle, ellipse, simple blob, ribbon, swirl, S shape, G shape, open ring, loose strip, badge, stamp, or tile.\nThe symbol should be abstract but playful: it should feel like a soft geometric toy-like creation object, mature enough for a premium brand and not childish.\nInternal design: optional 1-2 broad curved color fields, soft cut-ins, or abstract playful inlays. Do not show a transformation process. Do not add a center icon.\nNo star, no spark, no star-shaped negative space, no eyes, no mouth, no character body, no hand, no pottery tool.\nStyle: modern minimalist vector logo. Flat, crisp, simple broad shapes, very light clay warmth only. No realistic texture. It must look good and recognizable at 32px favicon size.\nColor direction: fresh bright palette for women-friendly and all-age users: coral orange, peach pink, cream white, clear soft teal or mint green. Use brand-color flat shapes, not candy rendering.\nAvoid muted mud colors as the dominant palette. Avoid dirty clay, brick, pottery shard, mud pie, rough craft class object, and archaeology stamp feeling.\nFood avoidance is critical: do not make it look like bread, chocolate bread, pastry, cookie, candy, jelly, donut, cream filling, sauce, baked dough, dessert, fruit candy, or food packaging.\nComposition: centered on a clean light background, generous safe area, no border, no UI, no watermark. Use simple readable silhouette first.\nValidation targets: black-and-white version should still read clearly; the closed bean-like silhouette should be recognizable at 32px.\nVariant focus: designer-ready vector concept. 2-3 flat shapes, crisp boundaries, distinctive closed rounded-bean contour, minimal material cue." - } - ] -} diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-01-fresh-bean-mark.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-01-fresh-bean-mark.png deleted file mode 100644 index 20caf56a..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-01-fresh-bean-mark.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-02-peach-soft-geometry.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-02-peach-soft-geometry.png deleted file mode 100644 index d1bcf08a..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-02-peach-soft-geometry.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-03-mint-creation-embryo.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-03-mint-creation-embryo.png deleted file mode 100644 index b72c679c..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-03-mint-creation-embryo.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-04-female-bright-mark.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-04-female-bright-mark.png deleted file mode 100644 index 1ce817be..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-04-female-bright-mark.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-05-all-age-play-mark.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-05-all-age-play-mark.png deleted file mode 100644 index 6eebdacc..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-05-all-age-play-mark.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-06-monochrome-first.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-06-monochrome-first.png deleted file mode 100644 index 5552f400..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-06-monochrome-first.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-07-avatar-readable.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-07-avatar-readable.png deleted file mode 100644 index 14aabbf5..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-07-avatar-readable.png and /dev/null differ diff --git a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-08-vector-ready.png b/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-08-vector-ready.png deleted file mode 100644 index 91a55e96..00000000 Binary files a/public/branding/taonier-logo-playful-bean-concepts/taonier-playful-bean-08-vector-ready.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch-hole-concepts/taonier-logo-punch-hole-contact-sheet.png b/public/branding/taonier-logo-punch-hole-concepts/taonier-logo-punch-hole-contact-sheet.png deleted file mode 100644 index c0eef79f..00000000 Binary files a/public/branding/taonier-logo-punch-hole-concepts/taonier-logo-punch-hole-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-app-token.png b/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-app-token.png deleted file mode 100644 index 8f87935f..00000000 Binary files a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-app-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-color-inlay.png b/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-color-inlay.png deleted file mode 100644 index e20e4c8f..00000000 Binary files a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-color-inlay.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-hole-balance.png b/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-hole-balance.png deleted file mode 100644 index 5b5439b0..00000000 Binary files a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-hole-balance.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-locked-shape.png b/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-locked-shape.png deleted file mode 100644 index d1d4ec6d..00000000 Binary files a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-locked-shape.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-mono-test.png b/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-mono-test.png deleted file mode 100644 index 452fc1dc..00000000 Binary files a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-mono-test.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-stable-icon.png b/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-stable-icon.png deleted file mode 100644 index b7cbdaaa..00000000 Binary files a/public/branding/taonier-logo-punch-hole-concepts/taonier-punch-stable-icon.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch04-color-concepts/taonier-logo-punch04-color-contact-sheet.png b/public/branding/taonier-logo-punch04-color-concepts/taonier-logo-punch04-color-contact-sheet.png deleted file mode 100644 index dce1af6a..00000000 Binary files a/public/branding/taonier-logo-punch04-color-concepts/taonier-logo-punch04-color-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-clay-gradient-flat.png b/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-clay-gradient-flat.png deleted file mode 100644 index 72063022..00000000 Binary files a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-clay-gradient-flat.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-cream-window.png b/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-cream-window.png deleted file mode 100644 index c983a866..00000000 Binary files a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-cream-window.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-mint-shadow.png b/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-mint-shadow.png deleted file mode 100644 index e66d5b79..00000000 Binary files a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-mint-shadow.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-navy-game-core.png b/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-navy-game-core.png deleted file mode 100644 index 47eb02ba..00000000 Binary files a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-navy-game-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-negative-tile.png b/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-negative-tile.png deleted file mode 100644 index 78ffb418..00000000 Binary files a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-negative-tile.png and /dev/null differ diff --git a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-warm-ink-core.png b/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-warm-ink-core.png deleted file mode 100644 index b825fada..00000000 Binary files a/public/branding/taonier-logo-punch04-color-concepts/taonier-punch04-warm-ink-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-logo-ref04-locked-color-contact-sheet.png b/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-logo-ref04-locked-color-contact-sheet.png deleted file mode 100644 index bc0e7101..00000000 Binary files a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-logo-ref04-locked-color-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-blue-ink.png b/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-blue-ink.png deleted file mode 100644 index 45a4952d..00000000 Binary files a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-blue-ink.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-green-ink.png b/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-green-ink.png deleted file mode 100644 index 3e7761ef..00000000 Binary files a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-green-ink.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-plum-ink.png b/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-plum-ink.png deleted file mode 100644 index f9ce68df..00000000 Binary files a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-plum-ink.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-shrink-core.png b/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-shrink-core.png deleted file mode 100644 index c9d9c197..00000000 Binary files a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-shrink-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-soft-charcoal.png b/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-soft-charcoal.png deleted file mode 100644 index c04cee0d..00000000 Binary files a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-soft-charcoal.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-warm-ink.png b/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-warm-ink.png deleted file mode 100644 index 3b0528a5..00000000 Binary files a/public/branding/taonier-logo-ref04-locked-color-concepts/taonier-ref04-locked-warm-ink.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-logo-ref04-palette-refine-contact-sheet.png b/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-logo-ref04-palette-refine-contact-sheet.png deleted file mode 100644 index e735051d..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-logo-ref04-palette-refine-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-biscuit.png b/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-biscuit.png deleted file mode 100644 index 8c410b47..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-biscuit.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-butter.png b/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-butter.png deleted file mode 100644 index 456824fc..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-butter.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-cream.png b/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-cream.png deleted file mode 100644 index 8f577dc9..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-cream.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-milk.png b/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-milk.png deleted file mode 100644 index d9851534..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-ref04-palette-refine-milk.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-sparkle-reference-crop.png b/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-sparkle-reference-crop.png deleted file mode 100644 index 2a22d000..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-concepts/taonier-sparkle-reference-crop.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-logo-ref04-palette-refine-v2-contact-sheet.png b/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-logo-ref04-palette-refine-v2-contact-sheet.png deleted file mode 100644 index 62f0e8c2..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-logo-ref04-palette-refine-v2-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-light-vanilla.png b/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-light-vanilla.png deleted file mode 100644 index 3b585f4d..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-light-vanilla.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-pale-cream.png b/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-pale-cream.png deleted file mode 100644 index d57ac416..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-pale-cream.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-soft-butter.png b/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-soft-butter.png deleted file mode 100644 index 83b328e6..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v2-concepts/taonier-ref04-palette-refine-v2-soft-butter.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-logo-ref04-palette-refine-v3-contact-sheet.png b/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-logo-ref04-palette-refine-v3-contact-sheet.png deleted file mode 100644 index e5ec8913..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-logo-ref04-palette-refine-v3-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-butter-soft.png b/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-butter-soft.png deleted file mode 100644 index 1f6dd27d..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-butter-soft.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-milk-cream.png b/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-milk-cream.png deleted file mode 100644 index a3680d8e..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-milk-cream.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-soft-vanilla.png b/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-soft-vanilla.png deleted file mode 100644 index d2aaf01f..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v3-concepts/taonier-ref04-palette-refine-v3-soft-vanilla.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-logo-ref04-palette-refine-v4-contact-sheet.png b/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-logo-ref04-palette-refine-v4-contact-sheet.png deleted file mode 100644 index d1ed73b5..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-logo-ref04-palette-refine-v4-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-cream-paper.png b/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-cream-paper.png deleted file mode 100644 index 34aedd36..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-cream-paper.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-pale-butter.png b/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-pale-butter.png deleted file mode 100644 index c3456100..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-pale-butter.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-soft-champagne.png b/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-soft-champagne.png deleted file mode 100644 index 81e1f6f0..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-soft-champagne.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-warm-ivory.png b/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-warm-ivory.png deleted file mode 100644 index e80a3fb2..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v4-concepts/taonier-ref04-palette-refine-v4-warm-ivory.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-logo-ref04-palette-refine-v5-contact-sheet.png b/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-logo-ref04-palette-refine-v5-contact-sheet.png deleted file mode 100644 index a9500de5..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-logo-ref04-palette-refine-v5-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-balanced-bright-spark.png b/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-balanced-bright-spark.png deleted file mode 100644 index 10509d6e..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-balanced-bright-spark.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-filled-centered-spark.png b/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-filled-centered-spark.png deleted file mode 100644 index ebd57523..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-filled-centered-spark.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-smooth-left-small-spark.png b/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-smooth-left-small-spark.png deleted file mode 100644 index dffaf239..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-smooth-left-small-spark.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-solid-core-no-hole.png b/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-solid-core-no-hole.png deleted file mode 100644 index 7914250b..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-refine-v5-concepts/taonier-ref04-palette-refine-v5-solid-core-no-hole.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-transfer/taonier-logo-ref04-palette-transfer-contact-sheet.png b/public/branding/taonier-logo-ref04-palette-transfer/taonier-logo-ref04-palette-transfer-contact-sheet.png deleted file mode 100644 index fd8ff342..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-transfer/taonier-logo-ref04-palette-transfer-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-palette-transfer/taonier-ref04-palette-transfer-warm-yellow-sparkle.png b/public/branding/taonier-logo-ref04-palette-transfer/taonier-ref04-palette-transfer-warm-yellow-sparkle.png deleted file mode 100644 index a3dd55bf..00000000 Binary files a/public/branding/taonier-logo-ref04-palette-transfer/taonier-ref04-palette-transfer-warm-yellow-sparkle.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-logo-ref04-warm-sparkle-contact-sheet.png b/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-logo-ref04-warm-sparkle-contact-sheet.png deleted file mode 100644 index e60e1621..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-logo-ref04-warm-sparkle-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-caramel.png b/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-caramel.png deleted file mode 100644 index 7e61d5f2..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-caramel.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-clay-quiet.png b/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-clay-quiet.png deleted file mode 100644 index 6f1d8d84..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-clay-quiet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-cocoa.png b/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-cocoa.png deleted file mode 100644 index e21e08e1..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-cocoa.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-plum.png b/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-plum.png deleted file mode 100644 index da9fa07a..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-plum.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-rust.png b/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-rust.png deleted file mode 100644 index f07ba90a..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-rust.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-terracotta.png b/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-terracotta.png deleted file mode 100644 index 80658b35..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-concepts/taonier-ref04-warm-sparkle-terracotta.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-logo-ref04-warm-sparkle-v2-contact-sheet.png b/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-logo-ref04-warm-sparkle-v2-contact-sheet.png deleted file mode 100644 index e60e1621..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-logo-ref04-warm-sparkle-v2-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-caramel.png b/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-caramel.png deleted file mode 100644 index 7e61d5f2..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-caramel.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-clay-quiet.png b/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-clay-quiet.png deleted file mode 100644 index 6f1d8d84..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-clay-quiet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-cocoa.png b/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-cocoa.png deleted file mode 100644 index e21e08e1..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-cocoa.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-plum.png b/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-plum.png deleted file mode 100644 index da9fa07a..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-plum.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-rust.png b/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-rust.png deleted file mode 100644 index f07ba90a..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-rust.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-terracotta.png b/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-terracotta.png deleted file mode 100644 index 80658b35..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-sparkle-v2-concepts/taonier-ref04-warm-sparkle-terracotta.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-logo-ref04-warm-star-contact-sheet.png b/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-logo-ref04-warm-star-contact-sheet.png deleted file mode 100644 index efc7f4c4..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-logo-ref04-warm-star-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-caramel.png b/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-caramel.png deleted file mode 100644 index 58060a02..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-caramel.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-cocoa.png b/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-cocoa.png deleted file mode 100644 index 90d9dcc7..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-cocoa.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-olive.png b/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-olive.png deleted file mode 100644 index 2075da25..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-olive.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-plum.png b/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-plum.png deleted file mode 100644 index 68420c98..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-plum.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-rust.png b/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-rust.png deleted file mode 100644 index 2cf515d0..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-rust.png and /dev/null differ diff --git a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-terracotta.png b/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-terracotta.png deleted file mode 100644 index fcb5e381..00000000 Binary files a/public/branding/taonier-logo-ref04-warm-star-concepts/taonier-ref04-warm-star-terracotta.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-logo-short-foot-creature-contact-sheet.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-logo-short-foot-creature-contact-sheet.png deleted file mode 100644 index 946f9817..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-logo-short-foot-creature-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-logo-short-foot-creature-manifest.json b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-logo-short-foot-creature-manifest.json deleted file mode 100644 index 7ffea9ad..00000000 --- a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-logo-short-foot-creature-manifest.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "model": "gpt-image-2-all", - "size": "1024x1024", - "generatedAt": "2026-05-14T22:27:21.056Z", - "logoSkillSummary": { - "requiredReview": "visual inspection, 32px readability, black-white viability", - "outputStatus": "AI concept only; final logo needs vector cleanup" - }, - "brief": { - "brand": "陶泥儿", - "coreBelief": "好玩会创造", - "logoType": "symbol/icon-only mascot mark, no wordmark", - "product": "AI UGC 轻休闲小游戏创作与传播平台,用户把脑洞、梗和灵感塑造成可分享的作品", - "direction": "低重心短脚泥团小灵体 / 小怪物:参考图只用于造型,不继承写实陶瓷质感", - "audience": "女性用户友好、全年龄向、年轻明亮但不低幼", - "shapeRules": [ - "主体是坐在地上的闭合泥团生物,像一个稳定的软陶泥胚", - "底部有 3-5 个短短的圆脚或脚趾状支点,但不能变成爪子", - "头顶可以有弯角、小尖、软芽、卷曲或捏起的造型,作为记忆点", - "整体必须是 logo 符号级别,不是完整角色插画", - "32px 下仍能看出低重心泥团、短脚和头顶造型" - ], - "avoid": [ - "中文或英文字", - "星星或闪光", - "手托举元素", - "写实陶瓷高光", - "脏泥土或砖块", - "面团、汤圆、甜点、面包、巧克力、糖果、布丁", - "恐怖怪物、牙齿、爪子", - "儿童玩具、表情包贴纸" - ] - }, - "variants": [ - { - "id": "01-curled-tip", - "title": "弯角泥团", - "file": "taonier-short-foot-creature-01-curled-tip.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nThe reference idea is only shape language: a squat soft clay lump creature sitting on the ground, with several very short rounded feet and a distinctive top tuft or curved horn. Do not copy realistic ceramic rendering.\nBrand core: fun creation. The mark should feel like a tiny clay-born creative spirit: soft, friendly, shareable, and able to turn ideas into playful AI/UGC casual game works.\nLogo type: simple mascot symbol only. It must be a brand mark, not a full character illustration, not a scene, not a sticker, not a rounded-square app icon background.\nMain silhouette: low center of gravity, closed mound body, slightly irregular but clean outline, broad base, 3 to 5 stubby rounded feet at the bottom. Feet must be short and cute, never claws, toes, paws, or realistic animal legs.\nTop silhouette: one memorable soft sculpted feature on the head, such as a curled clay tip, small pinched sprout, rounded horn, or soft wave tuft. The top feature should be part of the same clay body, not a separate hat or accessory.\nFace policy: face is optional; if used, only two tiny simple eye dots. No mouth, no blush, no emoji expression, no detailed face. The silhouette should work even without the face.\nStyle: modern minimalist vector mascot logo, flat brand-color shapes, clean curves, premium but warm. Slight clay warmth through color and form only; no realistic texture.\nColor direction: earthy but fresh, using warm clay beige, terracotta, cream white, soft coral, and a very small teal or mint accent if helpful. Avoid dirty mud, brick red dominance, candy gradients, glossy dessert rendering.\nFood avoidance is critical: do not make it look like mochi, dumpling, bun, bread, cake, cookie, candy, pudding, chocolate, jelly, or any edible mascot.\nAvoid pottery class object, ceramic figurine, handmade toy, rough mud texture, archaeology stamp, realistic glaze, 3D clay render, or shiny ceramic highlight.\nAvoid scary monster, teeth, claws, spikes, realistic animal, pet logo, chibi over-detailing, generic blob, star, spark, halo, magic wand, hand, pottery tool, UI, border, or watermark.\nComposition: centered on clean light background, generous safe area, strong readable silhouette first. It should look recognizable at 32px and still work in black and white.\nVariant focus: a squat clay lump creature with one soft curled tip leaning gently forward, four tiny rounded feet, calm premium silhouette." - }, - { - "id": "02-soft-sprout", - "title": "软芽泥团", - "file": "taonier-short-foot-creature-02-soft-sprout.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nThe reference idea is only shape language: a squat soft clay lump creature sitting on the ground, with several very short rounded feet and a distinctive top tuft or curved horn. Do not copy realistic ceramic rendering.\nBrand core: fun creation. The mark should feel like a tiny clay-born creative spirit: soft, friendly, shareable, and able to turn ideas into playful AI/UGC casual game works.\nLogo type: simple mascot symbol only. It must be a brand mark, not a full character illustration, not a scene, not a sticker, not a rounded-square app icon background.\nMain silhouette: low center of gravity, closed mound body, slightly irregular but clean outline, broad base, 3 to 5 stubby rounded feet at the bottom. Feet must be short and cute, never claws, toes, paws, or realistic animal legs.\nTop silhouette: one memorable soft sculpted feature on the head, such as a curled clay tip, small pinched sprout, rounded horn, or soft wave tuft. The top feature should be part of the same clay body, not a separate hat or accessory.\nFace policy: face is optional; if used, only two tiny simple eye dots. No mouth, no blush, no emoji expression, no detailed face. The silhouette should work even without the face.\nStyle: modern minimalist vector mascot logo, flat brand-color shapes, clean curves, premium but warm. Slight clay warmth through color and form only; no realistic texture.\nColor direction: earthy but fresh, using warm clay beige, terracotta, cream white, soft coral, and a very small teal or mint accent if helpful. Avoid dirty mud, brick red dominance, candy gradients, glossy dessert rendering.\nFood avoidance is critical: do not make it look like mochi, dumpling, bun, bread, cake, cookie, candy, pudding, chocolate, jelly, or any edible mascot.\nAvoid pottery class object, ceramic figurine, handmade toy, rough mud texture, archaeology stamp, realistic glaze, 3D clay render, or shiny ceramic highlight.\nAvoid scary monster, teeth, claws, spikes, realistic animal, pet logo, chibi over-detailing, generic blob, star, spark, halo, magic wand, hand, pottery tool, UI, border, or watermark.\nComposition: centered on clean light background, generous safe area, strong readable silhouette first. It should look recognizable at 32px and still work in black and white.\nVariant focus: a low mound creature with a pinched sprout-like top made from the same clay body, three short feet, fresh and memorable." - }, - { - "id": "03-wave-tuft", - "title": "波浪小怪", - "file": "taonier-short-foot-creature-03-wave-tuft.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nThe reference idea is only shape language: a squat soft clay lump creature sitting on the ground, with several very short rounded feet and a distinctive top tuft or curved horn. Do not copy realistic ceramic rendering.\nBrand core: fun creation. The mark should feel like a tiny clay-born creative spirit: soft, friendly, shareable, and able to turn ideas into playful AI/UGC casual game works.\nLogo type: simple mascot symbol only. It must be a brand mark, not a full character illustration, not a scene, not a sticker, not a rounded-square app icon background.\nMain silhouette: low center of gravity, closed mound body, slightly irregular but clean outline, broad base, 3 to 5 stubby rounded feet at the bottom. Feet must be short and cute, never claws, toes, paws, or realistic animal legs.\nTop silhouette: one memorable soft sculpted feature on the head, such as a curled clay tip, small pinched sprout, rounded horn, or soft wave tuft. The top feature should be part of the same clay body, not a separate hat or accessory.\nFace policy: face is optional; if used, only two tiny simple eye dots. No mouth, no blush, no emoji expression, no detailed face. The silhouette should work even without the face.\nStyle: modern minimalist vector mascot logo, flat brand-color shapes, clean curves, premium but warm. Slight clay warmth through color and form only; no realistic texture.\nColor direction: earthy but fresh, using warm clay beige, terracotta, cream white, soft coral, and a very small teal or mint accent if helpful. Avoid dirty mud, brick red dominance, candy gradients, glossy dessert rendering.\nFood avoidance is critical: do not make it look like mochi, dumpling, bun, bread, cake, cookie, candy, pudding, chocolate, jelly, or any edible mascot.\nAvoid pottery class object, ceramic figurine, handmade toy, rough mud texture, archaeology stamp, realistic glaze, 3D clay render, or shiny ceramic highlight.\nAvoid scary monster, teeth, claws, spikes, realistic animal, pet logo, chibi over-detailing, generic blob, star, spark, halo, magic wand, hand, pottery tool, UI, border, or watermark.\nComposition: centered on clean light background, generous safe area, strong readable silhouette first. It should look recognizable at 32px and still work in black and white.\nVariant focus: a playful clay creature with a single wave-shaped top tuft, broad sitting base, 4 tiny feet, more dynamic but still logo-simple." - }, - { - "id": "04-round-horn", - "title": "圆角小怪", - "file": "taonier-short-foot-creature-04-round-horn.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nThe reference idea is only shape language: a squat soft clay lump creature sitting on the ground, with several very short rounded feet and a distinctive top tuft or curved horn. Do not copy realistic ceramic rendering.\nBrand core: fun creation. The mark should feel like a tiny clay-born creative spirit: soft, friendly, shareable, and able to turn ideas into playful AI/UGC casual game works.\nLogo type: simple mascot symbol only. It must be a brand mark, not a full character illustration, not a scene, not a sticker, not a rounded-square app icon background.\nMain silhouette: low center of gravity, closed mound body, slightly irregular but clean outline, broad base, 3 to 5 stubby rounded feet at the bottom. Feet must be short and cute, never claws, toes, paws, or realistic animal legs.\nTop silhouette: one memorable soft sculpted feature on the head, such as a curled clay tip, small pinched sprout, rounded horn, or soft wave tuft. The top feature should be part of the same clay body, not a separate hat or accessory.\nFace policy: face is optional; if used, only two tiny simple eye dots. No mouth, no blush, no emoji expression, no detailed face. The silhouette should work even without the face.\nStyle: modern minimalist vector mascot logo, flat brand-color shapes, clean curves, premium but warm. Slight clay warmth through color and form only; no realistic texture.\nColor direction: earthy but fresh, using warm clay beige, terracotta, cream white, soft coral, and a very small teal or mint accent if helpful. Avoid dirty mud, brick red dominance, candy gradients, glossy dessert rendering.\nFood avoidance is critical: do not make it look like mochi, dumpling, bun, bread, cake, cookie, candy, pudding, chocolate, jelly, or any edible mascot.\nAvoid pottery class object, ceramic figurine, handmade toy, rough mud texture, archaeology stamp, realistic glaze, 3D clay render, or shiny ceramic highlight.\nAvoid scary monster, teeth, claws, spikes, realistic animal, pet logo, chibi over-detailing, generic blob, star, spark, halo, magic wand, hand, pottery tool, UI, border, or watermark.\nComposition: centered on clean light background, generous safe area, strong readable silhouette first. It should look recognizable at 32px and still work in black and white.\nVariant focus: a friendly abstract little monster with one rounded horn-like bump and a second smaller bump, stubby feet, no scary details." - }, - { - "id": "05-low-squat", - "title": "低趴泥团", - "file": "taonier-short-foot-creature-05-low-squat.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nThe reference idea is only shape language: a squat soft clay lump creature sitting on the ground, with several very short rounded feet and a distinctive top tuft or curved horn. Do not copy realistic ceramic rendering.\nBrand core: fun creation. The mark should feel like a tiny clay-born creative spirit: soft, friendly, shareable, and able to turn ideas into playful AI/UGC casual game works.\nLogo type: simple mascot symbol only. It must be a brand mark, not a full character illustration, not a scene, not a sticker, not a rounded-square app icon background.\nMain silhouette: low center of gravity, closed mound body, slightly irregular but clean outline, broad base, 3 to 5 stubby rounded feet at the bottom. Feet must be short and cute, never claws, toes, paws, or realistic animal legs.\nTop silhouette: one memorable soft sculpted feature on the head, such as a curled clay tip, small pinched sprout, rounded horn, or soft wave tuft. The top feature should be part of the same clay body, not a separate hat or accessory.\nFace policy: face is optional; if used, only two tiny simple eye dots. No mouth, no blush, no emoji expression, no detailed face. The silhouette should work even without the face.\nStyle: modern minimalist vector mascot logo, flat brand-color shapes, clean curves, premium but warm. Slight clay warmth through color and form only; no realistic texture.\nColor direction: earthy but fresh, using warm clay beige, terracotta, cream white, soft coral, and a very small teal or mint accent if helpful. Avoid dirty mud, brick red dominance, candy gradients, glossy dessert rendering.\nFood avoidance is critical: do not make it look like mochi, dumpling, bun, bread, cake, cookie, candy, pudding, chocolate, jelly, or any edible mascot.\nAvoid pottery class object, ceramic figurine, handmade toy, rough mud texture, archaeology stamp, realistic glaze, 3D clay render, or shiny ceramic highlight.\nAvoid scary monster, teeth, claws, spikes, realistic animal, pet logo, chibi over-detailing, generic blob, star, spark, halo, magic wand, hand, pottery tool, UI, border, or watermark.\nComposition: centered on clean light background, generous safe area, strong readable silhouette first. It should look recognizable at 32px and still work in black and white.\nVariant focus: extra low and stable clay mound, wide base, five tiny rounded feet, top feature is a subtle pinched crest, very favicon-readable." - }, - { - "id": "06-asymmetric-charm", - "title": "偏心灵体", - "file": "taonier-short-foot-creature-06-asymmetric-charm.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nThe reference idea is only shape language: a squat soft clay lump creature sitting on the ground, with several very short rounded feet and a distinctive top tuft or curved horn. Do not copy realistic ceramic rendering.\nBrand core: fun creation. The mark should feel like a tiny clay-born creative spirit: soft, friendly, shareable, and able to turn ideas into playful AI/UGC casual game works.\nLogo type: simple mascot symbol only. It must be a brand mark, not a full character illustration, not a scene, not a sticker, not a rounded-square app icon background.\nMain silhouette: low center of gravity, closed mound body, slightly irregular but clean outline, broad base, 3 to 5 stubby rounded feet at the bottom. Feet must be short and cute, never claws, toes, paws, or realistic animal legs.\nTop silhouette: one memorable soft sculpted feature on the head, such as a curled clay tip, small pinched sprout, rounded horn, or soft wave tuft. The top feature should be part of the same clay body, not a separate hat or accessory.\nFace policy: face is optional; if used, only two tiny simple eye dots. No mouth, no blush, no emoji expression, no detailed face. The silhouette should work even without the face.\nStyle: modern minimalist vector mascot logo, flat brand-color shapes, clean curves, premium but warm. Slight clay warmth through color and form only; no realistic texture.\nColor direction: earthy but fresh, using warm clay beige, terracotta, cream white, soft coral, and a very small teal or mint accent if helpful. Avoid dirty mud, brick red dominance, candy gradients, glossy dessert rendering.\nFood avoidance is critical: do not make it look like mochi, dumpling, bun, bread, cake, cookie, candy, pudding, chocolate, jelly, or any edible mascot.\nAvoid pottery class object, ceramic figurine, handmade toy, rough mud texture, archaeology stamp, realistic glaze, 3D clay render, or shiny ceramic highlight.\nAvoid scary monster, teeth, claws, spikes, realistic animal, pet logo, chibi over-detailing, generic blob, star, spark, halo, magic wand, hand, pottery tool, UI, border, or watermark.\nComposition: centered on clean light background, generous safe area, strong readable silhouette first. It should look recognizable at 32px and still work in black and white.\nVariant focus: asymmetrical friendly spirit mark, body leans slightly to one side, curled top balances the shape, short feet stay grounded." - }, - { - "id": "07-avatar-bold", - "title": "头像强识别", - "file": "taonier-short-foot-creature-07-avatar-bold.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nThe reference idea is only shape language: a squat soft clay lump creature sitting on the ground, with several very short rounded feet and a distinctive top tuft or curved horn. Do not copy realistic ceramic rendering.\nBrand core: fun creation. The mark should feel like a tiny clay-born creative spirit: soft, friendly, shareable, and able to turn ideas into playful AI/UGC casual game works.\nLogo type: simple mascot symbol only. It must be a brand mark, not a full character illustration, not a scene, not a sticker, not a rounded-square app icon background.\nMain silhouette: low center of gravity, closed mound body, slightly irregular but clean outline, broad base, 3 to 5 stubby rounded feet at the bottom. Feet must be short and cute, never claws, toes, paws, or realistic animal legs.\nTop silhouette: one memorable soft sculpted feature on the head, such as a curled clay tip, small pinched sprout, rounded horn, or soft wave tuft. The top feature should be part of the same clay body, not a separate hat or accessory.\nFace policy: face is optional; if used, only two tiny simple eye dots. No mouth, no blush, no emoji expression, no detailed face. The silhouette should work even without the face.\nStyle: modern minimalist vector mascot logo, flat brand-color shapes, clean curves, premium but warm. Slight clay warmth through color and form only; no realistic texture.\nColor direction: earthy but fresh, using warm clay beige, terracotta, cream white, soft coral, and a very small teal or mint accent if helpful. Avoid dirty mud, brick red dominance, candy gradients, glossy dessert rendering.\nFood avoidance is critical: do not make it look like mochi, dumpling, bun, bread, cake, cookie, candy, pudding, chocolate, jelly, or any edible mascot.\nAvoid pottery class object, ceramic figurine, handmade toy, rough mud texture, archaeology stamp, realistic glaze, 3D clay render, or shiny ceramic highlight.\nAvoid scary monster, teeth, claws, spikes, realistic animal, pet logo, chibi over-detailing, generic blob, star, spark, halo, magic wand, hand, pottery tool, UI, border, or watermark.\nComposition: centered on clean light background, generous safe area, strong readable silhouette first. It should look recognizable at 32px and still work in black and white.\nVariant focus: bold social avatar readability, thick simple silhouette, two tiny eye dots allowed, top tuft and feet readable at 32px." - }, - { - "id": "08-vector-outline", - "title": "商标轮廓", - "file": "taonier-short-foot-creature-08-vector-outline.png", - "prompt": "Create an icon-only mascot logo symbol for the Chinese product named \"陶泥儿\"; do not render any Chinese, English, letters, numbers, wordmark, tagline, or text.\nThe reference idea is only shape language: a squat soft clay lump creature sitting on the ground, with several very short rounded feet and a distinctive top tuft or curved horn. Do not copy realistic ceramic rendering.\nBrand core: fun creation. The mark should feel like a tiny clay-born creative spirit: soft, friendly, shareable, and able to turn ideas into playful AI/UGC casual game works.\nLogo type: simple mascot symbol only. It must be a brand mark, not a full character illustration, not a scene, not a sticker, not a rounded-square app icon background.\nMain silhouette: low center of gravity, closed mound body, slightly irregular but clean outline, broad base, 3 to 5 stubby rounded feet at the bottom. Feet must be short and cute, never claws, toes, paws, or realistic animal legs.\nTop silhouette: one memorable soft sculpted feature on the head, such as a curled clay tip, small pinched sprout, rounded horn, or soft wave tuft. The top feature should be part of the same clay body, not a separate hat or accessory.\nFace policy: face is optional; if used, only two tiny simple eye dots. No mouth, no blush, no emoji expression, no detailed face. The silhouette should work even without the face.\nStyle: modern minimalist vector mascot logo, flat brand-color shapes, clean curves, premium but warm. Slight clay warmth through color and form only; no realistic texture.\nColor direction: earthy but fresh, using warm clay beige, terracotta, cream white, soft coral, and a very small teal or mint accent if helpful. Avoid dirty mud, brick red dominance, candy gradients, glossy dessert rendering.\nFood avoidance is critical: do not make it look like mochi, dumpling, bun, bread, cake, cookie, candy, pudding, chocolate, jelly, or any edible mascot.\nAvoid pottery class object, ceramic figurine, handmade toy, rough mud texture, archaeology stamp, realistic glaze, 3D clay render, or shiny ceramic highlight.\nAvoid scary monster, teeth, claws, spikes, realistic animal, pet logo, chibi over-detailing, generic blob, star, spark, halo, magic wand, hand, pottery tool, UI, border, or watermark.\nComposition: centered on clean light background, generous safe area, strong readable silhouette first. It should look recognizable at 32px and still work in black and white.\nVariant focus: designer-ready vector mark. Use 2-3 flat shapes, crisp boundaries, very strong black-and-white silhouette, minimal inner detail." - } - ] -} diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-01-curled-tip.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-01-curled-tip.png deleted file mode 100644 index 4461557f..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-01-curled-tip.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-02-soft-sprout.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-02-soft-sprout.png deleted file mode 100644 index 5a970cb6..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-02-soft-sprout.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-03-wave-tuft.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-03-wave-tuft.png deleted file mode 100644 index 124731c0..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-03-wave-tuft.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-04-round-horn.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-04-round-horn.png deleted file mode 100644 index 8f79afce..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-04-round-horn.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-05-low-squat.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-05-low-squat.png deleted file mode 100644 index 809c978f..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-05-low-squat.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-06-asymmetric-charm.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-06-asymmetric-charm.png deleted file mode 100644 index 48fd9dde..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-06-asymmetric-charm.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-07-avatar-bold.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-07-avatar-bold.png deleted file mode 100644 index 81e3b441..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-07-avatar-bold.png and /dev/null differ diff --git a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-08-vector-outline.png b/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-08-vector-outline.png deleted file mode 100644 index bc1b3799..00000000 Binary files a/public/branding/taonier-logo-short-foot-creature-concepts/taonier-short-foot-creature-08-vector-outline.png and /dev/null differ diff --git a/public/branding/taonier-logo-spiral-reference-concepts/taonier-logo-spiral-reference-contact-sheet.png b/public/branding/taonier-logo-spiral-reference-concepts/taonier-logo-spiral-reference-contact-sheet.png deleted file mode 100644 index 081680b1..00000000 Binary files a/public/branding/taonier-logo-spiral-reference-concepts/taonier-logo-spiral-reference-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-bouncy-clay.png b/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-bouncy-clay.png deleted file mode 100644 index be26c140..00000000 Binary files a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-bouncy-clay.png and /dev/null differ diff --git a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-candy-roll.png b/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-candy-roll.png deleted file mode 100644 index a15757c2..00000000 Binary files a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-candy-roll.png and /dev/null differ diff --git a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-creation-whirl.png b/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-creation-whirl.png deleted file mode 100644 index 8e44674b..00000000 Binary files a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-creation-whirl.png and /dev/null differ diff --git a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-reference.jpg b/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-reference.jpg deleted file mode 100644 index 909668d0..00000000 Binary files a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-reference.jpg and /dev/null differ diff --git a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-soft-squish.png b/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-soft-squish.png deleted file mode 100644 index 6bd10dd0..00000000 Binary files a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-soft-squish.png and /dev/null differ diff --git a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-soft-token.png b/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-soft-token.png deleted file mode 100644 index a03c8eb0..00000000 Binary files a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-soft-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-star-core.png b/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-star-core.png deleted file mode 100644 index 25d974b5..00000000 Binary files a/public/branding/taonier-logo-spiral-reference-concepts/taonier-spiral-star-core.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-concepts/taonier-logo-squish-contact-sheet.png b/public/branding/taonier-logo-squish-concepts/taonier-logo-squish-contact-sheet.png deleted file mode 100644 index 8d49544d..00000000 Binary files a/public/branding/taonier-logo-squish-concepts/taonier-logo-squish-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-bounce.png b/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-bounce.png deleted file mode 100644 index 619ae0b7..00000000 Binary files a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-bounce.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-comet.png b/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-comet.png deleted file mode 100644 index eaf7d61d..00000000 Binary files a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-comet.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-pulse.png b/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-pulse.png deleted file mode 100644 index ffb8f935..00000000 Binary files a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-pulse.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-spark-gap.png b/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-spark-gap.png deleted file mode 100644 index b82ae240..00000000 Binary files a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-spark-gap.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-token.png b/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-token.png deleted file mode 100644 index a80c05e4..00000000 Binary files a/public/branding/taonier-logo-squish-concepts/taonier-squish-v2-token.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-bubble-q.png b/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-bubble-q.png deleted file mode 100644 index ad325f91..00000000 Binary files a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-bubble-q.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-candy-mint.png b/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-candy-mint.png deleted file mode 100644 index 83f2cb53..00000000 Binary files a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-candy-mint.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-contact-sheet.png b/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-contact-sheet.png deleted file mode 100644 index 882d871b..00000000 Binary files a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-coral-soda.png b/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-coral-soda.png deleted file mode 100644 index 7add634e..00000000 Binary files a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-coral-soda.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-original-plus.png b/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-original-plus.png deleted file mode 100644 index 02bf0268..00000000 Binary files a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-original-plus.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-peach-jelly.png b/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-peach-jelly.png deleted file mode 100644 index 382cf5a8..00000000 Binary files a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-peach-jelly.png and /dev/null differ diff --git a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-pop-bright.png b/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-pop-bright.png deleted file mode 100644 index 89a21434..00000000 Binary files a/public/branding/taonier-logo-squish-recolor-variants/taonier-squish-recolor-pop-bright.png and /dev/null differ diff --git a/public/branding/taonier-logo-v3-concepts/taonier-logo-v3-contact-sheet.png b/public/branding/taonier-logo-v3-concepts/taonier-logo-v3-contact-sheet.png deleted file mode 100644 index 0140e14d..00000000 Binary files a/public/branding/taonier-logo-v3-concepts/taonier-logo-v3-contact-sheet.png and /dev/null differ diff --git a/public/branding/taonier-logo-v3-concepts/taonier-v3-finger-spark.png b/public/branding/taonier-logo-v3-concepts/taonier-v3-finger-spark.png deleted file mode 100644 index 6ad95167..00000000 Binary files a/public/branding/taonier-logo-v3-concepts/taonier-v3-finger-spark.png and /dev/null differ diff --git a/public/branding/taonier-logo-v3-concepts/taonier-v3-magic-dot.png b/public/branding/taonier-logo-v3-concepts/taonier-v3-magic-dot.png deleted file mode 100644 index c998fe77..00000000 Binary files a/public/branding/taonier-logo-v3-concepts/taonier-v3-magic-dot.png and /dev/null differ diff --git a/public/branding/taonier-logo-v3-concepts/taonier-v3-seed-pop.png b/public/branding/taonier-logo-v3-concepts/taonier-v3-seed-pop.png deleted file mode 100644 index 3173df89..00000000 Binary files a/public/branding/taonier-logo-v3-concepts/taonier-v3-seed-pop.png and /dev/null differ diff --git a/public/branding/taonier-logo-v3-concepts/taonier-v3-soft-t.png b/public/branding/taonier-logo-v3-concepts/taonier-v3-soft-t.png deleted file mode 100644 index 84f36dc4..00000000 Binary files a/public/branding/taonier-logo-v3-concepts/taonier-v3-soft-t.png and /dev/null differ diff --git a/public/branding/taonier-logo-v3-concepts/taonier-v3-work-gem.png b/public/branding/taonier-logo-v3-concepts/taonier-v3-work-gem.png deleted file mode 100644 index 688b8140..00000000 Binary files a/public/branding/taonier-logo-v3-concepts/taonier-v3-work-gem.png and /dev/null differ diff --git a/public/edutainment-baby-object/default-left-hand.png b/public/edutainment-baby-object/default-left-hand.png deleted file mode 100644 index 03c336cf..00000000 Binary files a/public/edutainment-baby-object/default-left-hand.png and /dev/null differ diff --git a/public/edutainment-baby-object/default-right-hand.png b/public/edutainment-baby-object/default-right-hand.png deleted file mode 100644 index 69f60995..00000000 Binary files a/public/edutainment-baby-object/default-right-hand.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-clean-transparent.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-clean-transparent.png deleted file mode 100644 index 62980beb..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-clean-transparent.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-defringed-strong.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-defringed-strong.png deleted file mode 100644 index 5f80b985..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-defringed-strong.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-defringed.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-defringed.png deleted file mode 100644 index 44fe9098..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-defringed.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-final-clean.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-final-clean.png deleted file mode 100644 index 03c336cf..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-final-clean.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-final-transparent.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-final-transparent.png deleted file mode 100644 index e072f085..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-final-transparent.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-transparent.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-transparent.png deleted file mode 100644 index e0be70c2..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-left-hand-v4-transparent.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-clean-transparent.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-clean-transparent.png deleted file mode 100644 index 6d6fa6cb..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-clean-transparent.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-defringed-strong.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-defringed-strong.png deleted file mode 100644 index c3433271..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-defringed-strong.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-defringed.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-defringed.png deleted file mode 100644 index af490122..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-defringed.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-final-clean.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-final-clean.png deleted file mode 100644 index 69f60995..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-final-clean.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-final-transparent.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-final-transparent.png deleted file mode 100644 index 99abe77b..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-final-transparent.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-transparent.png b/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-transparent.png deleted file mode 100644 index 60d923c4..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/baby-object-right-hand-v4-transparent.png and /dev/null differ diff --git a/public/edutainment-baby-object/image2-picture-book-hands/left-hand-picture-book-v1.png b/public/edutainment-baby-object/image2-picture-book-hands/left-hand-picture-book-v1.png deleted file mode 100644 index 34f5c1c5..00000000 Binary files a/public/edutainment-baby-object/image2-picture-book-hands/left-hand-picture-book-v1.png and /dev/null differ diff --git a/public/wooden-fish/default-hit-sound.mp3 b/public/wooden-fish/default-hit-sound.mp3 new file mode 100644 index 00000000..521b6c17 Binary files /dev/null and b/public/wooden-fish/default-hit-sound.mp3 differ diff --git a/scripts/dev.mjs b/scripts/dev.mjs index ef4fe055..0e2762b6 100644 --- a/scripts/dev.mjs +++ b/scripts/dev.mjs @@ -257,6 +257,96 @@ function requireCommand(command) { } } +function readWorkspaceSpacetimeVersion() { + const manifestText = readFileSync(manifestPath, 'utf8'); + const match = /^spacetimedb\s*=\s*(?:"([^"]+)"|\{[^}]*version\s*=\s*"([^"]+)")/mu.exec( + manifestText, + ); + const version = match?.[1] ?? match?.[2] ?? ''; + if (!version) { + throw new Error('无法从 server-rs/Cargo.toml 读取 spacetimedb 版本'); + } + return version; +} + +function parseSpacetimeToolVersion(output) { + const match = /spacetimedb tool version\s+([0-9]+\.[0-9]+\.[0-9]+)/u.exec(output); + return match?.[1] ?? ''; +} + +function readSpacetimeToolVersion() { + const result = spawnSync('spacetime', ['--version'], { + cwd: repoRoot, + encoding: 'utf8', + shell: process.platform === 'win32', + }); + + if (result.error) { + throw new Error(`读取 spacetime 版本失败: ${result.error.message}`); + } + + const output = `${result.stdout ?? ''}\n${result.stderr ?? ''}`; + const version = parseSpacetimeToolVersion(output); + if (!version) { + throw new Error(`无法解析 spacetime 版本输出: ${trimPreview(output)}`); + } + return version; +} + +function assertSpacetimeToolVersionMatchesWorkspace({ + toolVersion, + workspaceVersion, +}) { + if (toolVersion === workspaceVersion) { + return; + } + + throw new Error( + [ + `本机 spacetime CLI/standalone 版本 ${toolVersion} 与 server-rs 锁定的 SpacetimeDB ${workspaceVersion} 不一致。`, + '版本错位会导致 procedure 返回值 BSATN 反序列化失败,前端表现为 SpacetimeDB procedure 调用超时。', + `请执行 spacetime version install ${workspaceVersion} && spacetime version use ${workspaceVersion} 后重新运行本命令。`, + ].join(''), + ); +} + +function assertReusableSpacetimeProcessVersionMatchesWorkspace({ + dataDir, + serverUrl, +}) { + const recordedVersion = readRecordedSpacetimeToolVersion(dataDir); + const workspaceVersion = readWorkspaceSpacetimeVersion(); + if (!recordedVersion) { + throw new Error( + [ + `检测到正在运行的本地 SpacetimeDB: ${serverUrl},但缺少 SpacetimeDB 版本记录。`, + '为避免复用旧 standalone 导致 procedure 返回值 BSATN 反序列化失败和前端调用超时,请先停止该进程,再重新运行 npm run dev:spacetime。', + ].join(''), + ); + } + + if (recordedVersion === workspaceVersion) { + return; + } + + throw new Error( + [ + `正在运行的本地 SpacetimeDB standalone 版本 ${recordedVersion} 与 server-rs 锁定的 SpacetimeDB ${workspaceVersion} 不一致。`, + '版本错位会导致 procedure 返回值 BSATN 反序列化失败,前端表现为 SpacetimeDB procedure 调用超时。', + '请停止当前 SpacetimeDB 进程,执行 spacetime version use ', + workspaceVersion, + ' 后重新运行 npm run dev:spacetime。', + ].join(''), + ); +} + +function ensureSpacetimeToolVersionMatchesWorkspace() { + assertSpacetimeToolVersionMatchesWorkspace({ + toolVersion: readSpacetimeToolVersion(), + workspaceVersion: readWorkspaceSpacetimeVersion(), + }); +} + function ensureRequiredFiles(command) { const requiredFiles = []; @@ -478,6 +568,9 @@ class DevRunner { ) { requireCommand('spacetime'); } + if (this.shouldValidateSpacetimeToolVersion(command)) { + ensureSpacetimeToolVersionMatchesWorkspace(); + } await this.tryReuseExistingSpacetime(command); await this.resolvePorts(command); @@ -485,6 +578,19 @@ class DevRunner { this.printSummary(command); } + shouldValidateSpacetimeToolVersion(command) { + if (command === 'spacetime') { + return true; + } + if (command === 'all') { + return !this.options.skipSpacetime || !this.options.skipPublish; + } + if (command === 'api-server') { + return isLoopbackSpacetimeServer(this.state.spacetimeServer); + } + return false; + } + async tryReuseExistingSpacetime(command) { if (this.options.skipSpacetime) { return; @@ -525,6 +631,11 @@ class DevRunner { continue; } + assertReusableSpacetimeProcessVersionMatchesWorkspace({ + dataDir: this.options.spacetimeDataDir, + serverUrl: candidate, + }); + const port = safeUrlPort(candidate); if (Number.isInteger(port) && port > 0) { this.options.spacetimePort = port; @@ -705,6 +816,15 @@ class DevRunner { const logFile = resolve(options.spacetimeDataDir, 'logs/dev-spacetime-start.log'); const logStream = createWriteStream(logFile, {flags: 'a', encoding: 'utf8'}); service.logStream = logStream; + const spacetimeToolVersion = readSpacetimeToolVersion(); + assertSpacetimeToolVersionMatchesWorkspace({ + toolVersion: spacetimeToolVersion, + workspaceVersion: readWorkspaceSpacetimeVersion(), + }); + recordSpacetimeToolVersion( + options.spacetimeDataDir, + spacetimeToolVersion, + ); console.log(`[dev:spacetime] log: ${logFile}`); const env = { @@ -1357,6 +1477,15 @@ function readRecordedSpacetimeUrl(dataDir) { return ''; } +function readRecordedSpacetimeToolVersion(dataDir) { + const versionPath = resolve(dataDir, 'dev-spacetime-tool-version'); + if (!existsSync(versionPath)) { + return ''; + } + + return readFileSync(versionPath, 'utf8').split(/\r?\n/u)[0]?.trim() ?? ''; +} + function readRecordedSpacetimePidState(dataDir) { const pidPath = resolve(dataDir, 'spacetime.pid'); if (!existsSync(pidPath)) { @@ -1389,6 +1518,16 @@ function readRecordedSpacetimePidState(dataDir) { } } +function recordSpacetimeToolVersion(dataDir, version) { + const versionPath = resolve(dataDir, 'dev-spacetime-tool-version'); + ensureParentDir(versionPath); + try { + writeFileSync(versionPath, `${version}\n`, 'utf8'); + } catch (error) { + console.warn(`[dev:spacetime] 写入版本记录失败 ${versionPath}: ${error.message}`); + } +} + function recordSpacetimeUrl(dataDir, serverUrl) { const targets = [ resolve(dataDir, 'dev-spacetime-url'), @@ -1580,10 +1719,13 @@ function isSpacetimePublishPermissionError(error) { export { DevRunner, + assertReusableSpacetimeProcessVersionMatchesWorkspace, + assertSpacetimeToolVersionMatchesWorkspace, buildSpacetimePublishArgs, createDevServerSpawnOptions, createWatchConfigs, isSpacetimePublishPermissionError, + parseSpacetimeToolVersion, parseArgs, shouldAcceptWatchEvent, }; diff --git a/scripts/dev.test.ts b/scripts/dev.test.ts index 06015c59..851e9c07 100644 --- a/scripts/dev.test.ts +++ b/scripts/dev.test.ts @@ -1,4 +1,4 @@ -import {mkdtempSync, rmSync, writeFileSync} from 'node:fs'; +import {mkdtempSync, readFileSync, rmSync, writeFileSync} from 'node:fs'; import {tmpdir} from 'node:os'; import {join} from 'node:path'; @@ -6,10 +6,13 @@ import {afterEach, describe, expect, test, vi} from 'vitest'; import { DevRunner, + assertReusableSpacetimeProcessVersionMatchesWorkspace, + assertSpacetimeToolVersionMatchesWorkspace, buildSpacetimePublishArgs, createDevServerSpawnOptions, createWatchConfigs, isSpacetimePublishPermissionError, + parseSpacetimeToolVersion, parseArgs, shouldAcceptWatchEvent, } from './dev.mjs'; @@ -21,6 +24,15 @@ afterEach(() => { vi.restoreAllMocks(); }); +function workspaceSpacetimeVersionForTest() { + const manifestText = readFileSync('server-rs/Cargo.toml', 'utf8'); + const match = /^spacetimedb\s*=\s*"([^"]+)"/mu.exec(manifestText); + if (!match) { + throw new Error('无法读取测试用 SpacetimeDB 版本'); + } + return match[1]; +} + describe('dev scheduler argument routing', () => { test('完整 dev 栈覆盖前端代理到本次解析出的 api-server 地址', () => { const {command, explicitOptions, options} = parseArgs([], { @@ -104,6 +116,11 @@ describe('dev scheduler spacetime reuse guard', () => { try { writeFileSync(join(tempDir, 'dev-spacetime-url'), 'http://127.0.0.1:3199\n', 'utf8'); writeFileSync(join(tempDir, 'spacetime.pid'), `${process.pid}\n`, 'utf8'); + writeFileSync( + join(tempDir, 'dev-spacetime-tool-version'), + `${workspaceSpacetimeVersionForTest()}\n`, + 'utf8', + ); globalThis.fetch = vi.fn(async () => ({status: 200})) as unknown as typeof fetch; const {command, explicitOptions, options} = parseArgs( @@ -126,6 +143,11 @@ describe('dev scheduler spacetime reuse guard', () => { const tempDir = mkdtempSync(join(tmpdir(), 'genarrative-spacetime-reuse-')); try { writeFileSync(join(tempDir, 'spacetime.pid'), `${process.pid}\n`, 'utf8'); + writeFileSync( + join(tempDir, 'dev-spacetime-tool-version'), + `${workspaceSpacetimeVersionForTest()}\n`, + 'utf8', + ); globalThis.fetch = vi.fn(async () => ({status: 200})) as unknown as typeof fetch; const {command, explicitOptions, options} = parseArgs( @@ -212,6 +234,40 @@ describe('dev scheduler watch routing', () => { }); describe('dev scheduler spacetime refresh', () => { + test('解析 spacetime --version 输出里的 tool version', () => { + const version = parseSpacetimeToolVersion(` +A new version of SpacetimeDB is available: v2.2.0 (current: v2.1.0) +spacetimedb tool version 2.2.0; spacetimedb-lib version 2.2.0; +`); + + expect(version).toBe('2.2.0'); + }); + + test('本机 spacetime 版本和 workspace 锁定版本不一致时直接报清楚', () => { + expect(() => + assertSpacetimeToolVersionMatchesWorkspace({ + toolVersion: '2.1.0', + workspaceVersion: '2.2.0', + }), + ).toThrow('procedure 返回值 BSATN 反序列化失败'); + }); + + test('复用本地 SpacetimeDB standalone 前校验启动时版本记录', () => { + const tempDir = mkdtempSync(join(tmpdir(), 'genarrative-spacetime-version-')); + try { + writeFileSync(join(tempDir, 'dev-spacetime-tool-version'), '2.1.0\n', 'utf8'); + + expect(() => + assertReusableSpacetimeProcessVersionMatchesWorkspace({ + dataDir: tempDir, + serverUrl: 'http://127.0.0.1:3101', + }), + ).toThrow('SpacetimeDB procedure 调用超时'); + } finally { + rmSync(tempDir, {recursive: true, force: true}); + } + }); + test('本地发布 403 时识别为身份权限问题,避免误杀 standalone', () => { const error = new Error( 'Pre-publish check failed with status 403 Forbidden: c200... is not authorized to perform action on database c200...: update database', diff --git a/scripts/generate-edutainment-road-town-map-concepts.mjs b/scripts/generate-edutainment-road-town-map-concepts.mjs new file mode 100644 index 00000000..a821d251 --- /dev/null +++ b/scripts/generate-edutainment-road-town-map-concepts.mjs @@ -0,0 +1,443 @@ +import { Buffer } from 'node:buffer'; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; + +const repoRoot = process.cwd(); +const outDir = path.join( + repoRoot, + 'output', + 'imagegen', + 'edutainment-road-town-map-concepts-20260523', +); +const styleReferencePath = path.join( + repoRoot, + 'public', + 'child-motion-demo', + 'picture-book-grass-stage.png', +); +const layoutReferencePaths = [ + path.join(repoRoot, 'tmp', 'edutainment_video_frames', 'video1_t2_11950ms.png'), + path.join(repoRoot, 'tmp', 'edutainment_video_frames', 'video1_t3_23400ms.png'), +]; +const defaultTimeoutMs = 1000000; + +const commonPrompt = [ + '横屏 16:9 电视端寓教于乐板块玩法入口概念图。', + '新的结构要求:抛弃原本乐园地图、环形乐园、岛屿乐园和主题公园分区结构,改为参考 Toca Life World 地图的“马路串联小建筑群”结构。', + '每一屏都是一个完整的主题小建筑群街区:画面中心必须有一条灰蓝色可通车马路横向贯穿,马路有双车道、白色虚线、斑马线、路口、转弯支路和小汽车。', + '马路必须从画面左侧边缘进入、从画面右侧边缘离开,左右边缘都要明确暗示可以接到上一屏和下一屏,像横向滑动世界地图的一段。', + '建筑群沿马路两侧聚集,不要平均散成乐园点位;每屏像一个小镇街区、一组主题建筑、一段可探索街道。', + '采用轻微俯视的卡通等距地图视角,能看清建筑立面、屋顶、路网和车辆路径。', + '整体保持 Genarrative 寓教于乐现有明亮卡通绘本插画风:柔和水彩笔触、纸张纹理、温暖草地、浅蓝天空、圆润儿童友好、干净低噪声。', + '入口模块只用建筑外形和道具暗示,不写任何文字:识物可用水果店、动物卡片屋、观察橱窗;绘画可用彩笔工坊、画纸屋;动作可用小操场、跳圈馆;拼图可用积木拼图屋;声音节奏可用小剧场、音乐屋;自然探索可用树屋、温室、观测台。', + '参考图只用于学习“中央马路 + 两侧主题小建筑群 + 横向连续世界”的结构,不要复制 Toca Life World 的 logo、角色、建筑外形、UI、按钮、文字、字幕、水印或品牌元素。', + '不要出现中文、英文、数字、字母、按钮文案、UI 面板、教程说明、logo、水印、商业 IP、真实品牌、城堡、环球影城/迪士尼式乐园、环形乐园岛、漂浮岛、地球球体、过度奇幻设施、真实照片感、暗黑科技风。', +].join(''); + +const concepts = [ + { + id: 'edutainment-road-town-01-cognition-main-street', + title: '识物认知主街', + prompt: [ + commonPrompt, + '本屏主题:识物认知主街。', + '马路从左到右横穿中轴,路两侧是一组水果小店、动物观察窗、图形积木屋、透明展示橱窗和小型公交站,像儿童认知街区。', + '建筑数量 6 到 8 个,分成前景近路建筑和后景山坡建筑,街区整体紧凑,不能变成分散乐园点。', + '左边缘的道路要露出半个弯道和继续驶入的小汽车,右边缘道路继续出画,暗示下一屏可以接到绘画工坊街。', + ].join(''), + }, + { + id: 'edutainment-road-town-02-creative-workshop-street', + title: '绘画创作工坊街', + prompt: [ + commonPrompt, + '本屏主题:绘画创作工坊街。', + '中央马路横贯画面,马路两侧聚成彩笔工坊、画纸屋、颜料罐屋、绘本小剧场、手工材料店和圆顶小展馆。', + '建筑轮廓要像一组主题小建筑群,屋顶可有画笔、颜料、纸张、拼贴形状等图形化暗示,但不要出现任何文字。', + '左边道路接识物主街,右边道路接运动音乐街;用连续路面、车道线、小汽车和路灯强调可横向滑动探索。', + ].join(''), + }, + { + id: 'edutainment-road-town-03-motion-music-block', + title: '运动音乐街区', + prompt: [ + commonPrompt, + '本屏主题:运动音乐街区。', + '中央马路是主要路径,两侧是一组动作热身馆、小操场、跳圈屋、音乐小剧场、鼓点屋、铃铛塔和户外小舞台。', + '建筑群要围绕道路形成一个活泼街区,前景可以有迷你停车位、斑马线、小汽车、路牌形状图标,但不要文字。', + '道路左侧出画连接绘画创作工坊街,右侧出画连接自然探索街;画面边缘不能封死。', + ].join(''), + }, + { + id: 'edutainment-road-town-04-nature-lab-avenue', + title: '自然探索实验大道', + prompt: [ + commonPrompt, + '本屏主题:自然探索实验大道。', + '中央马路横向穿过一组自然探索小建筑群:温室、树屋、昆虫观察屋、云朵气象站、小望远镜塔、湖边小码头和拼图桥。', + '建筑沿道路成街区分布,后景是柔和山坡和树林,前景保留路边草地、停车位和小汽车路径。', + '左边道路接运动音乐街,右边道路继续进入森林或新的学习街区,明确体现一屏接一屏的世界地图结构。', + ].join(''), + }, +]; + +function readDotenv(fileName) { + const filePath = path.join(repoRoot, fileName); + if (!existsSync(filePath)) { + return {}; + } + + const values = {}; + for (const line of readFileSync(filePath, 'utf8').split(/\r?\n/u)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) { + continue; + } + const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/u.exec(trimmed); + if (!match) { + continue; + } + let value = match[2].trim(); + if ( + (value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'")) + ) { + value = value.slice(1, -1); + } + values[match[1]] = value; + } + return values; +} + +function resolveEnv() { + const loaded = { + ...readDotenv('.env.example'), + ...readDotenv('.env.local'), + ...readDotenv('.env.secrets.local'), + ...process.env, + }; + return { + baseUrl: String(loaded.VECTOR_ENGINE_BASE_URL || '') + .trim() + .replace(/\/+$/u, ''), + apiKey: String(loaded.VECTOR_ENGINE_API_KEY || '').trim(), + timeoutMs: Number.parseInt( + String(loaded.VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS || defaultTimeoutMs), + 10, + ), + }; +} + +function generationUrl(baseUrl) { + return baseUrl.endsWith('/v1') + ? `${baseUrl}/images/generations` + : `${baseUrl}/v1/images/generations`; +} + +function collectStringsByKey(value, targetKey, output) { + if (Array.isArray(value)) { + value.forEach((entry) => collectStringsByKey(entry, targetKey, output)); + return; + } + if (!value || typeof value !== 'object') { + return; + } + + for (const [key, nested] of Object.entries(value)) { + if (key === targetKey) { + if (typeof nested === 'string' && nested.trim()) { + output.push(nested.trim()); + } + if (Array.isArray(nested)) { + nested.forEach((entry) => { + if (typeof entry === 'string' && entry.trim()) { + output.push(entry.trim()); + } + }); + } + } + collectStringsByKey(nested, targetKey, output); + } +} + +function inferExtensionFromBytes(bytes) { + if (bytes.subarray(0, 8).equals(Buffer.from('\x89PNG\r\n\x1A\n', 'binary'))) { + return 'png'; + } + if (bytes.subarray(0, 3).equals(Buffer.from([0xff, 0xd8, 0xff]))) { + return 'jpg'; + } + if ( + bytes.subarray(0, 4).toString('ascii') === 'RIFF' && + bytes.subarray(8, 12).toString('ascii') === 'WEBP' + ) { + return 'webp'; + } + return 'png'; +} + +function inferExtensionFromContentType(contentType) { + const normalized = contentType.split(';')[0]?.trim().toLowerCase(); + if (normalized === 'image/png') { + return 'png'; + } + if (normalized === 'image/webp') { + return 'webp'; + } + if (normalized === 'image/jpeg') { + return 'jpg'; + } + return 'png'; +} + +function toDataUrl(filePath) { + if (!existsSync(filePath)) { + return null; + } + const bytes = readFileSync(filePath); + const extension = inferExtensionFromBytes(bytes); + const mime = extension === 'jpg' ? 'image/jpeg' : `image/${extension}`; + return `data:${mime};base64,${bytes.toString('base64')}`; +} + +function referenceDataUrls() { + return [styleReferencePath, ...layoutReferencePaths] + .map((filePath) => toDataUrl(filePath)) + .filter(Boolean); +} + +function buildRequestBody(concept, size, references) { + const body = { + model: 'gpt-image-2-all', + prompt: concept.prompt, + n: 1, + size, + }; + if (references.length > 0) { + body.image = references; + } + return body; +} + +function buildDryRunRequestBody(concept, size, references) { + return { + model: 'gpt-image-2-all', + prompt: concept.prompt, + n: 1, + size, + imageReferenceCount: references.length, + }; +} + +async function fetchJson(url, options, timeoutMs) { + const abortController = new AbortController(); + const timer = setTimeout(() => abortController.abort(), timeoutMs); + try { + const response = await fetch(url, { + ...options, + signal: abortController.signal, + }); + const text = await response.text(); + if (!response.ok) { + throw new Error(`VectorEngine ${response.status}: ${text.slice(0, 600)}`); + } + return JSON.parse(text); + } catch (error) { + if (error?.name === 'AbortError') { + throw new Error(`VectorEngine request timed out after ${timeoutMs}ms`); + } + throw error; + } finally { + clearTimeout(timer); + } +} + +async function downloadUrl(url, timeoutMs) { + const abortController = new AbortController(); + const timer = setTimeout(() => abortController.abort(), timeoutMs); + try { + const response = await fetch(url, { signal: abortController.signal }); + if (!response.ok) { + throw new Error(`download ${response.status}`); + } + return { + bytes: Buffer.from(await response.arrayBuffer()), + extension: inferExtensionFromContentType( + response.headers.get('content-type') || '', + ), + }; + } catch (error) { + if (error?.name === 'AbortError') { + throw new Error(`Generated image download timed out after ${timeoutMs}ms`); + } + throw error; + } finally { + clearTimeout(timer); + } +} + +function outputPathFor(concept, extension = 'png') { + return path.join(outDir, `${concept.id}.${extension}`); +} + +function findExistingOutputPath(concept) { + for (const extension of ['png', 'jpg', 'jpeg', 'webp']) { + const candidate = outputPathFor(concept, extension); + if (existsSync(candidate)) { + return candidate; + } + } + return null; +} + +async function generateOne(env, concept, size, references) { + const payload = await fetchJson( + generationUrl(env.baseUrl), + { + method: 'POST', + headers: { + Authorization: `Bearer ${env.apiKey}`, + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify(buildRequestBody(concept, size, references)), + }, + env.timeoutMs, + ); + + const urls = []; + const b64Images = []; + collectStringsByKey(payload, 'url', urls); + collectStringsByKey(payload, 'image', urls); + collectStringsByKey(payload, 'image_url', urls); + collectStringsByKey(payload, 'b64_json', b64Images); + + let image; + const imageUrl = [...new Set(urls)].find((url) => /^https?:\/\//u.test(url)); + if (imageUrl) { + image = await downloadUrl(imageUrl, env.timeoutMs); + } else if (b64Images[0]) { + const bytes = Buffer.from(b64Images[0], 'base64'); + image = { + bytes, + extension: inferExtensionFromBytes(bytes), + }; + } else { + throw new Error(`VectorEngine returned no image for ${concept.id}`); + } + + mkdirSync(outDir, { recursive: true }); + const outputPath = outputPathFor(concept, image.extension); + writeFileSync(outputPath, image.bytes); + return outputPath; +} + +const args = new Map(); +for (let index = 2; index < process.argv.length; index += 1) { + const raw = process.argv[index]; + if (raw.startsWith('--')) { + const next = process.argv[index + 1]; + if (next && !next.startsWith('--')) { + args.set(raw, next); + index += 1; + } else { + args.set(raw, true); + } + } +} + +const size = String(args.get('--size') || '3840x2160'); +const dryRun = args.has('--dry-run') || !args.has('--live'); +const selectedIds = String(args.get('--only') || '') + .split(',') + .map((value) => value.trim()) + .filter(Boolean); +const selectedConcepts = concepts.filter( + (concept) => selectedIds.length === 0 || selectedIds.includes(concept.id), +); +const references = referenceDataUrls(); + +if (dryRun) { + console.log( + JSON.stringify( + { + mode: 'dry-run', + outDir, + size, + styleReference: existsSync(styleReferencePath) + ? styleReferencePath + : null, + layoutReferences: layoutReferencePaths.filter((filePath) => + existsSync(filePath), + ), + count: selectedConcepts.length, + requests: selectedConcepts.map((concept) => ({ + id: concept.id, + title: concept.title, + body: buildDryRunRequestBody(concept, size, references), + })), + }, + null, + 2, + ), + ); + process.exit(0); +} + +const env = resolveEnv(); +if (!env.baseUrl || !env.apiKey) { + console.error( + JSON.stringify({ + ok: false, + error: 'Missing VECTOR_ENGINE_BASE_URL or VECTOR_ENGINE_API_KEY', + hasBaseUrl: Boolean(env.baseUrl), + hasApiKey: Boolean(env.apiKey), + }), + ); + process.exit(1); +} + +const files = []; +const generatedFileById = new Map(); +for (const concept of selectedConcepts) { + console.log(`Generating ${concept.id}...`); + const file = await generateOne(env, concept, size, references); + files.push(file); + generatedFileById.set(concept.id, file); +} + +const metadataFiles = concepts + .map((concept) => { + const file = generatedFileById.get(concept.id) ?? findExistingOutputPath(concept); + if (!file) { + return null; + } + return { + id: concept.id, + title: concept.title, + file, + prompt: concept.prompt, + }; + }) + .filter(Boolean); + +writeFileSync( + path.join(outDir, 'generation-metadata.json'), + JSON.stringify( + { + model: 'gpt-image-2-all', + size, + generatedAt: new Date().toISOString(), + styleReference: existsSync(styleReferencePath) ? styleReferencePath : null, + layoutReferences: layoutReferencePaths.filter((filePath) => + existsSync(filePath), + ), + generatedIds: selectedConcepts.map((concept) => concept.id), + files: metadataFiles, + }, + null, + 2, + ), +); + +console.log(JSON.stringify({ ok: true, count: files.length, files }, null, 2)); diff --git a/scripts/generate-edutainment-toca-world-map-concepts.mjs b/scripts/generate-edutainment-toca-world-map-concepts.mjs new file mode 100644 index 00000000..0cddf399 --- /dev/null +++ b/scripts/generate-edutainment-toca-world-map-concepts.mjs @@ -0,0 +1,422 @@ +import { Buffer } from 'node:buffer'; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; + +const repoRoot = process.cwd(); +const outDir = path.join( + repoRoot, + 'output', + 'imagegen', + 'edutainment-toca-world-map-concepts-20260523', +); +const styleReferencePath = path.join( + repoRoot, + 'public', + 'child-motion-demo', + 'picture-book-grass-stage.png', +); +const defaultTimeoutMs = 1000000; + +const commonPrompt = [ + '横屏 16:9 寓教于乐板块玩法入口概念图。', + '参考 Toca Life World 的地图组织方式:一个横向展开的大世界,允许向左和向右以“一屏一屏”的单位继续延伸和探索。', + '画面必须像儿童绘本插画,明亮、干净、温暖、圆润、手绘感强,保留 Genarrative 寓教于乐现有的草地、水彩、纸张纹理和童趣气质。', + '地图里要有清晰的道路、步道、河流、桥、分区节点和地标,但不要复制 Toca 的 logo、角色、字体、UI、建筑外形或配色。', + '每个玩法入口都要像一个可单独进入的区域,区域之间既连贯又能独立辨认,适合后续做横向滑动或分屏探索。', + '左右两侧都要有明显的延展感,边缘不能封死,重要场景不要都挤在画面中心。', + '中心只保留一个轻量主枢纽,左右各留出半屏到一屏的可继续探索空间。', + '不要出现文字、数字、字母、按钮文案、UI 面板、logo、水印、真实照片感、暗黑科技风、过度复杂的人物表情、现成商业 IP 角色。', +].join(''); + +const concepts = [ + { + id: 'edutainment-toca-world-01-river-town', + title: '河道城镇带', + prompt: [ + commonPrompt, + '版式方向:一条横向城镇带沿着河道和主路展开,左边是果园与识物区,中间是创作和主枢纽区,右边是音乐广场、自然观察和运动区。', + '每个区域像独立小镇街区,房屋和设施分布在道路两侧,远处山坡和天空继续延伸,整体感觉像可以一直向左右滑动。', + '左侧入口更偏自然与认知,右侧入口更偏探索与表演,中间保留一个安静广场作为聚合点。', + ].join(''), + }, + { + id: 'edutainment-toca-world-02-mountain-arc', + title: '山脊长廊', + prompt: [ + commonPrompt, + '版式方向:一条山脊和环山公路贯穿左右,地图像被拉长的山地长廊,城市、树林、草坡和小店沿山脊展开。', + '左屏是水果农场和画画工坊,中屏是社区广场和拼图桥,右屏是音乐小剧场、动物观察和冒险步道。', + '地形要有明显起伏,但道路必须连续、可走、可向两侧继续延伸,像同一世界的不同屏幕段落。', + ].join(''), + }, + { + id: 'edutainment-toca-world-03-island-chain', + title: '岛链世界', + prompt: [ + commonPrompt, + '版式方向:多个小岛通过桥梁、栈道和缆车相连,像一条横向的岛链,每个岛都像一屏可探索区域。', + '左侧岛是识物果园岛,中间岛是绘本创作岛和主广场,右侧岛是运动草地岛、音乐舞台岛和自然探索岛。', + '每个岛的边缘都要暗示下一岛的延伸,水面和道路自然把画面向左向右打开,不要封闭成一个圆形世界。', + ].join(''), + }, + { + id: 'edutainment-toca-world-04-city-park-spine', + title: '城市公园脊', + prompt: [ + commonPrompt, + '版式方向:一条城市公园主脊从左到右穿过整个画面,主脊两侧是不同功能街区,像儿童版的世界地图主干道。', + '左边是安静学习区和果园,中央是综合广场、画画棚和拼图桥,右边是音乐广场、运动场、动物观测点和森林边界。', + '整体更接近 Toca 式“世界菜单”感,但美术要更像绘本插画,不要扁平矢量 UI,也不要把地图画成球体。', + ].join(''), + }, +]; + +function readDotenv(fileName) { + const filePath = path.join(repoRoot, fileName); + if (!existsSync(filePath)) { + return {}; + } + + const values = {}; + for (const line of readFileSync(filePath, 'utf8').split(/\r?\n/u)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) { + continue; + } + const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/u.exec(trimmed); + if (!match) { + continue; + } + let value = match[2].trim(); + if ( + (value.startsWith('"') && value.endsWith('"')) || + (value.startsWith("'") && value.endsWith("'")) + ) { + value = value.slice(1, -1); + } + values[match[1]] = value; + } + return values; +} + +function resolveEnv() { + const loaded = { + ...readDotenv('.env.example'), + ...readDotenv('.env.local'), + ...readDotenv('.env.secrets.local'), + ...process.env, + }; + return { + baseUrl: String(loaded.VECTOR_ENGINE_BASE_URL || '') + .trim() + .replace(/\/+$/u, ''), + apiKey: String(loaded.VECTOR_ENGINE_API_KEY || '').trim(), + timeoutMs: Number.parseInt( + String(loaded.VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS || defaultTimeoutMs), + 10, + ), + }; +} + +function generationUrl(baseUrl) { + return baseUrl.endsWith('/v1') + ? `${baseUrl}/images/generations` + : `${baseUrl}/v1/images/generations`; +} + +function collectStringsByKey(value, targetKey, output) { + if (Array.isArray(value)) { + value.forEach((entry) => collectStringsByKey(entry, targetKey, output)); + return; + } + if (!value || typeof value !== 'object') { + return; + } + + for (const [key, nested] of Object.entries(value)) { + if (key === targetKey) { + if (typeof nested === 'string' && nested.trim()) { + output.push(nested.trim()); + } + if (Array.isArray(nested)) { + nested.forEach((entry) => { + if (typeof entry === 'string' && entry.trim()) { + output.push(entry.trim()); + } + }); + } + } + collectStringsByKey(nested, targetKey, output); + } +} + +function inferExtensionFromBytes(bytes) { + if (bytes.subarray(0, 8).equals(Buffer.from('\x89PNG\r\n\x1A\n', 'binary'))) { + return 'png'; + } + if (bytes.subarray(0, 3).equals(Buffer.from([0xff, 0xd8, 0xff]))) { + return 'jpg'; + } + if ( + bytes.subarray(0, 4).toString('ascii') === 'RIFF' && + bytes.subarray(8, 12).toString('ascii') === 'WEBP' + ) { + return 'webp'; + } + return 'png'; +} + +function inferExtensionFromContentType(contentType) { + const normalized = contentType.split(';')[0]?.trim().toLowerCase(); + if (normalized === 'image/png') { + return 'png'; + } + if (normalized === 'image/webp') { + return 'webp'; + } + if (normalized === 'image/jpeg') { + return 'jpg'; + } + return 'png'; +} + +function toDataUrl(filePath) { + if (!existsSync(filePath)) { + return null; + } + const bytes = readFileSync(filePath); + const extension = inferExtensionFromBytes(bytes); + const mime = extension === 'jpg' ? 'image/jpeg' : `image/${extension}`; + return `data:${mime};base64,${bytes.toString('base64')}`; +} + +function buildRequestBody(concept, size, hasStyleReference) { + const body = { + model: 'gpt-image-2-all', + prompt: concept.prompt, + n: 1, + size, + }; + if (hasStyleReference) { + const ref = toDataUrl(styleReferencePath); + if (ref) { + body.image = [ref]; + } + } + return body; +} + +function buildDryRunRequestBody(concept, size, hasStyleReference) { + return { + model: 'gpt-image-2-all', + prompt: concept.prompt, + n: 1, + size, + imageReferenceCount: hasStyleReference ? 1 : 0, + }; +} + +async function fetchJson(url, options, timeoutMs) { + const abortController = new AbortController(); + const timer = setTimeout(() => abortController.abort(), timeoutMs); + try { + const response = await fetch(url, { + ...options, + signal: abortController.signal, + }); + const text = await response.text(); + if (!response.ok) { + throw new Error(`VectorEngine ${response.status}: ${text.slice(0, 600)}`); + } + return JSON.parse(text); + } catch (error) { + if (error?.name === 'AbortError') { + throw new Error(`VectorEngine request timed out after ${timeoutMs}ms`); + } + throw error; + } finally { + clearTimeout(timer); + } +} + +async function downloadUrl(url, timeoutMs) { + const abortController = new AbortController(); + const timer = setTimeout(() => abortController.abort(), timeoutMs); + try { + const response = await fetch(url, { signal: abortController.signal }); + if (!response.ok) { + throw new Error(`download ${response.status}`); + } + return { + bytes: Buffer.from(await response.arrayBuffer()), + extension: inferExtensionFromContentType( + response.headers.get('content-type') || '', + ), + }; + } catch (error) { + if (error?.name === 'AbortError') { + throw new Error(`Generated image download timed out after ${timeoutMs}ms`); + } + throw error; + } finally { + clearTimeout(timer); + } +} + +function outputPathFor(concept, extension = 'png') { + return path.join(outDir, `${concept.id}.${extension}`); +} + +function findExistingOutputPath(concept) { + for (const extension of ['png', 'jpg', 'jpeg', 'webp']) { + const candidate = outputPathFor(concept, extension); + if (existsSync(candidate)) { + return candidate; + } + } + return null; +} + +async function generateOne(env, concept, size) { + const payload = await fetchJson( + generationUrl(env.baseUrl), + { + method: 'POST', + headers: { + Authorization: `Bearer ${env.apiKey}`, + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify(buildRequestBody(concept, size, existsSync(styleReferencePath))), + }, + env.timeoutMs, + ); + + const urls = []; + const b64Images = []; + collectStringsByKey(payload, 'url', urls); + collectStringsByKey(payload, 'image', urls); + collectStringsByKey(payload, 'image_url', urls); + collectStringsByKey(payload, 'b64_json', b64Images); + + let image; + const imageUrl = [...new Set(urls)].find((url) => /^https?:\/\//u.test(url)); + if (imageUrl) { + image = await downloadUrl(imageUrl, env.timeoutMs); + } else if (b64Images[0]) { + const bytes = Buffer.from(b64Images[0], 'base64'); + image = { + bytes, + extension: inferExtensionFromBytes(bytes), + }; + } else { + throw new Error(`VectorEngine returned no image for ${concept.id}`); + } + + mkdirSync(outDir, { recursive: true }); + const outputPath = outputPathFor(concept, image.extension); + writeFileSync(outputPath, image.bytes); + return outputPath; +} + +const args = new Map(); +for (let index = 2; index < process.argv.length; index += 1) { + const raw = process.argv[index]; + if (raw.startsWith('--')) { + const next = process.argv[index + 1]; + if (next && !next.startsWith('--')) { + args.set(raw, next); + index += 1; + } else { + args.set(raw, true); + } + } +} + +const size = String(args.get('--size') || '2048x1152'); +const dryRun = args.has('--dry-run') || !args.has('--live'); +const selectedIds = String(args.get('--only') || '') + .split(',') + .map((value) => value.trim()) + .filter(Boolean); +const selectedConcepts = concepts.filter( + (concept) => selectedIds.length === 0 || selectedIds.includes(concept.id), +); +const hasStyleReference = existsSync(styleReferencePath); + +if (dryRun) { + console.log( + JSON.stringify( + { + mode: 'dry-run', + outDir, + size, + hasStyleReference, + count: selectedConcepts.length, + requests: selectedConcepts.map((concept) => ({ + id: concept.id, + title: concept.title, + body: buildDryRunRequestBody(concept, size, hasStyleReference), + })), + }, + null, + 2, + ), + ); + process.exit(0); +} + +const env = resolveEnv(); +if (!env.baseUrl || !env.apiKey) { + console.error( + JSON.stringify({ + ok: false, + error: 'Missing VECTOR_ENGINE_BASE_URL or VECTOR_ENGINE_API_KEY', + hasBaseUrl: Boolean(env.baseUrl), + hasApiKey: Boolean(env.apiKey), + }), + ); + process.exit(1); +} + +const files = []; +const generatedFileById = new Map(); +for (const concept of selectedConcepts) { + console.log(`Generating ${concept.id}...`); + const file = await generateOne(env, concept, size); + files.push(file); + generatedFileById.set(concept.id, file); +} + +const metadataFiles = concepts + .map((concept) => { + const file = generatedFileById.get(concept.id) ?? findExistingOutputPath(concept); + if (!file) { + return null; + } + return { + id: concept.id, + title: concept.title, + file, + prompt: concept.prompt, + }; + }) + .filter(Boolean); + +writeFileSync( + path.join(outDir, 'generation-metadata.json'), + JSON.stringify( + { + model: 'gpt-image-2-all', + size, + generatedAt: new Date().toISOString(), + styleReference: hasStyleReference ? styleReferencePath : null, + generatedIds: selectedConcepts.map((concept) => concept.id), + files: metadataFiles, + }, + null, + 2, + ), +); + +console.log(JSON.stringify({ ok: true, count: files.length, files }, null, 2)); diff --git a/server-rs/crates/api-server/src/vector_engine_audio_generation.rs b/server-rs/crates/api-server/src/vector_engine_audio_generation.rs index 04e51f6e..e44f141e 100644 --- a/server-rs/crates/api-server/src/vector_engine_audio_generation.rs +++ b/server-rs/crates/api-server/src/vector_engine_audio_generation.rs @@ -233,15 +233,13 @@ pub async fn create_visual_novel_sound_effect_task( } pub async fn create_sound_effect_task( - State(state): State, + State(_state): State, axum::extract::Extension(request_context): axum::extract::Extension, payload: Result, JsonRejection>, ) -> Result, Response> { - let Json(payload) = parse_json_payload(&request_context, payload)?; - create_sound_effect_task_response(&state, payload.prompt, payload.duration, payload.seed) - .await - .map(|task| json_success_body(Some(&request_context), task)) - .map_err(|error| error.into_response_with_context(Some(&request_context))) + let _ = parse_json_payload(&request_context, payload)?; + Err(creation_audio_generation_disabled_error() + .into_response_with_context(Some(&request_context))) } pub(crate) async fn generate_sound_effect_asset_for_creation( @@ -874,27 +872,8 @@ fn build_visual_novel_audio_target( fn build_creation_audio_target( payload: creation_audio::PublishGeneratedAudioAssetRequest, - slot: AudioAssetSlot, + _slot: AudioAssetSlot, ) -> Result { - if matches!(slot, AudioAssetSlot::SoundEffect) - && payload.entity_kind.trim() == "wooden_fish_work" - && payload.slot.trim() == "hit_sound" - && payload.asset_kind.trim() == "wooden_fish_hit_sound" - && payload.storage_prefix - == Some(creation_audio::CreationAudioStoragePrefix::WoodenFishAssets) - { - let entity_id = normalize_limited_text(&payload.entity_id, "entityId", 160)?; - return Ok(AudioAssetBindingTarget { - storage_scope: payload.entity_kind.trim().to_string(), - entity_kind: payload.entity_kind.trim().to_string(), - entity_id, - slot: payload.slot.trim().to_string(), - asset_kind: payload.asset_kind.trim().to_string(), - profile_id: normalize_optional_text(payload.profile_id.as_deref()), - storage_prefix: LegacyAssetPrefix::WoodenFishAssets, - }); - } - Err(creation_audio_generation_disabled_error_for_target(payload)) } @@ -1473,7 +1452,7 @@ mod tests { } #[test] - fn disabled_creation_audio_targets_return_gone_except_wooden_fish_sound_effects() { + fn disabled_creation_audio_targets_return_gone_including_wooden_fish_sound_effects() { let payload = creation_audio::PublishGeneratedAudioAssetRequest { entity_kind: "puzzle_work".to_string(), entity_id: "puzzle-profile-1".to_string(), @@ -1515,13 +1494,9 @@ mod tests { profile_id: Some("wooden-fish-profile-1".to_string()), storage_prefix: Some(creation_audio::CreationAudioStoragePrefix::WoodenFishAssets), }; - let target = build_creation_audio_target(payload, AudioAssetSlot::SoundEffect) - .expect("wooden fish hit sound target should be enabled"); - - assert_eq!(target.entity_kind, "wooden_fish_work"); - assert_eq!(target.slot, "hit_sound"); - assert_eq!(target.storage_prefix, LegacyAssetPrefix::WoodenFishAssets); - assert_eq!(target.storage_scope, "wooden_fish_work"); + let error = build_creation_audio_target(payload, AudioAssetSlot::SoundEffect) + .expect_err("wooden fish hit sound target should be disabled"); + assert_eq!(error.status_code(), StatusCode::GONE); } #[test] diff --git a/server-rs/crates/api-server/src/wooden_fish.rs b/server-rs/crates/api-server/src/wooden_fish.rs index 016cfa3a..b5e94452 100644 --- a/server-rs/crates/api-server/src/wooden_fish.rs +++ b/server-rs/crates/api-server/src/wooden_fish.rs @@ -42,9 +42,6 @@ use crate::{ platform_errors::map_oss_error, request_context::RequestContext, state::AppState, - vector_engine_audio_generation::{ - GeneratedCreationAudioTarget, generate_sound_effect_asset_for_creation, - }, }; const WOODEN_FISH_PROVIDER: &str = "wooden-fish"; @@ -53,16 +50,17 @@ const WOODEN_FISH_RUNTIME_PROVIDER: &str = "wooden-fish-runtime"; const WOODEN_FISH_TEMPLATE_ID: &str = "wooden-fish"; const WOODEN_FISH_TEMPLATE_NAME: &str = "敲木鱼"; const DEFAULT_HIT_OBJECT_PROMPT: &str = "默认敲击物图案,圆润木质质感,透明背景"; -const DEFAULT_HIT_SOUND_PROMPT: &str = "清脆短促的木鱼敲击声"; const DEFAULT_HIT_OBJECT_ASSET_ID: &str = "wooden-fish-default-hit-object"; const DEFAULT_HIT_OBJECT_IMAGE_SRC: &str = "/wooden-fish/default-hit-object.png"; +const DEFAULT_HIT_SOUND_ASSET_ID: &str = "wooden-fish-default-hit-sound"; +const DEFAULT_HIT_SOUND_AUDIO_SRC: &str = "/wooden-fish/default-hit-sound.mp3"; const WOODEN_FISH_ENTITY_KIND: &str = "wooden_fish_work"; const WOODEN_FISH_HIT_OBJECT_SLOT: &str = "hit_object"; const WOODEN_FISH_HIT_OBJECT_ASSET_KIND: &str = "wooden_fish_hit_object"; const WOODEN_FISH_BACKGROUND_SLOT: &str = "background"; const WOODEN_FISH_BACKGROUND_ASSET_KIND: &str = "wooden_fish_background"; -const WOODEN_FISH_HIT_SOUND_SLOT: &str = "hit_sound"; -const WOODEN_FISH_HIT_SOUND_ASSET_KIND: &str = "wooden_fish_hit_sound"; +const WOODEN_FISH_BACK_BUTTON_SLOT: &str = "back_button"; +const WOODEN_FISH_BACK_BUTTON_ASSET_KIND: &str = "wooden_fish_back_button"; const WOODEN_FISH_HIT_SOUND_DURATION_SECONDS: u8 = 3; const DEFAULT_HIT_OBJECT_REFERENCE_BYTES: &[u8] = include_bytes!(concat!( env!("CARGO_MANIFEST_DIR"), @@ -154,14 +152,7 @@ pub async fn execute_wooden_fish_action( &mut payload, ) .await?; - maybe_generate_hit_sound_asset( - &state, - &request_context, - &session_id, - owner_user_id.as_str(), - &mut payload, - ) - .await?; + maybe_generate_hit_sound_asset(&mut payload); let response = state .spacetime_client() .execute_wooden_fish_action(session_id, owner_user_id, payload) @@ -371,16 +362,15 @@ fn build_wooden_fish_draft(payload: &WoodenFishWorkspaceCreateRequest) -> Wooden .as_ref() .map(|value| value.trim().to_string()) .filter(|value| !value.is_empty()), - hit_sound_prompt: payload - .hit_sound_prompt - .as_ref() - .map(|value| value.trim().to_string()) - .filter(|value| !value.is_empty()) - .or_else(|| Some(DEFAULT_HIT_SOUND_PROMPT.to_string())), + hit_sound_prompt: None, floating_words: normalize_floating_words(payload.floating_words.clone()), hit_object_asset: None, background_asset: None, - hit_sound_asset: payload.hit_sound_asset.clone(), + back_button_asset: None, + hit_sound_asset: payload + .hit_sound_asset + .clone() + .or_else(|| Some(default_wooden_fish_hit_sound_asset())), cover_image_src: None, generation_status: WoodenFishGenerationStatus::Draft, } @@ -418,7 +408,10 @@ async fn maybe_generate_hit_object_asset( ) { return Ok(()); } - if payload.hit_object_asset.is_some() && payload.background_asset.is_some() { + if payload.hit_object_asset.is_some() + && payload.background_asset.is_some() + && payload.back_button_asset.is_some() + { return Ok(()); } @@ -447,6 +440,7 @@ async fn maybe_generate_hit_object_asset( })?; payload.hit_object_asset = Some(generated.hit_object_asset); payload.background_asset = Some(generated.background_asset); + payload.back_button_asset = Some(generated.back_button_asset); Ok(()) } @@ -463,6 +457,18 @@ fn default_wooden_fish_hit_object_asset() -> WoodenFishImageAsset { } } +fn default_wooden_fish_hit_sound_asset() -> WoodenFishAudioAsset { + WoodenFishAudioAsset { + asset_id: DEFAULT_HIT_SOUND_ASSET_ID.to_string(), + audio_src: DEFAULT_HIT_SOUND_AUDIO_SRC.to_string(), + audio_object_key: "public/wooden-fish/default-hit-sound.mp3".to_string(), + asset_object_id: DEFAULT_HIT_SOUND_ASSET_ID.to_string(), + source: "bundled-default".to_string(), + prompt: Some("默认木鱼音".to_string()), + duration_ms: Some(u32::from(WOODEN_FISH_HIT_SOUND_DURATION_SECONDS) * 1_000), + } +} + fn is_default_hit_object_prompt(prompt: &str) -> bool { let normalized = normalize_hit_object_prompt_for_default_match(prompt); normalized.is_empty() @@ -530,130 +536,27 @@ async fn resolve_hit_object_profile_id( }) } -async fn maybe_generate_hit_sound_asset( - state: &AppState, - request_context: &RequestContext, - session_id: &str, - owner_user_id: &str, - payload: &mut WoodenFishActionRequest, -) -> Result<(), Response> { +fn maybe_generate_hit_sound_asset(payload: &mut WoodenFishActionRequest) { if !matches!( payload.action_type, shared_contracts::wooden_fish::WoodenFishActionType::CompileDraft | shared_contracts::wooden_fish::WoodenFishActionType::GenerateHitSound + | shared_contracts::wooden_fish::WoodenFishActionType::ReplaceHitSound ) { - return Ok(()); + return; } - if matches!( - payload.action_type, - shared_contracts::wooden_fish::WoodenFishActionType::CompileDraft - ) && payload.hit_sound_asset.is_some() - { - return Ok(()); + payload.hit_sound_prompt = None; + if payload.hit_sound_asset.is_some() { + return; } - let profile_id = - resolve_hit_object_profile_id(state, request_context, session_id, owner_user_id, payload) - .await?; - payload.profile_id = Some(profile_id.clone()); - let prompt = payload - .hit_sound_prompt - .as_deref() - .map(|value| clean_string(value, DEFAULT_HIT_SOUND_PROMPT)) - .filter(|value| !value.trim().is_empty()) - .unwrap_or_else(|| DEFAULT_HIT_SOUND_PROMPT.to_string()); - - let asset = generate_wooden_fish_hit_sound_asset( - state, - owner_user_id, - profile_id.as_str(), - prompt.as_str(), - ) - .await - .map_err(|error| { - wooden_fish_error_response(request_context, WOODEN_FISH_CREATION_PROVIDER, error) - })?; - payload.hit_sound_asset = Some(asset); - Ok(()) -} - -async fn generate_wooden_fish_hit_sound_asset( - state: &AppState, - owner_user_id: &str, - profile_id: &str, - prompt: &str, -) -> Result { - let final_prompt = build_wooden_fish_hit_sound_prompt(prompt); - let generated = generate_sound_effect_asset_for_creation( - state, - owner_user_id, - final_prompt.clone(), - Some(WOODEN_FISH_HIT_SOUND_DURATION_SECONDS), - None, - GeneratedCreationAudioTarget { - entity_kind: WOODEN_FISH_ENTITY_KIND.to_string(), - entity_id: profile_id.to_string(), - slot: WOODEN_FISH_HIT_SOUND_SLOT.to_string(), - asset_kind: WOODEN_FISH_HIT_SOUND_ASSET_KIND.to_string(), - profile_id: Some(profile_id.to_string()), - storage_prefix: LegacyAssetPrefix::WoodenFishAssets, - }, - ) - .await?; - map_generated_creation_audio_to_wooden_fish_asset( - profile_id, - final_prompt.as_str(), - generated, - WOODEN_FISH_HIT_SOUND_DURATION_SECONDS, - ) -} - -fn build_wooden_fish_hit_sound_prompt(prompt: &str) -> String { - format!( - "为敲木鱼玩法生成一次点击触发的短促敲击音效:{}。要求:干净、清脆、无旋律、无环境噪声、无语音、无文字提示音,适合高频点击时叠加播放。", - clean_string(prompt, DEFAULT_HIT_SOUND_PROMPT) - ) -} - -fn map_generated_creation_audio_to_wooden_fish_asset( - profile_id: &str, - prompt: &str, - asset: shared_contracts::creation_audio::CreationAudioAsset, - duration_seconds: u8, -) -> Result { - let asset_object_id = asset - .asset_object_id - .filter(|value| !value.trim().is_empty()) - .ok_or_else(|| { - AppError::from_status(StatusCode::BAD_GATEWAY).with_details(json!({ - "provider": "vector-engine", - "message": "敲木鱼音效生成完成但缺少资产对象 ID", - })) - })?; - let audio_object_key = asset.audio_src.trim().trim_start_matches('/').to_string(); - if audio_object_key.is_empty() { - return Err( - AppError::from_status(StatusCode::BAD_GATEWAY).with_details(json!({ - "provider": "vector-engine", - "message": "敲木鱼音效生成完成但缺少音频地址", - })), - ); - } - - Ok(WoodenFishAudioAsset { - asset_id: format!("{profile_id}-hit-sound-{}", asset.task_id), - audio_src: asset.audio_src, - audio_object_key, - asset_object_id, - source: "generated".to_string(), - prompt: asset.prompt.or_else(|| Some(prompt.to_string())), - duration_ms: Some(u32::from(duration_seconds) * 1_000), - }) + payload.hit_sound_asset = Some(default_wooden_fish_hit_sound_asset()); } struct WoodenFishGeneratedImageAssets { hit_object_asset: WoodenFishImageAsset, background_asset: WoodenFishImageAsset, + back_button_asset: WoodenFishImageAsset, } async fn generate_wooden_fish_image_assets( @@ -674,7 +577,7 @@ async fn generate_wooden_fish_image_assets( let theme_reference_image = resolve_wooden_fish_theme_reference_image(clean_reference_image_src)?; - let (hit_object_asset, background_reference_image) = + let (hit_object_asset, hit_object_reference_image) = if should_generate_wooden_fish_hit_object(prompt, clean_reference_image_src) { let hit_object_prompt = build_wooden_fish_hit_object_prompt(theme.as_str()); let mut reference_images = vec![default_reference_image.clone()]; @@ -699,8 +602,11 @@ async fn generate_wooden_fish_image_assets( "message": "生成敲木鱼敲击物图案失败:上游未返回图片", })) })?; - let background_reference_image = - downloaded_wooden_fish_reference_image(&image, "wooden-fish-generated-hit-object"); + let image = prepare_wooden_fish_hit_object_image_for_persist(image)?; + let hit_object_reference_image = downloaded_wooden_fish_reference_image( + &image, + "wooden-fish-generated-hit-object-transparent", + ); let hit_object_asset = persist_wooden_fish_image_asset( state, owner_user_id, @@ -719,7 +625,7 @@ async fn generate_wooden_fish_image_assets( }, ) .await?; - (hit_object_asset, background_reference_image) + (hit_object_asset, hit_object_reference_image) } else { ( default_wooden_fish_hit_object_asset(), @@ -734,7 +640,7 @@ async fn generate_wooden_fish_image_assets( background_prompt.as_str(), None, "9:16", - &background_reference_image, + &hit_object_reference_image, "生成敲木鱼背景环境图失败", ) .await?; @@ -749,6 +655,8 @@ async fn generate_wooden_fish_image_assets( "message": "生成敲木鱼背景环境图失败:上游未返回图片", })) })?; + let background_reference_image = + downloaded_wooden_fish_reference_image(&background_image, "wooden-fish-generated-background"); let background_asset = persist_wooden_fish_image_asset( state, owner_user_id, @@ -767,23 +675,79 @@ async fn generate_wooden_fish_image_assets( }, ) .await?; + let back_button_prompt = build_wooden_fish_back_button_prompt(theme.as_str()); + let back_button_generated = create_openai_image_edit_with_references( + &http_client, + &settings, + back_button_prompt.as_str(), + None, + "1:1", + 1, + &[ + hit_object_reference_image.clone(), + background_reference_image, + ], + "生成敲木鱼返回按钮图失败", + ) + .await?; + let back_button_task_id = back_button_generated.task_id.clone(); + let back_button_image = back_button_generated + .images + .into_iter() + .next() + .ok_or_else(|| { + AppError::from_status(StatusCode::BAD_GATEWAY).with_details(json!({ + "provider": "vector-engine", + "message": "生成敲木鱼返回按钮图失败:上游未返回图片", + })) + })?; + let back_button_image = prepare_wooden_fish_green_screen_image_for_persist( + back_button_image, + "敲木鱼返回按钮图", + )?; + let back_button_asset = persist_wooden_fish_image_asset( + state, + owner_user_id, + session_id, + profile_id, + back_button_task_id.as_str(), + back_button_prompt.as_str(), + back_button_image, + current_utc_micros(), + WoodenFishImageSlotPersistSpec { + slot: WOODEN_FISH_BACK_BUTTON_SLOT, + asset_kind: WOODEN_FISH_BACK_BUTTON_ASSET_KIND, + asset_id_part: "back-button", + width: 1024, + height: 1024, + }, + ) + .await?; Ok(WoodenFishGeneratedImageAssets { hit_object_asset, background_asset, + back_button_asset, }) } fn build_wooden_fish_hit_object_prompt(prompt: &str) -> String { format!( - "生成敲木鱼新样式,要求结构,画风与参考图保持高度一致,新样式颜色搭配使用新主题对应的颜色。\n新主题为:{}", + "生成敲木鱼新样式,要求结构,画风与参考图保持高度一致,新样式颜色搭配使用新主题对应的颜色。尺寸1:1,先输出绿色背景主体图(纯绿色绿幕),背景必须是单一纯绿色 #00FF00 且平整无纹理、无渐变、无阴影、无道具,主体完整居中,主体边缘必须干净,不要直接输出透明底。随后由服务端对绿色背景主体图做抠图去除绿色背景。最终结果只保留单个敲击物图案,禁止黑底、白底、棋盘格、纸板底或任何实底背景;主体本身不要使用与绿幕接近的纯绿色,若新主题天然包含绿色,请改用偏深、偏黄或偏蓝的绿色并与绿幕清晰区分。\n新主题为:{}", clean_string(prompt, DEFAULT_HIT_OBJECT_PROMPT) ) } fn build_wooden_fish_background_prompt(prompt: &str) -> String { format!( - "生成敲木鱼背景,要求主题,画风与参考图保持高度一致,背景元素和颜色搭配与主题对应,木鱼预设在屏幕中央位置,木鱼主体周围元素保持干净,背景氛围围绕外围设计,背景环境图中不包含新木鱼物品,背景氛围中不增加木槌互动物品。\n主题为:{}", + "生成敲木鱼背景,要求主题,画风与参考图保持高度一致,背景元素和颜色搭配与主题对应,木鱼预设在屏幕中央位置,木鱼主体周围元素保持干净,背景氛围围绕外围设计,背景环境图中不包含新木鱼物品,背景氛围中不增加木槌互动物品。尺寸竖屏9:16。参考图必须是第一步敲击物抠图完成后的透明图,不继承任何绿色底色、绿幕底色或纯绿色画布,并要求最终输出完整不透明的背景环境图。中央主体预留区必须保持干净,画面中央 40% 区域禁止出现主题主体、主体局部特写、主体轮廓影子、重复元素或主题主体的局部碎片;主题元素只允许出现在外围氛围,不得把主题物品画在画面中央,也不要把主题物品作为背景中心装饰。\n主题为:{}", + clean_string(prompt, DEFAULT_HIT_OBJECT_PROMPT) + ) +} + +fn build_wooden_fish_back_button_prompt(prompt: &str) -> String { + format!( + "生成敲木鱼左上角返回按钮图。要求以参考图-去除绿色背景后的敲击物主体和背景环境图为主题、画风、材质和配色参考,但参考图只用来约束圆形底色和中央左箭头的颜色搭配,不要继承复杂造型、花纹、浮雕边、异形外框或装饰图案。按钮必须始终是标准圆形,整体像单个圆形图标,圆心居中,圆形内部只保留一个清晰、简洁、居中的向左返回箭头,不要出现文字、数字、水印、按钮外标签、额外 UI 面板、木槌或敲击道具。尺寸1:1,输出绿色背景主体图(纯绿色绿幕),背景必须是单一纯绿色 #00FF00 且平整无纹理、无渐变、无阴影。按钮主体边缘干净,后续由服务端扣除绿色背景;按钮底色不要使用与绿幕接近的纯绿色,若主题天然包含绿色,请仅在圆形底色上使用偏深、偏黄或偏蓝的主题绿色,并用更高对比的箭头颜色区分。\n主题为:{}", clean_string(prompt, DEFAULT_HIT_OBJECT_PROMPT) ) } @@ -866,6 +830,39 @@ fn downloaded_wooden_fish_reference_image( } } +fn prepare_wooden_fish_hit_object_image_for_persist( + image: DownloadedOpenAiImage, +) -> Result { + prepare_wooden_fish_green_screen_image_for_persist(image, "敲木鱼敲击物图案") +} + +fn prepare_wooden_fish_green_screen_image_for_persist( + image: DownloadedOpenAiImage, + failure_label: &str, +) -> Result { + let source = image::load_from_memory(image.bytes.as_slice()).map_err(|error| { + AppError::from_status(StatusCode::BAD_GATEWAY).with_details(json!({ + "provider": WOODEN_FISH_CREATION_PROVIDER, + "message": format!("{failure_label}解码失败:{error}"), + })) + })?; + let mut encoded = std::io::Cursor::new(Vec::new()); + crate::generated_asset_sheets::apply_generated_asset_sheet_green_screen_alpha(source) + .write_to(&mut encoded, image::ImageFormat::Png) + .map_err(|error| { + AppError::from_status(StatusCode::BAD_GATEWAY).with_details(json!({ + "provider": WOODEN_FISH_CREATION_PROVIDER, + "message": format!("{failure_label}绿幕去背失败:{error}"), + })) + })?; + + Ok(DownloadedOpenAiImage { + bytes: encoded.into_inner(), + mime_type: "image/png".to_string(), + extension: "png".to_string(), + }) +} + struct WoodenFishImageSlotPersistSpec { slot: &'static str, asset_kind: &'static str, @@ -1194,23 +1191,93 @@ mod tests { use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64_STANDARD}; #[test] - fn wooden_fish_hit_object_prompt_uses_hidden_image2_flow() { + fn wooden_fish_hit_object_prompt_uses_hidden_green_screen_flow() { let prompt = build_wooden_fish_hit_object_prompt("赛博莲花木鱼"); - assert_eq!( - prompt, - "生成敲木鱼新样式,要求结构,画风与参考图保持高度一致,新样式颜色搭配使用新主题对应的颜色。\n新主题为:赛博莲花木鱼" - ); + assert!(prompt.contains( + "生成敲木鱼新样式,要求结构,画风与参考图保持高度一致,新样式颜色搭配使用新主题对应的颜色。" + )); + assert!(prompt.contains("尺寸1:1")); + assert!(prompt.contains("绿色背景主体图")); + assert!(prompt.contains("纯绿色绿幕")); + assert!(prompt.contains("#00FF00")); + assert!(prompt.contains("不要直接输出透明底")); + assert!(prompt.contains("主体本身不要使用与绿幕接近的纯绿色")); + assert!(prompt.contains("新主题为:赛博莲花木鱼")); } #[test] fn wooden_fish_background_prompt_uses_hidden_image2_flow() { - let prompt = build_wooden_fish_background_prompt("赛博莲花木鱼"); + let prompt = build_wooden_fish_background_prompt("苹果"); + assert!(prompt.contains( + "生成敲木鱼背景,要求主题,画风与参考图保持高度一致,背景元素和颜色搭配与主题对应,木鱼预设在屏幕中央位置,木鱼主体周围元素保持干净,背景氛围围绕外围设计,背景环境图中不包含新木鱼物品,背景氛围中不增加木槌互动物品。" + )); + assert!(prompt.contains("尺寸竖屏9:16")); + assert!(prompt.contains("抠图完成后的透明图")); + assert!(prompt.contains("不继承任何绿色底色")); + assert!(prompt.contains("完整不透明的背景环境图")); + assert!(prompt.contains("中央主体预留区")); + assert!(prompt.contains("禁止出现主题主体")); + assert!(prompt.contains("苹果")); + assert!(prompt.contains("不得把主题物品画在画面中央")); + assert!(prompt.contains("主题为:苹果")); + } + + #[test] + fn wooden_fish_back_button_prompt_forces_plain_circular_icon() { + let prompt = build_wooden_fish_back_button_prompt("玉米"); + + assert!(prompt.contains("参考图只用来约束圆形底色和中央左箭头的颜色搭配")); + assert!(prompt.contains("按钮必须始终是标准圆形")); + assert!(prompt.contains("圆形内部只保留一个清晰、简洁、居中的向左返回箭头")); + assert!(prompt.contains("不要继承复杂造型、花纹、浮雕边、异形外框或装饰图案")); + assert!(prompt.contains("不要出现文字、数字、水印、按钮外标签、额外 UI 面板、木槌或敲击道具")); + assert!(prompt.contains("按钮底色不要使用与绿幕接近的纯绿色")); + assert!(prompt.contains("主题为:玉米")); + } + + #[test] + fn wooden_fish_hit_object_prepare_removes_green_screen_background() { + let width = 12; + let height = 12; + let mut image = image::RgbaImage::from_pixel(width, height, image::Rgba([0, 255, 0, 255])); + for y in 4..8 { + for x in 4..8 { + image.put_pixel(x, y, image::Rgba([190, 70, 42, 255])); + } + } + image.put_pixel(6, 6, image::Rgba([18, 14, 12, 255])); + let mut encoded = std::io::Cursor::new(Vec::new()); + image::DynamicImage::ImageRgba8(image) + .write_to(&mut encoded, image::ImageFormat::Png) + .expect("test image should encode"); + + let original_bytes = encoded.into_inner(); + let processed = prepare_wooden_fish_hit_object_image_for_persist(DownloadedOpenAiImage { + bytes: original_bytes.clone(), + mime_type: "image/png".to_string(), + extension: "png".to_string(), + }); + let processed = processed.expect("processed image should succeed"); + let decoded = image::load_from_memory(processed.bytes.as_slice()) + .expect("processed image should decode") + .to_rgba8(); + + assert_eq!(processed.mime_type, "image/png"); + assert_eq!(processed.extension, "png"); assert_eq!( - prompt, - "生成敲木鱼背景,要求主题,画风与参考图保持高度一致,背景元素和颜色搭配与主题对应,木鱼预设在屏幕中央位置,木鱼主体周围元素保持干净,背景氛围围绕外围设计,背景环境图中不包含新木鱼物品,背景氛围中不增加木槌互动物品。\n主题为:赛博莲花木鱼" + decoded.get_pixel(0, 0).0[3], + 0, + "绿幕背景必须在入库前去除" ); + assert_eq!(decoded.get_pixel(4, 4).0[3], 255); + assert_eq!( + decoded.get_pixel(6, 6).0[3], + 255, + "敲击物内部深色细节不能被当成背景抠除" + ); + assert_ne!(processed.bytes, original_bytes); } #[test] @@ -1273,37 +1340,41 @@ mod tests { } #[test] - fn wooden_fish_audio_asset_maps_from_generated_sound_effect() { - let asset = shared_contracts::creation_audio::CreationAudioAsset { - task_id: "task-hit-sound-1".to_string(), - provider: "vector-engine-vidu".to_string(), - asset_object_id: Some("assetobj-hit-sound-1".to_string()), - asset_kind: Some(WOODEN_FISH_HIT_SOUND_ASSET_KIND.to_string()), - audio_src: "/generated-wooden-fish-assets/wooden-fish-profile-1/hit-sound.mp3" - .to_string(), - prompt: Some("清脆木鱼声".to_string()), - title: None, - updated_at: None, + fn wooden_fish_default_hit_sound_asset_uses_bundled_mp3() { + let asset = default_wooden_fish_hit_sound_asset(); + + assert_eq!(asset.asset_id, "wooden-fish-default-hit-sound"); + assert_eq!(asset.audio_src, "/wooden-fish/default-hit-sound.mp3"); + assert_eq!( + asset.audio_object_key, + "public/wooden-fish/default-hit-sound.mp3" + ); + assert_eq!(asset.asset_object_id, "wooden-fish-default-hit-sound"); + assert_eq!(asset.source, "bundled-default"); + assert_eq!(asset.prompt.as_deref(), Some("默认木鱼音")); + } + + #[test] + fn wooden_fish_draft_uses_default_hit_sound_asset_and_ignores_prompt() { + let payload = WoodenFishWorkspaceCreateRequest { + template_id: WOODEN_FISH_TEMPLATE_ID.to_string(), + work_title: "今日敲木鱼".to_string(), + work_description: String::new(), + theme_tags: vec!["敲木鱼".to_string()], + hit_object_prompt: "金色木鱼".to_string(), + hit_object_reference_image_src: None, + hit_sound_prompt: Some("清脆木鱼声".to_string()), + hit_sound_asset: None, + floating_words: vec![], }; - let mapped = map_generated_creation_audio_to_wooden_fish_asset( - "wooden-fish-profile-1", - "清脆木鱼声", - asset, - WOODEN_FISH_HIT_SOUND_DURATION_SECONDS, - ) - .expect("generated sound effect should map to wooden fish audio asset"); + let draft = build_wooden_fish_draft(&payload); - assert_eq!( - mapped.asset_id, - "wooden-fish-profile-1-hit-sound-task-hit-sound-1" - ); - assert_eq!( - mapped.audio_object_key, - "generated-wooden-fish-assets/wooden-fish-profile-1/hit-sound.mp3" - ); - assert_eq!(mapped.asset_object_id, "assetobj-hit-sound-1"); - assert_eq!(mapped.source, "generated"); - assert_eq!(mapped.duration_ms, Some(3_000)); + assert!(draft.hit_sound_prompt.is_none()); + let asset = draft + .hit_sound_asset + .expect("default hit sound asset should be attached"); + assert_eq!(asset.audio_src, "/wooden-fish/default-hit-sound.mp3"); + assert_eq!(asset.prompt.as_deref(), Some("默认木鱼音")); } } diff --git a/server-rs/crates/shared-contracts/src/wooden_fish.rs b/server-rs/crates/shared-contracts/src/wooden_fish.rs index 18cc81d5..18788a9e 100644 --- a/server-rs/crates/shared-contracts/src/wooden_fish.rs +++ b/server-rs/crates/shared-contracts/src/wooden_fish.rs @@ -93,6 +93,9 @@ pub struct WoodenFishActionRequest { #[serde(skip_deserializing)] pub background_asset: Option, #[serde(default)] + #[serde(skip_deserializing)] + pub back_button_asset: Option, + #[serde(default)] pub hit_sound_prompt: Option, #[serde(default)] pub hit_sound_asset: Option, @@ -128,6 +131,8 @@ pub struct WoodenFishDraftResponse { #[serde(default)] pub background_asset: Option, #[serde(default)] + pub back_button_asset: Option, + #[serde(default)] pub hit_sound_asset: Option, #[serde(default)] pub cover_image_src: Option, @@ -192,6 +197,8 @@ pub struct WoodenFishWorkProfileResponse { pub hit_object_asset: WoodenFishImageAsset, #[serde(default)] pub background_asset: Option, + #[serde(default)] + pub back_button_asset: Option, pub hit_sound_asset: WoodenFishAudioAsset, pub floating_words: Vec, } @@ -384,6 +391,18 @@ mod tests { width: 1024, height: 1536, }), + back_button_asset: Some(WoodenFishImageAsset { + asset_id: "back-button-1".to_string(), + image_src: "/generated-wooden-fish-assets/profile/back-button/image.png" + .to_string(), + image_object_key: "generated-wooden-fish-assets/profile/back-button/image.png" + .to_string(), + asset_object_id: "back-button-object-1".to_string(), + generation_provider: "image2".to_string(), + prompt: "赛博莲花返回按钮".to_string(), + width: 1024, + height: 1024, + }), hit_sound_prompt: Some("短促木鱼声".to_string()), hit_sound_asset: Some(WoodenFishAudioAsset { asset_id: "sound-1".to_string(), @@ -406,6 +425,7 @@ mod tests { json!("generated-wooden-fish-assets/profile/hit-object/image.png") ); assert_eq!(payload["backgroundAsset"]["height"], json!(1536)); + assert_eq!(payload["backButtonAsset"]["width"], json!(1024)); assert_eq!(payload["hitSoundAsset"]["source"], json!("upload")); assert_eq!(payload["hitSoundAsset"]["durationMs"], json!(800)); } @@ -454,6 +474,16 @@ mod tests { prompt: Some("清脆木鱼".to_string()), duration_ms: Some(600), }; + let back_button = WoodenFishImageAsset { + asset_id: "back-button-1".to_string(), + image_src: "/generated/wooden-fish-back-button.png".to_string(), + image_object_key: "generated/wooden-fish-back-button.png".to_string(), + asset_object_id: "back-button-object-1".to_string(), + generation_provider: "image2".to_string(), + prompt: "主题返回按钮".to_string(), + width: 1024, + height: 1024, + }; let profile = WoodenFishWorkProfileResponse { summary: WoodenFishWorkSummaryResponse { runtime_kind: "wooden-fish".to_string(), @@ -485,12 +515,14 @@ mod tests { floating_words: vec!["功德".to_string()], hit_object_asset: Some(image.clone()), background_asset: None, + back_button_asset: Some(back_button.clone()), hit_sound_asset: Some(audio.clone()), cover_image_src: Some(image.image_src.clone()), generation_status: WoodenFishGenerationStatus::Ready, }, hit_object_asset: image, background_asset: None, + back_button_asset: Some(back_button), hit_sound_asset: audio, floating_words: vec!["功德".to_string()], }; @@ -503,5 +535,9 @@ mod tests { json!("image2") ); assert_eq!(payload["hitSoundAsset"]["source"], json!("generated")); + assert_eq!( + payload["backButtonAsset"]["imageSrc"], + json!("/generated/wooden-fish-back-button.png") + ); } } diff --git a/server-rs/crates/spacetime-client/src/mapper/big_fish.rs b/server-rs/crates/spacetime-client/src/mapper/big_fish.rs index 8fb549c2..688bd873 100644 --- a/server-rs/crates/spacetime-client/src/mapper/big_fish.rs +++ b/server-rs/crates/spacetime-client/src/mapper/big_fish.rs @@ -450,6 +450,10 @@ mod tests { cover_image_src: None, ui_background_image_src: None, ui_background_image_object_key: None, + level_background_image_src: None, + level_background_image_object_key: None, + ui_spritesheet_image_src: None, + ui_spritesheet_image_object_key: None, background_music: None, board: PuzzleBoardSnapshot { rows: 3, diff --git a/server-rs/crates/spacetime-client/src/mapper/wooden_fish.rs b/server-rs/crates/spacetime-client/src/mapper/wooden_fish.rs index b4edf32f..d4ec1031 100644 --- a/server-rs/crates/spacetime-client/src/mapper/wooden_fish.rs +++ b/server-rs/crates/spacetime-client/src/mapper/wooden_fish.rs @@ -113,6 +113,7 @@ fn map_wooden_fish_work_snapshot( floating_words: snapshot.floating_words.clone(), hit_object_asset: snapshot.hit_object_asset.clone().map(map_image_asset), background_asset: snapshot.background_asset.clone().map(map_image_asset), + back_button_asset: snapshot.back_button_asset.clone().map(map_image_asset), hit_sound_asset: snapshot.hit_sound_asset.clone().map(map_audio_asset), cover_image_src: empty_string_to_none(snapshot.cover_image_src.clone()), generation_status: parse_generation_status(&snapshot.generation_status), @@ -147,6 +148,7 @@ fn map_wooden_fish_work_snapshot( draft, hit_object_asset, background_asset: snapshot.background_asset.map(map_image_asset), + back_button_asset: snapshot.back_button_asset.map(map_image_asset), hit_sound_asset, floating_words: snapshot.floating_words, }) @@ -166,6 +168,7 @@ fn map_wooden_fish_draft_snapshot(snapshot: WoodenFishDraftSnapshot) -> WoodenFi floating_words: snapshot.floating_words, hit_object_asset: snapshot.hit_object_asset.map(map_image_asset), background_asset: snapshot.background_asset.map(map_image_asset), + back_button_asset: snapshot.back_button_asset.map(map_image_asset), hit_sound_asset: snapshot.hit_sound_asset.map(map_audio_asset), cover_image_src: snapshot.cover_image_src, generation_status: parse_generation_status(&snapshot.generation_status), diff --git a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_draft_compile_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_draft_compile_input_type.rs index 402f40ab..2e1060b4 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_draft_compile_input_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_draft_compile_input_type.rs @@ -20,6 +20,7 @@ pub struct WoodenFishDraftCompileInput { pub hit_object_asset_json: Option, pub background_asset_json: Option, pub hit_sound_asset_json: Option, + pub back_button_asset_json: Option, pub floating_words_json: Option, pub cover_image_src: Option, pub generation_status: Option, diff --git a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_draft_snapshot_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_draft_snapshot_type.rs index 17c4e2b9..e2beff33 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_draft_snapshot_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_draft_snapshot_type.rs @@ -22,6 +22,7 @@ pub struct WoodenFishDraftSnapshot { pub floating_words: Vec, pub hit_object_asset: Option, pub background_asset: Option, + pub back_button_asset: Option, pub hit_sound_asset: Option, pub cover_image_src: Option, pub generation_status: String, diff --git a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_gallery_view_row_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_gallery_view_row_type.rs index ac17e2de..1139a878 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_gallery_view_row_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_gallery_view_row_type.rs @@ -24,6 +24,7 @@ pub struct WoodenFishGalleryViewRow { pub hit_sound_prompt: Option, pub hit_object_asset: Option, pub background_asset: Option, + pub back_button_asset: Option, pub hit_sound_asset: Option, pub floating_words: Vec, pub cover_image_src: String, @@ -60,6 +61,8 @@ pub struct WoodenFishGalleryViewRowCols { __sdk::__query_builder::Col>, pub background_asset: __sdk::__query_builder::Col>, + pub back_button_asset: + __sdk::__query_builder::Col>, pub hit_sound_asset: __sdk::__query_builder::Col>, pub floating_words: __sdk::__query_builder::Col>, @@ -96,6 +99,7 @@ impl __sdk::__query_builder::HasCols for WoodenFishGalleryViewRow { hit_sound_prompt: __sdk::__query_builder::Col::new(table_name, "hit_sound_prompt"), hit_object_asset: __sdk::__query_builder::Col::new(table_name, "hit_object_asset"), background_asset: __sdk::__query_builder::Col::new(table_name, "background_asset"), + back_button_asset: __sdk::__query_builder::Col::new(table_name, "back_button_asset"), hit_sound_asset: __sdk::__query_builder::Col::new(table_name, "hit_sound_asset"), floating_words: __sdk::__query_builder::Col::new(table_name, "floating_words"), cover_image_src: __sdk::__query_builder::Col::new(table_name, "cover_image_src"), diff --git a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_profile_row_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_profile_row_type.rs index c82a9c6c..456316a8 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_profile_row_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_profile_row_type.rs @@ -28,6 +28,7 @@ pub struct WoodenFishWorkProfileRow { pub updated_at: __sdk::Timestamp, pub published_at: Option<__sdk::Timestamp>, pub background_asset_json: Option, + pub back_button_asset_json: Option, } impl __sdk::InModule for WoodenFishWorkProfileRow { @@ -62,6 +63,8 @@ pub struct WoodenFishWorkProfileRowCols { __sdk::__query_builder::Col>, pub background_asset_json: __sdk::__query_builder::Col>, + pub back_button_asset_json: + __sdk::__query_builder::Col>, } impl __sdk::__query_builder::HasCols for WoodenFishWorkProfileRow { @@ -107,6 +110,10 @@ impl __sdk::__query_builder::HasCols for WoodenFishWorkProfileRow { table_name, "background_asset_json", ), + back_button_asset_json: __sdk::__query_builder::Col::new( + table_name, + "back_button_asset_json", + ), } } } diff --git a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_snapshot_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_snapshot_type.rs index fdaf3116..3a15b12b 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_snapshot_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_snapshot_type.rs @@ -23,6 +23,7 @@ pub struct WoodenFishWorkSnapshot { pub hit_sound_prompt: Option, pub hit_object_asset: Option, pub background_asset: Option, + pub back_button_asset: Option, pub hit_sound_asset: Option, pub floating_words: Vec, pub cover_image_src: String, diff --git a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_update_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_update_input_type.rs index cd7c3547..ac4f2977 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_update_input_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/wooden_fish_work_update_input_type.rs @@ -18,6 +18,7 @@ pub struct WoodenFishWorkUpdateInput { pub hit_object_asset_json: Option, pub background_asset_json: Option, pub hit_sound_asset_json: Option, + pub back_button_asset_json: Option, pub floating_words_json: Option, pub cover_image_src: Option, pub generation_status: Option, diff --git a/server-rs/crates/spacetime-client/src/wooden_fish.rs b/server-rs/crates/spacetime-client/src/wooden_fish.rs index edcfd312..1aadc15f 100644 --- a/server-rs/crates/spacetime-client/src/wooden_fish.rs +++ b/server-rs/crates/spacetime-client/src/wooden_fish.rs @@ -15,7 +15,6 @@ use shared_kernel::build_prefixed_uuid_id; const WOODEN_FISH_TEMPLATE_ID: &str = "wooden-fish"; const WOODEN_FISH_TEMPLATE_NAME: &str = "敲木鱼"; const DEFAULT_HIT_OBJECT_PROMPT: &str = "默认敲击物图案,圆润木质质感,透明背景"; -const DEFAULT_HIT_SOUND_PROMPT: &str = "清脆短促的木鱼敲击声"; impl SpacetimeClient { pub async fn create_wooden_fish_session( @@ -532,21 +531,11 @@ fn merge_action_into_draft( if let Some(asset) = payload.background_asset.clone() { draft.background_asset = Some(asset); } - } - if matches!( - scope, - WoodenFishDraftMergeScope::CompileDraft - | WoodenFishDraftMergeScope::GenerateHitSound - | WoodenFishDraftMergeScope::ReplaceHitSound - ) { - if let Some(value) = payload - .hit_sound_prompt - .as_ref() - .filter(|value| !value.trim().is_empty()) - { - draft.hit_sound_prompt = Some(value.trim().to_string()); + if let Some(asset) = payload.back_button_asset.clone() { + draft.back_button_asset = Some(asset); } } + draft.hit_sound_prompt = None; if matches!(scope, WoodenFishDraftMergeScope::GenerateHitSound) { draft.hit_sound_asset = payload.hit_sound_asset.clone(); } else if matches!( @@ -577,6 +566,7 @@ fn merge_action_into_draft( { draft.hit_object_asset = None; draft.background_asset = None; + draft.back_button_asset = None; } if draft.floating_words.is_empty() { draft.floating_words = default_floating_words(); @@ -613,6 +603,9 @@ fn build_compile_input( let background_asset = draft.background_asset.clone().ok_or_else(|| { SpacetimeClientError::validation_failed("wooden fish background asset 缺少真实生成资产") })?; + let back_button_asset = draft.back_button_asset.clone().ok_or_else(|| { + SpacetimeClientError::validation_failed("wooden fish back button asset 缺少真实生成资产") + })?; Ok(WoodenFishDraftCompileInput { session_id: current.session_id.clone(), @@ -628,6 +621,7 @@ fn build_compile_input( hit_object_asset_json: Some(json_string(&hit_object_asset)?), background_asset_json: Some(json_string(&background_asset)?), hit_sound_asset_json: Some(json_string(&hit_sound_asset)?), + back_button_asset_json: Some(json_string(&back_button_asset)?), floating_words_json: Some(json_string(&draft.floating_words)?), cover_image_src: draft.cover_image_src.clone(), generation_status: Some("ready".to_string()), @@ -662,6 +656,7 @@ fn build_update_input( } else { None }, + back_button_asset_json: None, floating_words_json: Some(json_string(&draft.floating_words)?), cover_image_src: draft.cover_image_src.clone(), generation_status: None, @@ -716,10 +711,11 @@ fn default_draft() -> WoodenFishDraftResponse { theme_tags: vec!["休闲".to_string()], hit_object_prompt: DEFAULT_HIT_OBJECT_PROMPT.to_string(), hit_object_reference_image_src: None, - hit_sound_prompt: Some(DEFAULT_HIT_SOUND_PROMPT.to_string()), + hit_sound_prompt: None, floating_words: default_floating_words(), hit_object_asset: None, background_asset: None, + back_button_asset: None, hit_sound_asset: None, cover_image_src: None, generation_status: WoodenFishGenerationStatus::Draft, @@ -807,6 +803,7 @@ mod tests { let mut payload = action(WoodenFishActionType::CompileDraft); payload.hit_object_asset = Some(generated_hit_object_asset("generated-compile-object")); payload.background_asset = Some(generated_background_asset("generated-compile-background")); + payload.back_button_asset = Some(generated_back_button_asset("generated-compile-back")); payload.hit_sound_asset = Some(generated_hit_sound_asset("generated-compile-sound")); let (plan, draft) = @@ -840,6 +837,13 @@ mod tests { .unwrap_or("") .contains("generated-compile-background") ); + assert!( + input + .back_button_asset_json + .as_deref() + .unwrap_or("") + .contains("generated-compile-back") + ); assert_eq!(draft.generation_status, WoodenFishGenerationStatus::Ready); } @@ -849,6 +853,7 @@ mod tests { let mut payload = action(WoodenFishActionType::CompileDraft); payload.hit_object_asset = Some(generated_hit_object_asset("generated-compile-object")); payload.background_asset = Some(generated_background_asset("generated-compile-background")); + payload.back_button_asset = Some(generated_back_button_asset("generated-compile-back")); let error = match build_wooden_fish_action_plan(&session, OWNER_USER_ID, &payload, NOW_MICROS) { @@ -869,6 +874,7 @@ mod tests { let mut payload = action(WoodenFishActionType::CompileDraft); payload.hit_object_asset = Some(generated_hit_object_asset("generated-compile-object")); payload.hit_sound_asset = Some(generated_hit_sound_asset("generated-compile-sound")); + payload.back_button_asset = Some(generated_back_button_asset("generated-compile-back")); let error = match build_wooden_fish_action_plan(&session, OWNER_USER_ID, &payload, NOW_MICROS) { @@ -883,6 +889,27 @@ mod tests { ); } + #[test] + fn wooden_fish_compile_requires_real_back_button_asset_from_api_server() { + let session = session_with_draft(draft_without_assets()); + let mut payload = action(WoodenFishActionType::CompileDraft); + payload.hit_object_asset = Some(generated_hit_object_asset("generated-compile-object")); + payload.background_asset = Some(generated_background_asset("generated-compile-background")); + payload.hit_sound_asset = Some(generated_hit_sound_asset("generated-compile-sound")); + + let error = + match build_wooden_fish_action_plan(&session, OWNER_USER_ID, &payload, NOW_MICROS) { + Ok(_) => panic!("compile-draft should not publish without back button asset"), + Err(error) => error, + }; + + assert!( + error + .to_string() + .contains("back button asset 缺少真实生成资产") + ); + } + #[test] fn wooden_fish_action_regenerate_hit_object_replaces_only_object_asset() { let session = session_with_draft(draft_with_assets()); @@ -890,6 +917,7 @@ mod tests { payload.hit_object_prompt = Some("新的敲击物".to_string()); payload.hit_object_asset = Some(generated_hit_object_asset("generated-object")); payload.background_asset = Some(generated_background_asset("generated-background")); + payload.back_button_asset = Some(generated_back_button_asset("generated-back")); let (plan, _draft) = build_wooden_fish_action_plan(&session, OWNER_USER_ID, &payload, NOW_MICROS) @@ -933,6 +961,13 @@ mod tests { .unwrap_or("") .contains("generated-background") ); + assert!( + input + .back_button_asset_json + .as_deref() + .unwrap_or("") + .contains("generated-back") + ); } #[test] @@ -967,6 +1002,13 @@ mod tests { ); } + #[test] + fn wooden_fish_default_draft_has_no_hit_sound_prompt() { + let draft = default_draft(); + + assert!(draft.hit_sound_prompt.is_none()); + } + fn action(action_type: WoodenFishActionType) -> WoodenFishActionRequest { WoodenFishActionRequest { action_type, @@ -978,6 +1020,7 @@ mod tests { hit_object_reference_image_src: None, hit_object_asset: None, background_asset: None, + back_button_asset: None, hit_sound_prompt: None, hit_sound_asset: None, floating_words: None, @@ -1032,6 +1075,21 @@ mod tests { } } + fn generated_back_button_asset(asset_id: &str) -> WoodenFishImageAsset { + WoodenFishImageAsset { + asset_id: asset_id.to_string(), + image_src: "/generated-wooden-fish-assets/real-profile/back-button/image.png" + .to_string(), + image_object_key: "generated-wooden-fish-assets/real-profile/back-button/image.png" + .to_string(), + asset_object_id: format!("{asset_id}-asset"), + generation_provider: "image2".to_string(), + prompt: "新的返回按钮".to_string(), + width: 1024, + height: 1024, + } + } + fn generated_hit_sound_asset(asset_id: &str) -> WoodenFishAudioAsset { WoodenFishAudioAsset { asset_id: asset_id.to_string(), @@ -1068,6 +1126,16 @@ mod tests { width: 1024, height: 1536, }), + back_button_asset: Some(WoodenFishImageAsset { + asset_id: "old-back".to_string(), + image_src: "/generated-wooden-fish-assets/old-back.png".to_string(), + image_object_key: "generated-wooden-fish-assets/old-back.png".to_string(), + asset_object_id: "old-back-asset".to_string(), + generation_provider: "image2".to_string(), + prompt: "旧返回按钮".to_string(), + width: 1024, + height: 1024, + }), hit_sound_asset: Some(WoodenFishAudioAsset { asset_id: "old-sound".to_string(), audio_src: "/generated-wooden-fish-assets/old-sound.mp3".to_string(), @@ -1093,10 +1161,11 @@ mod tests { theme_tags: vec!["旧标签".to_string()], hit_object_prompt: "旧敲击物".to_string(), hit_object_reference_image_src: None, - hit_sound_prompt: Some("旧音效".to_string()), + hit_sound_prompt: None, floating_words: default_floating_words(), hit_object_asset: None, background_asset: None, + back_button_asset: None, hit_sound_asset: None, cover_image_src: None, generation_status: WoodenFishGenerationStatus::Draft, diff --git a/server-rs/crates/spacetime-module/src/migration.rs b/server-rs/crates/spacetime-module/src/migration.rs index c2b2bc4b..18e22641 100644 --- a/server-rs/crates/spacetime-module/src/migration.rs +++ b/server-rs/crates/spacetime-module/src/migration.rs @@ -1271,6 +1271,10 @@ fn normalize_migration_row(table_name: &str, value: &serde_json::Value) -> serde object .entry("background_asset_json".to_string()) .or_insert(serde_json::Value::Null); + // 中文注释:敲木鱼返回按钮图晚于首版作品表加入,旧迁移包按未生成返回按钮兼容。 + object + .entry("back_button_asset_json".to_string()) + .or_insert(serde_json::Value::Null); } } next_value diff --git a/server-rs/crates/spacetime-module/src/wooden_fish.rs b/server-rs/crates/spacetime-module/src/wooden_fish.rs index 3b3982b2..a8ef6954 100644 --- a/server-rs/crates/spacetime-module/src/wooden_fish.rs +++ b/server-rs/crates/spacetime-module/src/wooden_fish.rs @@ -82,6 +82,7 @@ pub struct WoodenFishGalleryViewRow { pub hit_sound_prompt: Option, pub hit_object_asset: Option, pub background_asset: Option, + pub back_button_asset: Option, pub hit_sound_asset: Option, pub floating_words: Vec, pub cover_image_src: String, @@ -333,6 +334,11 @@ fn compile_wooden_fish_draft_tx( .as_deref() .map(parse_json) .transpose()?; + let back_button_asset = input + .back_button_asset_json + .as_deref() + .map(parse_json) + .transpose()?; let cover_image_src = input .cover_image_src .as_deref() @@ -361,6 +367,7 @@ fn compile_wooden_fish_draft_tx( floating_words: floating_words.clone(), hit_object_asset: hit_object_asset.clone(), background_asset: background_asset.clone(), + back_button_asset: back_button_asset.clone(), hit_sound_asset: hit_sound_asset.clone(), cover_image_src: cover_image_src.clone(), generation_status: input @@ -400,6 +407,7 @@ fn compile_wooden_fish_draft_tx( updated_at: compiled_at, published_at: None, background_asset_json: background_asset.as_ref().map(to_json_string), + back_button_asset_json: back_button_asset.as_ref().map(to_json_string), }; upsert_work(ctx, row); let config = config_from_draft(&draft); @@ -485,6 +493,14 @@ fn update_wooden_fish_work_tx( let asset = parse_json::(&value)?; next.background_asset_json = Some(to_json_string(&asset)); } + if let Some(value) = input + .back_button_asset_json + .as_deref() + .and_then(clean_optional) + { + let asset = parse_json::(&value)?; + next.back_button_asset_json = Some(to_json_string(&asset)); + } if let Some(value) = input .floating_words_json .as_deref() @@ -512,7 +528,7 @@ fn publish_wooden_fish_work_tx( ) -> Result { let row = find_owned_work(ctx, &input.profile_id, &input.owner_user_id)?; if !is_publish_ready(&row) { - return Err("发布需要完整的敲击物图案、敲击音效和飘字配置".to_string()); + return Err("发布需要完整的敲击物图案、背景、返回按钮、敲击音效和飘字配置".to_string()); } let published_at = Timestamp::from_micros_since_unix_epoch(input.published_at_micros); replace_work( @@ -691,6 +707,7 @@ fn build_gallery_view_row( hit_sound_prompt: work.hit_sound_prompt, hit_object_asset: work.hit_object_asset, background_asset: work.background_asset, + back_button_asset: work.back_button_asset, hit_sound_asset: work.hit_sound_asset, floating_words: work.floating_words, cover_image_src: work.cover_image_src, @@ -744,6 +761,12 @@ fn build_work_snapshot(row: &WoodenFishWorkProfileRow) -> Result bool { .as_deref() .and_then(clean_optional) .is_some() + && row + .back_button_asset_json + .as_deref() + .and_then(clean_optional) + .is_some() && !row.hit_sound_asset_json.trim().is_empty() && !row.floating_words_json.trim().is_empty() && row.generation_status == WOODEN_FISH_GENERATION_READY @@ -1031,6 +1059,7 @@ fn draft_from_config( floating_words: normalize_floating_words(&config.floating_words), hit_object_asset: None, background_asset: None, + back_button_asset: None, hit_sound_asset: None, cover_image_src: None, generation_status: generation_status.to_string(), @@ -1051,6 +1080,7 @@ fn draft_from_work_snapshot(work: &WoodenFishWorkSnapshot) -> WoodenFishDraftSna floating_words: work.floating_words.clone(), hit_object_asset: work.hit_object_asset.clone(), background_asset: work.background_asset.clone(), + back_button_asset: work.back_button_asset.clone(), hit_sound_asset: work.hit_sound_asset.clone(), cover_image_src: clean_optional(&work.cover_image_src), generation_status: work.generation_status.clone(), @@ -1231,6 +1261,7 @@ fn clone_work(row: &WoodenFishWorkProfileRow) -> WoodenFishWorkProfileRow { hit_object_asset_json: row.hit_object_asset_json.clone(), background_asset_json: row.background_asset_json.clone(), hit_sound_asset_json: row.hit_sound_asset_json.clone(), + back_button_asset_json: row.back_button_asset_json.clone(), floating_words_json: row.floating_words_json.clone(), cover_image_src: row.cover_image_src.clone(), generation_status: row.generation_status.clone(), diff --git a/server-rs/crates/spacetime-module/src/wooden_fish/tables.rs b/server-rs/crates/spacetime-module/src/wooden_fish/tables.rs index 27899c15..74268598 100644 --- a/server-rs/crates/spacetime-module/src/wooden_fish/tables.rs +++ b/server-rs/crates/spacetime-module/src/wooden_fish/tables.rs @@ -47,6 +47,8 @@ pub struct WoodenFishWorkProfileRow { pub(crate) published_at: Option, #[default(None::)] pub(crate) background_asset_json: Option, + #[default(None::)] + pub(crate) back_button_asset_json: Option, } #[spacetimedb::table( diff --git a/server-rs/crates/spacetime-module/src/wooden_fish/types.rs b/server-rs/crates/spacetime-module/src/wooden_fish/types.rs index 0bbeef03..2ab8c0e6 100644 --- a/server-rs/crates/spacetime-module/src/wooden_fish/types.rs +++ b/server-rs/crates/spacetime-module/src/wooden_fish/types.rs @@ -47,6 +47,7 @@ pub struct WoodenFishDraftCompileInput { pub hit_object_asset_json: Option, pub background_asset_json: Option, pub hit_sound_asset_json: Option, + pub back_button_asset_json: Option, pub floating_words_json: Option, pub cover_image_src: Option, pub generation_status: Option, @@ -66,6 +67,7 @@ pub struct WoodenFishWorkUpdateInput { pub hit_object_asset_json: Option, pub background_asset_json: Option, pub hit_sound_asset_json: Option, + pub back_button_asset_json: Option, pub floating_words_json: Option, pub cover_image_src: Option, pub generation_status: Option, @@ -210,6 +212,7 @@ pub struct WoodenFishDraftSnapshot { pub floating_words: Vec, pub hit_object_asset: Option, pub background_asset: Option, + pub back_button_asset: Option, pub hit_sound_asset: Option, pub cover_image_src: Option, pub generation_status: String, @@ -246,6 +249,7 @@ pub struct WoodenFishWorkSnapshot { pub hit_sound_prompt: Option, pub hit_object_asset: Option, pub background_asset: Option, + pub back_button_asset: Option, pub hit_sound_asset: Option, pub floating_words: Vec, pub cover_image_src: String, diff --git a/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx b/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx index cb7e7088..7c4cf12f 100644 --- a/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx +++ b/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx @@ -7589,8 +7589,6 @@ export function PlatformEntryFlowShellImpl({ hitObjectReferenceImageSrc: payload?.hitObjectReferenceImageSrc ?? created.session.draft?.hitObjectReferenceImageSrc, - hitSoundPrompt: - payload?.hitSoundPrompt ?? created.session.draft?.hitSoundPrompt, hitSoundAsset: payload?.hitSoundAsset ?? created.session.draft?.hitSoundAsset, floatingWords: @@ -7643,7 +7641,7 @@ export function PlatformEntryFlowShellImpl({ }, [compileWoodenFishSession, setSelectionStage, woodenFishSession]); const regenerateWoodenFishAsset = useCallback( - async (actionType: 'regenerate-hit-object' | 'generate-hit-sound') => { + async (actionType: 'regenerate-hit-object') => { if (!woodenFishSession?.sessionId) { setSelectionStage('wooden-fish-workspace'); return; @@ -7665,7 +7663,6 @@ export function PlatformEntryFlowShellImpl({ hitObjectPrompt: woodenFishSession.draft?.hitObjectPrompt, hitObjectReferenceImageSrc: woodenFishSession.draft?.hitObjectReferenceImageSrc, - hitSoundPrompt: woodenFishSession.draft?.hitSoundPrompt, hitSoundAsset: woodenFishSession.draft?.hitSoundAsset, floatingWords: woodenFishSession.draft?.floatingWords, }, @@ -7679,9 +7676,7 @@ export function PlatformEntryFlowShellImpl({ } catch (error) { const errorMessage = resolveRpgCreationErrorMessage( error, - actionType === 'regenerate-hit-object' - ? '重新生成敲击物图案失败。' - : '生成敲击音效失败。', + '重新生成敲击物图案失败。', ); setWoodenFishError(errorMessage); setWoodenFishGenerationState( @@ -7811,33 +7806,6 @@ export function PlatformEntryFlowShellImpl({ [setSelectionStage], ); - const restartWoodenFishRuntimeRun = useCallback(async () => { - const profileId = - woodenFishRun?.profileId?.trim() ?? - woodenFishWork?.summary.profileId?.trim(); - if (!profileId) { - await startWoodenFishTestRunFromProfile(); - return; - } - - setIsWoodenFishBusy(true); - setWoodenFishError(null); - try { - const response = await woodenFishClient.startRun(profileId); - setWoodenFishRun(response.run); - } catch (error) { - setWoodenFishError( - resolveRpgCreationErrorMessage(error, '重新开始敲木鱼失败。'), - ); - } finally { - setIsWoodenFishBusy(false); - } - }, [ - startWoodenFishTestRunFromProfile, - woodenFishRun?.profileId, - woodenFishWork?.summary.profileId, - ]); - const checkpointWoodenFishRuntimeRun = useCallback( async (payload: { totalTapCount: number; @@ -7853,31 +7821,6 @@ export function PlatformEntryFlowShellImpl({ [woodenFishRun?.runId], ); - const finishWoodenFishRuntimeRun = useCallback( - async (payload: { - totalTapCount: number; - wordCounters: WoodenFishRunResponse['run']['wordCounters']; - }) => { - const runId = woodenFishRun?.runId; - if (!runId) { - return; - } - setIsWoodenFishBusy(true); - setWoodenFishError(null); - try { - const response = await woodenFishClient.finishRun(runId, payload); - setWoodenFishRun(response.run); - } catch (error) { - setWoodenFishError( - resolveRpgCreationErrorMessage(error, '结束敲木鱼失败。'), - ); - } finally { - setIsWoodenFishBusy(false); - } - }, - [woodenFishRun?.runId], - ); - const executePuzzleAction = puzzleFlow.executeAction; const executePuzzleBackgroundAction = useCallback( @@ -11479,11 +11422,7 @@ export function PlatformEntryFlowShellImpl({ onBack={() => { setActiveRecommendRuntimeKind(null); }} - onRestart={() => { - void restartWoodenFishRuntimeRun(); - }} onCheckpoint={checkpointWoodenFishRuntimeRun} - onFinish={finishWoodenFishRuntimeRun} /> ); } @@ -11650,7 +11589,6 @@ export function PlatformEntryFlowShellImpl({ resolveSquareHoleErrorMessage, reportBigFishObservedPlayTime, restartBigFishRun, - restartWoodenFishRuntimeRun, selectedPuzzleDetail, selectionStage, setMatch3DError, @@ -11674,7 +11612,6 @@ export function PlatformEntryFlowShellImpl({ visualNovelSession, visualNovelWork, checkpointWoodenFishRuntimeRun, - finishWoodenFishRuntimeRun, ]); useEffect(() => { @@ -14449,9 +14386,6 @@ export function PlatformEntryFlowShellImpl({ onRegenerateHitObject={() => { void regenerateWoodenFishAsset('regenerate-hit-object'); }} - onGenerateHitSound={() => { - void regenerateWoodenFishAsset('generate-hit-sound'); - }} /> @@ -14476,11 +14410,7 @@ export function PlatformEntryFlowShellImpl({ onBack={() => { setSelectionStage(woodenFishRuntimeReturnStage); }} - onRestart={() => { - void restartWoodenFishRuntimeRun(); - }} onCheckpoint={checkpointWoodenFishRuntimeRun} - onFinish={finishWoodenFishRuntimeRun} /> diff --git a/src/components/wooden-fish-creation/WoodenFishWorkspace.test.tsx b/src/components/wooden-fish-creation/WoodenFishWorkspace.test.tsx index 600f5708..d7ce7650 100644 --- a/src/components/wooden-fish-creation/WoodenFishWorkspace.test.tsx +++ b/src/components/wooden-fish-creation/WoodenFishWorkspace.test.tsx @@ -23,3 +23,20 @@ test('功德有什么默认只显示基础词条,不显示运行态 +1 后缀' expect(within(section as HTMLElement).queryByDisplayValue('幸运+1')).toBeNull(); expect(within(section as HTMLElement).queryByDisplayValue('功德+1')).toBeNull(); }); + +test('敲击音效临时关闭提示词生成入口,仅保留上传和录音', () => { + render( + {}} + onSubmitted={() => {}} + />, + ); + + const sectionTitle = screen.getByText('敲击音效'); + const section = sectionTitle.closest('section'); + + expect(section).not.toBeNull(); + expect(within(section as HTMLElement).queryByText('音效描述')).toBeNull(); + expect(within(section as HTMLElement).getByText('上传')).toBeTruthy(); + expect(within(section as HTMLElement).getByText('录音')).toBeTruthy(); +}); diff --git a/src/components/wooden-fish-creation/WoodenFishWorkspace.tsx b/src/components/wooden-fish-creation/WoodenFishWorkspace.tsx index 8a863496..37ec8184 100644 --- a/src/components/wooden-fish-creation/WoodenFishWorkspace.tsx +++ b/src/components/wooden-fish-creation/WoodenFishWorkspace.tsx @@ -15,7 +15,10 @@ import type { } from '../../../packages/shared/src/contracts/woodenFish'; import { readPuzzleReferenceImageAsDataUrl } from '../../services/puzzleReferenceImage'; import { woodenFishClient } from '../../services/wooden-fish/woodenFishClient'; -import { WOODEN_FISH_DEFAULT_HIT_OBJECT_PROMPT } from '../../services/wooden-fish/woodenFishDefaults'; +import { + WOODEN_FISH_DEFAULT_HIT_OBJECT_PROMPT, + WOODEN_FISH_DEFAULT_HIT_SOUND_ASSET, +} from '../../services/wooden-fish/woodenFishDefaults'; import { CreativeImageInputPanel } from '../common/CreativeImageInputPanel'; type WoodenFishWorkspaceProps = { @@ -34,7 +37,6 @@ type WoodenFishWorkspaceFormState = { themeTags: string; hitObjectPrompt: string; hitObjectReferenceImageSrc: string; - hitSoundPrompt: string; hitSoundAsset: WoodenFishAudioAsset | null; floatingWords: string[]; }; @@ -56,7 +58,6 @@ const DEFAULT_FORM_STATE: WoodenFishWorkspaceFormState = { themeTags: '敲木鱼 解压', hitObjectPrompt: WOODEN_FISH_DEFAULT_HIT_OBJECT_PROMPT, hitObjectReferenceImageSrc: '', - hitSoundPrompt: '清脆短促的木鱼敲击声', hitSoundAsset: null, floatingWords: DEFAULT_FLOATING_WORDS, }; @@ -111,16 +112,12 @@ function readAudioFileAsAsset(file: File, source: 'uploaded' | 'recorded') { function WoodenFishAudioInputPanel({ disabled, - prompt, asset, - onPromptChange, onAssetChange, onError, }: { disabled: boolean; - prompt: string; asset: WoodenFishAudioAsset | null; - onPromptChange: (value: string) => void; onAssetChange: (asset: WoodenFishAudioAsset | null) => void; onError: (message: string | null) => void; }) { @@ -201,18 +198,6 @@ function WoodenFishAudioInputPanel({ ) : null} -