diff --git a/apps/ai-game-creator-shell/src/styles.css b/apps/ai-game-creator-shell/src/styles.css index cd7f24a7f..3b11a6d7f 100644 --- a/apps/ai-game-creator-shell/src/styles.css +++ b/apps/ai-game-creator-shell/src/styles.css @@ -1,5 +1,6 @@ @import 'tailwindcss'; @source '../../../packages/shared/src/components'; +@import '@genarrative/shared/styles.css'; @import '../../../packages/shared/src/theme.css'; :root { diff --git a/apps/ai-game-creator-shell/tsconfig.json b/apps/ai-game-creator-shell/tsconfig.json index 894821755..e18485909 100644 --- a/apps/ai-game-creator-shell/tsconfig.json +++ b/apps/ai-game-creator-shell/tsconfig.json @@ -22,7 +22,22 @@ ], "@genarrative/image-canvas-react": [ "packages/image-canvas-react/src/index.ts" - ] + ], + "@genarrative/shared": ["packages/shared/src/index.ts"], + "@genarrative/shared/components": [ + "packages/shared/src/components/index.ts" + ], + "@genarrative/shared/components/account": [ + "packages/shared/src/components/account.ts" + ], + "@genarrative/shared/components/ui": [ + "packages/shared/src/components/ui/index.ts" + ], + "@genarrative/shared/components/ui/*": [ + "packages/shared/src/components/ui/*" + ], + "@genarrative/shared/lib/*": ["packages/shared/src/lib/*"], + "@genarrative/shared/lib": ["packages/shared/src/lib/index.ts"] } }, "include": ["src", "vite.config.ts"] diff --git a/apps/ai-game-creator-shell/vite.config.ts b/apps/ai-game-creator-shell/vite.config.ts index 8f784f2a0..71b012d81 100644 --- a/apps/ai-game-creator-shell/vite.config.ts +++ b/apps/ai-game-creator-shell/vite.config.ts @@ -105,6 +105,46 @@ export default defineConfig({ 'packages/image-canvas-react/src/index.ts', ), }, + { + find: '@genarrative/shared/styles.css', + replacement: resolve( + repoRoot, + 'packages/shared/src/components/styles.css', + ), + }, + { + find: '@genarrative/shared/theme.css', + replacement: resolve(repoRoot, 'packages/shared/src/theme.css'), + }, + { + find: '@genarrative/shared/components/ui', + replacement: resolve( + repoRoot, + 'packages/shared/src/components/ui/index.ts', + ), + }, + { + find: '@genarrative/shared/lib', + replacement: resolve(repoRoot, 'packages/shared/src/lib'), + }, + { + find: '@genarrative/shared/components/account', + replacement: resolve( + repoRoot, + 'packages/shared/src/components/account.ts', + ), + }, + { + find: '@genarrative/shared/components', + replacement: resolve( + repoRoot, + 'packages/shared/src/components/index.ts', + ), + }, + { + find: '@genarrative/shared', + replacement: resolve(repoRoot, 'packages/shared/src/index.ts'), + }, ], dedupe: ['react', 'react-dom'], }, diff --git a/components.json b/components.json new file mode 100644 index 000000000..035330aed --- /dev/null +++ b/components.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@genarrative/shared/components", + "ui": "@genarrative/shared/components/ui", + "utils": "@genarrative/shared/lib/utils", + "lib": "@genarrative/shared/lib" + } +} diff --git a/docs/README.md b/docs/README.md index 7b24f1cda..f937a964d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,6 +30,7 @@ ## 图片画布与媒体 +- [共享基础组件库与展示页](./technical/【前端架构】共享基础组件库与展示页-2026-08-26.md):网站与客户端复用的无业务 UI chrome、样式边界和 `/components` 展示页。 - [客户端素材创作无限画布阶段一合同](./technical/【技术方案】客户端素材创作无限画布阶段一合同-2026-08-05.md) - [图片画布结构化持久化与迁移回滚](./【编辑器】图片画布结构化持久化与迁移回滚方案-2026-07-19.md) - [编辑器生成结果原子提交与幂等重放](./technical/【后端架构】编辑器生成结果原子提交与幂等重放方案-2026-08-06.md) diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 4ffd04577..7c49f0673 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -7747,3 +7747,15 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在 - DirectProject 的 Codex cwd 固定为真实 `game/` 目录时,原生文件工具和 patch 必须使用 cwd 相对路径(`index.html`、`style.css`、`game.js`);`game/...` 仅用于 AGC manifest、回执和客户端投影,不能作为 cwd 内原生 patch 路径,以避免 `writing outside of the project`。 - 直连 Runtime 已取得 Developer Key 时,资源编辑的 `remote_credentials` 是该操作的完整身份边界;其中冻结平台快照为空表示 Developer 模式,禁止再从进程全局 GUI 登录态补回账号快照。平台账号模式仍只使用同一组凭据捕获的快照。 - 回归覆盖 Direct 系统提示路径合同和 Developer Key / GUI 快照隔离;未触碰用户项目 `.agent` 锁、账本或凭据。 + +## 2026-08-26 网站与客户端共享基础组件库 + +- 决策:无业务 UI chrome 统一放入 `packages/shared/src/components`,通过 `@genarrative/shared/components` 导出;组件只接受 React props、原生 DOM props、短文案、图标节点和回调,不读取账号、钱包、请求客户端、store、Tauri API 或业务实体。 +- 样式边界:共享样式位于 `packages/shared/src/components/styles.css`,选择器使用 `.genarrative-ui-*` 前缀并消费 `packages/shared/src/theme.css` 的 `--platform-*` token。网站与客户端各自保留页面壳、路由、业务和玩法视觉,不导入网站总 CSS;账户 DTO 适配器只从 `@genarrative/shared/components/account` 单独导出,不进入通用组件 barrel。 +- 展示页:网站 `/components`(`/design-system` 兼容别名)展示所有公共组件的变体、状态、Token 和移动端布局,使用本地静态示例,不经过账号 Gate 或调用业务 API。 + +## 2026-08-27 共享组件采用 shadcn open-code 渐进迁移 + +- 决策:共享 Web UI 采用 shadcn 的源码归属项目模式,新增 canonical source 放入 `packages/shared/src/components/ui`,统一通过 `packages/shared/src/lib/utils.ts` 的 `cn` 与 CVA 组织变体;不引入 MUI / Ant Design 全量组件,也不一次性重写现有业务 common。 +- 首步:`Button`、`Modal`、`SegmentedTabs`、`Switch`、`Input`、`Textarea`、`Badge`、`Card` 已迁移到 `components/ui` canonical source,保留 `@genarrative/shared/components` 的旧 API 作为兼容适配;Button/Input/Badge 用 CVA,Dialog/Tabs/Switch 按需使用 Radix,Tailwind 4 继续消费现有 `--platform-*` token 与 `.genarrative-ui-*` 样式。原生 Select 暂不迁移。 +- 边界:网站与 Tauri WebView 可消费该 DOM 源码,移动端 React Native 不导入这套组件与 CSS;Radix primitive 仅在 Dialog、Tabs、Switch 等具体组件迁移时按需加入。 diff --git a/docs/technical/【前端架构】共享基础组件库与展示页-2026-08-26.md b/docs/technical/【前端架构】共享基础组件库与展示页-2026-08-26.md new file mode 100644 index 000000000..68463b32b --- /dev/null +++ b/docs/technical/【前端架构】共享基础组件库与展示页-2026-08-26.md @@ -0,0 +1,40 @@ +# 共享基础组件库与展示页 + +更新时间:`2026-08-26` + +## 目标 + +网站与 Tauri 客户端共享无业务依赖的基础 UI chrome,同时保留各自的页面布局、路由、账号/钱包业务和玩法视觉。共享层只接受 React props、原生 DOM props、短文案、图标节点和回调,不读取请求客户端、store、Tauri API 或业务实体。 + +## 包边界 + +组件位于 `packages/shared/src/components`,由 `@genarrative/shared` 根入口和 `@genarrative/shared/components` 子路径稳定导出。新增组件按 shadcn 的 open-code 方式归档在 `components/ui`,源码、变体和组合点归项目所有;`packages/shared/src/lib/utils.ts` 提供统一的 `cn` 工具。当前迁移阶段仍复用 `packages/shared/src/components/styles.css` 的 `.genarrative-ui-*` 选择器和 `packages/shared/src/theme.css` 的 `--platform-*` token,避免破坏既有平台视觉契约。 + +已有账户 DTO 适配组件单独由 `@genarrative/shared/components/account` 导出;它们不进入本样式库的通用组件 barrel,也不从该入口转出。 + +当前基础组件: + +- `Button`、`IconButton` +- `TextField`、`SelectField` +- `Subpanel`、`Modal` +- `Status`、`EmptyState`、`Badge` +- `ProgressBar`、`SegmentedTabs`、`Switch` +- `Spinner`、`Divider` + +迁移约定:`Button`、`Modal`、`SegmentedTabs`、`Switch`、`Input`、`Textarea`、`Badge`、`Card` 的 canonical source 位于 `packages/shared/src/components/ui`,旧的 `@genarrative/shared/components` API 作为兼容适配层继续保留。`Button`、`Input`、`Badge` 使用 CVA,Dialog/Tabs/Switch 使用按需 Radix primitive;原生 `SelectField` 暂不迁移,避免破坏现有 `