Files
Genarrative/docs/technical/【前端架构】共享基础组件库与展示页-2026-08-26.md
T
kdletters c5200c7d45
Project CI / Backend tests (push) Successful in 8m31s
Project CI / Repository checks (push) Successful in 14m14s
Project CI / Frontend tests (push) Successful in 13m2s
Project CI / Native shell tests (push) Successful in 21m30s
补齐共享 UI 组件库与展示页交互 (#202)
## 变更内容

- 新增基于 shadcn open-code 模式的共享 UI canonical 组件、样式与导出。
- 新增 `/components` 共享组件展示页,并覆盖平台组件、Token、状态和移动端布局。
- 补齐平台展示页的筛选、排序、上传预览、标签、开关和异步状态交互。
- 修复排序导致预览主题变化、筛选弹窗误关闭和入口状态不更新的问题。
- 同步网站与客户端构建别名、依赖、路由测试和项目文档。

## 验证

- `npm run test -- src/components/shared-components/SharedComponentsShowcasePage.test.tsx`
- `npm run typecheck`
- `npm run check:encoding`
- `npm run build:raw`
- `git diff --check`
- pre-push 门禁通过

Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/202
Co-authored-by: kdletters <kdletters@qq.com>
Co-committed-by: kdletters <kdletters@qq.com>
2026-08-31 14:10:44 +08:00

6.2 KiB
Raw Blame History

共享基础组件库与展示页

更新时间:2026-08-28

目标

网站与 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,也不从该入口转出。

当前基础组件:

  • ButtonIconButton
  • TextFieldSelectField
  • SubpanelModal
  • StatusEmptyStateBadge
  • ProgressBarSegmentedTabsSwitch
  • SpinnerDividerLabelCheckboxSkeleton
  • Table(含 TableHeaderTableBodyTableRowTableHeadTableCellTableCaptionTableFooter

平台 chrome 组件(同样从 @genarrative/shared/components 导出):

  • PlatformActionButtonPlatformIconButtonPlatformPillBadge
  • PlatformStatusMessagePlatformEmptyStatePlatformTextField
  • PlatformProgressBarPlatformSegmentedTabsPlatformFieldLabelPlatformSubpanel
  • PlatformAsyncStatePanelPlatformFilterToolbarPlatformIconBadgePlatformRuntimeStatusToast
  • PlatformInfoBlockPlatformNavigableListItemPlatformStatGrid
  • PlatformToggleRow(整行 checkbox / 状态开关)
  • PlatformBackActionButton(白底结果页返回动作)

迁移约定:ButtonModalSegmentedTabsSwitchInputTextareaBadgeCard 的 canonical source 位于 packages/shared/src/components/ui,旧的 @genarrative/shared/components API 作为兼容适配层继续保留。ButtonInputBadge 使用 CVADialog/Tabs/Switch 使用按需 Radix primitive;原生 SelectField 暂不迁移,避免破坏现有 <option> 与表单事件合同。后续组件按使用面逐个迁移。

2026-08-28 平台 chrome 的无业务依赖组件继续完成实现收口:新增 PlatformAsyncStatePanelPlatformFilterToolbarPlatformIconBadgePlatformInfoBlockPlatformNavigableListItemPlatformRuntimeStatusToastPlatformStatGrid。这些组件的实现统一位于 packages/shared/src/componentssrc/components/common 中同名文件仅保留兼容导出,因此现有业务页面无需一次性改写导入路径,实际渲染已复用共享包实现。带 API、store、编辑器或素材解析副作用的组件仍留在业务层,后续按同一边界逐项评估。

2026-08-31 继续迁移:PlatformToggleRow 已收口到共享包,保留 src/components/common/PlatformToggleRow.tsx 兼容出口;Match3DResultViewPuzzleResultViewVisualNovelResultViewSquareHoleResultViewRpgCreationResultViewImplRpgCreationResultActionBarRpgCreationAssetDebugPanelCustomWorldCreationHubBabyObjectMatchWorkspaceAccountModalCreationAgentWorkspace 已将共享 chrome 组件改为直接从 @genarrative/shared/components 引入。玩法专属的媒体、上传、编辑器、弹窗和资源状态组件仍保留在业务 common 层。

2026-08-31 第二批:新增 PlatformBackActionButton canonical 实现及兼容出口,展示页加入 compact / regular 两种返回动作示例;LoginScreenBindPhoneScreenCustomWorldEntityCatalog 继续将共享 chrome 直引到 @genarrative/shared/components。媒体、上传、资源换签与业务弹窗仍不迁移。

同时提供 Platform* 别名,便于从现有平台组件命名迁移;别名不携带平台业务语义。

Web 宿主需要显式启用 Tailwind 4,并引入 @genarrative/shared/styles.css@genarrative/shared/theme.cssTauri WebView 与网站共用这套源码,移动端 React Native 不消费 DOM/CSS 组件。筛选工具栏所需的 platform-category-* chrome 样式也已放入共享样式文件,独立宿主无需依赖网站 src/index.css。组件库不提供页面壳或业务流程。components.json 只用于 shadcn CLI 定位源码,不允许覆盖现有业务组件。

展示页

网站 /components(兼容别名 /design-system)是共享组件展示页,不经过账号 Gate。页面按“基础组件”“平台通用组件”“Token”“状态”分区,覆盖公共组件的主要变体、交互态、筛选/标签/媒体/上传/异步状态/指标列表等平台 chrome 和移动端布局;展示数据均为本地静态示例,不调用 API。平台组件分区中的筛选按示例素材状态过滤结果,排序按最近使用或名称重排结果,并在筛选按钮、排序按钮和独立筛选面板之间保持同一份本地状态。展示页可用于网站与客户端接入前的视觉回归和人工验收。平台通用组件示例优先从 @genarrative/shared/components 直接导入,业务代码仍可通过 src/components/common 的兼容出口渐进迁移;展示页只接入不读取请求、store 或业务实体的 chrome,不把账号、发布和编辑器业务流程嵌入展示页。

验收

  • 组件具备原生语义、键盘焦点、禁用态和可访问名称。
  • 按钮、图标按钮、分段标签和开关具备明确按压态;展示页中的可操作示例在点击后提供可见状态反馈,加载态按钮保持禁用。
  • Modal 支持 ESC、遮罩点击、可选 portal 和移动端底部面板布局。
  • 组件样式不依赖网站总 CSS;Tauri 只需共享主题、共享组件样式和自己的壳层样式。
  • 修改后运行 npm run typechecknpm run check:encodingnpm run test -- src/routing/activeAppRoutes.test.tsgit diff --check