@teamix-evo/skills 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/manifest.json +3 -2
- package/package.json +2 -2
- package/src/teamix-evo-code-opentrek/SKILL.md +12 -10
- package/src/teamix-evo-code-opentrek/api-layering.md +8 -5
- package/src/teamix-evo-code-opentrek/checklist.md +2 -0
- package/src/teamix-evo-code-opentrek/error-and-loading.md +38 -25
- package/src/teamix-evo-code-opentrek/file-structure.md +63 -54
- package/src/teamix-evo-code-opentrek/forms-and-validation.md +14 -12
- package/src/teamix-evo-code-opentrek/reuse-first.md +2 -0
- package/src/teamix-evo-code-opentrek/routing-and-codesplit.md +23 -21
- package/src/teamix-evo-code-opentrek/testing.md +32 -28
- package/src/teamix-evo-code-uni-manager/SKILL.md +12 -10
- package/src/teamix-evo-code-uni-manager/api-layering.md +2 -0
- package/src/teamix-evo-code-uni-manager/checklist.md +2 -0
- package/src/teamix-evo-code-uni-manager/error-and-loading.md +3 -1
- package/src/teamix-evo-code-uni-manager/file-structure.md +2 -0
- package/src/teamix-evo-code-uni-manager/forms-and-validation.md +2 -0
- package/src/teamix-evo-code-uni-manager/reuse-first.md +3 -1
- package/src/teamix-evo-code-uni-manager/routing-and-codesplit.md +3 -1
- package/src/teamix-evo-code-uni-manager/testing.md +2 -0
- package/src/teamix-evo-design-opentrek/SKILL.md +213 -52
- package/src/teamix-evo-design-opentrek/boundaries.md +25 -5
- package/src/teamix-evo-design-opentrek/brand.md +7 -7
- package/src/teamix-evo-design-opentrek/checklist.md +15 -13
- package/src/teamix-evo-design-opentrek/components.md +89 -39
- package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-1.html +1069 -0
- package/src/teamix-evo-design-opentrek/examples/detail-ai-gateway-instance.html +941 -0
- package/src/teamix-evo-design-opentrek/examples/detail-page-api-doc.html +906 -0
- package/src/teamix-evo-design-opentrek/examples/detail-page-config.html +993 -0
- package/src/teamix-evo-design-opentrek/examples/detail-page-monitor.html +1339 -0
- package/src/teamix-evo-design-opentrek/examples/detail-page.html +933 -0
- package/src/teamix-evo-design-opentrek/examples/settings-page.html +1119 -0
- package/src/teamix-evo-design-opentrek/examples/standard-card-list.html +1094 -0
- package/src/teamix-evo-design-opentrek/examples/standard-table-list.html +1361 -0
- package/src/teamix-evo-design-opentrek/examples/wizard-form-page.html +877 -0
- package/src/teamix-evo-design-opentrek/flows.md +85 -12
- package/src/teamix-evo-design-opentrek/foundations.md +12 -9
- package/src/teamix-evo-design-opentrek/generation-flow.md +84 -14
- package/src/teamix-evo-design-opentrek/pages/detail-page/SKILL.md +260 -0
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/api-doc-detail.md +163 -0
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/comparison-detail.md +100 -0
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/monitor-detail.md +190 -0
- package/src/teamix-evo-design-opentrek/pages/detail-page/patterns/resource-detail.md +148 -0
- package/src/teamix-evo-design-opentrek/pages/form-page/SKILL.md +362 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/SKILL.md +286 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/action-column-spec.md +60 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/column-meta-rules.md +117 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/search-combo-spec.md +194 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/_shared/state-action-pattern.md +51 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/advanced-filter-list.md +94 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/card-list.md +558 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/drawer-list.md +76 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/expandable-list.md +70 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/l2-sidebar-list.md +73 -0
- package/src/teamix-evo-design-opentrek/pages/list-page/patterns/standard-list.md +198 -0
- package/src/teamix-evo-design-opentrek/patterns/color-mapping.md +96 -0
- package/src/teamix-evo-design-opentrek/patterns/dashboard.md +2 -0
- package/src/teamix-evo-design-opentrek/patterns/detail-page.md +218 -152
- package/src/teamix-evo-design-opentrek/patterns/form-page.md +437 -228
- package/src/teamix-evo-design-opentrek/patterns/list-page.md +221 -260
- package/src/teamix-evo-design-opentrek/patterns/page-types.md +40 -125
- package/src/teamix-evo-design-opentrek/philosophy.md +7 -5
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AGENT RUNTIME.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI GATEWAY.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_AI STUDIO.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_DEV-2.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_LOGO.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/_assets/OP_OPS.svg +1 -0
- package/src/teamix-evo-design-opentrek/rules/boundaries.rules.json +3 -3
- package/src/teamix-evo-design-opentrek/rules/business-mapping.json +124 -0
- package/src/teamix-evo-design-opentrek/rules/common-components.json +924 -0
- package/src/teamix-evo-design-opentrek/rules/component-specs.json +1083 -0
- package/src/teamix-evo-design-opentrek/rules/design-tokens.css +433 -0
- package/src/teamix-evo-design-opentrek/rules/design-tokens.json +2798 -0
- package/src/teamix-evo-design-opentrek/rules/layout-rules.json +218 -0
- package/src/teamix-evo-design-opentrek/rules/page-flow.json +351 -0
- package/src/teamix-evo-design-opentrek/rules/page-frame.json +241 -0
- package/src/teamix-evo-design-opentrek/rules/page-header-spec.md +123 -0
- package/src/teamix-evo-design-opentrek/rules/page-types.json +206 -0
- package/src/teamix-evo-design-opentrek/rules/sidebar-spec.md +217 -0
- package/src/teamix-evo-design-opentrek/rules/styling.json +188 -0
- package/src/teamix-evo-design-opentrek/rules/token-mapping.md +284 -0
- package/src/teamix-evo-design-uni-manager/SKILL.md +18 -27
- package/src/teamix-evo-design-uni-manager/boundaries.md +7 -4
- package/src/teamix-evo-design-uni-manager/brand.md +1 -1
- package/src/teamix-evo-design-uni-manager/components.md +33 -28
- package/src/teamix-evo-design-uni-manager/foundations.md +24 -21
- package/src/teamix-evo-design-uni-manager/generation-flow.md +46 -8
- package/src/teamix-evo-design-uni-manager/patterns/dashboard.md +3 -1
- package/src/teamix-evo-design-uni-manager/patterns/detail-page.md +42 -13
- package/src/teamix-evo-design-uni-manager/patterns/form-page.md +67 -30
- package/src/teamix-evo-design-uni-manager/patterns/list-page.md +73 -40
- package/src/teamix-evo-design-uni-manager/patterns/page-types.md +14 -12
- package/src/teamix-evo-design-uni-manager/philosophy.md +4 -2
- package/src/teamix-evo-design-uni-manager/rules/boundaries.rules.json +3 -3
- package/src/teamix-evo-manage/SKILL.md +74 -66
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
# 测试规范
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 本文件是 [SKILL.md](./SKILL.md) Step 7 的读取项。纯函数和 zod schema 必测,其余按关键路径覆盖。
|
|
4
|
+
|
|
3
5
|
> **核心约定**:`vitest` + `@testing-library/react` + `msw`,文件就近 `*.test.ts(x)`。**不追求覆盖率数字**,追求"关键路径必有测试 + 纯函数全测"。
|
|
4
6
|
|
|
5
7
|
---
|
|
6
8
|
|
|
7
9
|
## 选型(业界主流)
|
|
8
10
|
|
|
9
|
-
| 类型
|
|
10
|
-
|
|
|
11
|
-
| 测试 runner | `vitest`
|
|
12
|
-
| 组件测试
|
|
13
|
-
| API mock
|
|
14
|
-
| 断言
|
|
15
|
-
| E2E(可选)
|
|
11
|
+
| 类型 | 工具 | 理由 |
|
|
12
|
+
| ----------- | -------------------------------------------------------- | ------------------------------------------------ |
|
|
13
|
+
| 测试 runner | `vitest` | 与 Vite 原生集成,ESM 友好,API 与 Jest 兼容 |
|
|
14
|
+
| 组件测试 | `@testing-library/react` + `@testing-library/user-event` | 测行为不测实现,业界事实标准(Kent C. Dodds) |
|
|
15
|
+
| API mock | `msw`(Mock Service Worker) | 拦截真实 fetch / axios,测试与生产共用 service 层 |
|
|
16
|
+
| 断言 | `vitest` 内置 `expect`(兼容 Jest) | 无需 chai |
|
|
17
|
+
| E2E(可选) | `playwright` | 关键流程冒烟,**不在本 skill 范围** |
|
|
16
18
|
|
|
17
19
|
**不要混用**:已经选 vitest 就不要再加 jest;已经用 msw 就不要再自己 mock axios。
|
|
18
20
|
|
|
@@ -57,16 +59,16 @@ src/test/
|
|
|
57
59
|
|
|
58
60
|
按 ROI 排序:
|
|
59
61
|
|
|
60
|
-
| 优先级 | 类型
|
|
61
|
-
|
|
|
62
|
-
| P0
|
|
63
|
-
| P0
|
|
64
|
-
| P0
|
|
65
|
-
| P1
|
|
66
|
-
| P1
|
|
67
|
-
| P2
|
|
68
|
-
| ❌
|
|
69
|
-
| ❌
|
|
62
|
+
| 优先级 | 类型 | 例子 | 必测? |
|
|
63
|
+
| ------ | ------------------------------------- | ----------------------------------- | -------------- |
|
|
64
|
+
| P0 | 纯函数(`src/utils/`、`src/services/`) | `formatMoney`、`isValidOrder` | ✅ **必测** |
|
|
65
|
+
| P0 | zod schema | `CreateOrderInputSchema.parse(...)` | ✅ **必测** |
|
|
66
|
+
| P0 | 关键业务路径(下单 / 支付 / 鉴权) | E2E-style 组件测 | ✅ **必测** |
|
|
67
|
+
| P1 | Hook(数据 hook + 自定义 UI hook) | `useOrderList`、`useDebounce` | 推荐 |
|
|
68
|
+
| P1 | 复用业务组件(`src/components/`) | `OrderStatusBadge` 各状态渲染 | 推荐 |
|
|
69
|
+
| P2 | 页面组件 | 用 RTL 渲染 + msw mock | 可选 |
|
|
70
|
+
| ❌ | ui 包源码 | 已在 `@teamix-evo/ui` 包内测过 | **不要重复测** |
|
|
71
|
+
| ❌ | 三方库 | `react-router`、`react-query` | **不要测** |
|
|
70
72
|
|
|
71
73
|
**红线**:不要为了凑覆盖率数字测 `Button` 能不能渲染、`React.useState` 能不能用。
|
|
72
74
|
|
|
@@ -158,7 +160,9 @@ function wrapper({ children }: { children: React.ReactNode }) {
|
|
|
158
160
|
}
|
|
159
161
|
|
|
160
162
|
it('加载订单列表', async () => {
|
|
161
|
-
const { result } = renderHook(() => useOrderList({ status: 'all' }), {
|
|
163
|
+
const { result } = renderHook(() => useOrderList({ status: 'all' }), {
|
|
164
|
+
wrapper,
|
|
165
|
+
});
|
|
162
166
|
await waitFor(() => expect(result.current.isSuccess).toBe(true));
|
|
163
167
|
expect(result.current.data).toHaveLength(1);
|
|
164
168
|
});
|
|
@@ -238,16 +242,16 @@ renderWithProviders(<OrderListPage />, { route: '/orders?status=pending' });
|
|
|
238
242
|
|
|
239
243
|
## §5 · 反模式速查
|
|
240
244
|
|
|
241
|
-
| 反模式
|
|
242
|
-
|
|
|
243
|
-
| 测 `setState` 是否被调用
|
|
244
|
-
| `getByTestId` 当默认查询
|
|
245
|
-
| 一个 it 里 expect 10 次无关断言
|
|
246
|
-
| mock 整个 hook(`vi.mock('@/hooks/...')`) | 失去集成价值
|
|
247
|
-
| 自己 mock fetch / axios
|
|
248
|
-
| 测试里写 `setTimeout(..., 1000)` 等异步
|
|
249
|
-
| 全局 mock console.error 静默
|
|
250
|
-
| 追求 80% 覆盖率刷数字
|
|
245
|
+
| 反模式 | 为什么禁 | 应该 |
|
|
246
|
+
| ---------------------------------------- | ---------------------------- | ----------------------------------------------- |
|
|
247
|
+
| 测 `setState` 是否被调用 | 测了实现,重构即崩 | 测渲染结果 / 用户行为 |
|
|
248
|
+
| `getByTestId` 当默认查询 | data-testid 跟可访问性绑不上 | `getByRole` / `getByLabelText` 优先 |
|
|
249
|
+
| 一个 it 里 expect 10 次无关断言 | 失败定位难 | 拆多个 it |
|
|
250
|
+
| mock 整个 hook(`vi.mock('@/hooks/...')`) | 失去集成价值 | msw mock 后端,hook 真跑 |
|
|
251
|
+
| 自己 mock fetch / axios | 与生产代码路径不一致 | 用 msw |
|
|
252
|
+
| 测试里写 `setTimeout(..., 1000)` 等异步 | 慢且不稳定 | `await waitFor` / `findBy*` |
|
|
253
|
+
| 全局 mock console.error 静默 | 错过真实告警 | 让测试输出 console.error,但 setup 里 fail on it |
|
|
254
|
+
| 追求 80% 覆盖率刷数字 | 测了没价值的代码 | 按"优先级表"测,不看覆盖率盲冲 |
|
|
251
255
|
|
|
252
256
|
---
|
|
253
257
|
|
|
@@ -29,16 +29,18 @@ If the task is purely about _visual design_ of a screen, use [`teamix-evo-design
|
|
|
29
29
|
|
|
30
30
|
## What this skill does
|
|
31
31
|
|
|
32
|
-
Before AI writes or commits code, it performs an **8-step gated flow**. Steps 1-4 are baseline (
|
|
32
|
+
Before AI writes or commits code, it performs an **8-step gated flow**. Steps 1-4 are baseline (**必须执行,不得跳过**); steps 5-7 are topic gates (run when the task touches that topic); step 8 is the final self-review (**必须执行,不得跳过**).
|
|
33
33
|
|
|
34
|
-
1.
|
|
35
|
-
2.
|
|
36
|
-
3.
|
|
37
|
-
4.
|
|
38
|
-
5. **Error/loading gate** — if the task adds a page or data hook,
|
|
39
|
-
6. **Routing gate** — if the task adds a route or page-entry,
|
|
40
|
-
7. **Testing gate** —
|
|
41
|
-
8.
|
|
34
|
+
1. **🚧 Reuse-first check** — **MUST READ** [`reuse-first.md`](reuse-first.md). Before creating any new component, query the `@teamix-evo/ui` registry (via MCP `list_components` / `find_components`), the **biz-ui/uni-manager** layer (um-topbar / CloudBadge / ContextSwitcher placeholders), and grep the local project. Only write new code when no reuse path exists. **组件兗底铁律**:找不到时优先 ui 原子件组合,**禁止**自撸基础件。
|
|
35
|
+
2. **🚧 Layering check** — **MUST READ** [`api-layering.md`](api-layering.md). Any code that talks to a backend goes under `src/services/<domain>.ts`; multi-tenant / multi-region / multi-cloud context (tenantId / regionId / cloudProvider) is **propagated through `lib/http.ts` interceptors**, not as ad-hoc params per call. Components never call `fetch` / `axios` directly. Data hooks live in `src/hooks/` and consume services.
|
|
36
|
+
3. **🚧 Directory check** — **MUST READ** [`file-structure.md`](file-structure.md). Place the new file under the right top-level folder; uni-manager-specific shells (TenantContext / RegionContext / CloudBadge) have conventional locations.
|
|
37
|
+
4. **🚧 Forms gate** — if the task involves a form, **MUST READ** [`forms-and-validation.md`](forms-and-validation.md). `react-hook-form` + `zod`; schema lives at `src/services/<domain>.schema.ts`. Dangerous operations (delete / release / destroy) **must** route through `useDangerConfirm` (input resource name).
|
|
38
|
+
5. **Error/loading gate** — if the task adds a page or data hook, **MUST READ** [`error-and-loading.md`](error-and-loading.md). Ensure global ErrorBoundary, page-level fallback, and three-state handling (`isPending` / `isError` / data) are in place; mutations report success/error via `toast`. Cross-cloud resource-not-found has a dedicated fallback.
|
|
39
|
+
6. **Routing gate** — if the task adds a route or page-entry, **MUST READ** [`routing-and-codesplit.md`](routing-and-codesplit.md). Pages use `React.lazy`; auth/role guards live in `src/routes/guards.tsx`; **list-page filters MUST sync `tenantId` / `regionId` / `cloudProvider` into URL search params**; um-topbar context switch rewrites the current URL.
|
|
40
|
+
7. **Testing gate** — **MUST READ** [`testing.md`](testing.md). Pure functions and zod schemas are **mandatory** to test; tenant-context-aware http handlers must be covered by msw.
|
|
41
|
+
8. **🚧 Self-review** — **MUST READ** [`checklist.md`](checklist.md). Every item must pass before declaring the change done.
|
|
42
|
+
|
|
43
|
+
> ⚠️ **禁止行为**: 跳过 Step 1 (reuse-first) 直接写新组件、跳过 Step 8 (checklist) 不做自检、凭"已有知识"省略任何文件读取。
|
|
42
44
|
|
|
43
45
|
## Inputs the user provides
|
|
44
46
|
|
|
@@ -84,7 +86,7 @@ Before AI writes or commits code, it performs an **8-step gated flow**. Steps 1-
|
|
|
84
86
|
|
|
85
87
|
- [`teamix-evo-design-uni-manager`](../teamix-evo-design-uni-manager/SKILL.md) — visual / interaction rules for uni-manager screen generation. Run **alongside** this skill when the task includes UI; this skill never overrides design on visual concerns.
|
|
86
88
|
- [`teamix-evo-code-opentrek`](../teamix-evo-code-opentrek/SKILL.md) — sister code skill for OpenTrek variant. The two skills share 80% of conventions (file structure / layering / forms / testing); uni-manager-specific deltas are in this skill's SKILL/reuse-first/api-layering/routing/checklist.
|
|
87
|
-
- [`teamix-evo-manage`](../teamix-evo-manage/SKILL.md) — lifecycle (`init` / `update` / `uninstall` / `skills add`). Out of scope here.
|
|
89
|
+
- [`teamix-evo-manage`](../teamix-evo-manage/SKILL.md) — lifecycle (`init` / `update` / `uninstall` / `skills init` / `skills add`). Out of scope here.
|
|
88
90
|
|
|
89
91
|
## Why these conventions(uni-manager 视角)
|
|
90
92
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# API 数据层规范(uni-manager)
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 本文件是 [SKILL.md](./SKILL.md) Step 2 的强制读取项。任何涉及后端通信的代码必须先读本文件。
|
|
4
|
+
|
|
3
5
|
> **核心原则**:组件不直接 fetch。所有与后端通信的代码都落在 `src/services/`,通过 `src/hooks/` 暴露给组件。
|
|
4
6
|
>
|
|
5
7
|
> **uni-manager 增强**:多租户 / 多区域 / 跨云上下文(tenantId / regionId / cloudProvider)通过 **`src/lib/http.ts` 的 request interceptor 自动注入**,service 函数与 hook 不感知;只有"显式跨上下文"的少数 API 才在调用处显式覆盖。
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# 错误与加载态规范(uni-manager)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> ⚠️ **Prerequisites**: 本文件是 [SKILL.md](./SKILL.md) Step 5 的条件读取项。任务涉及页面或数据 hook 时必须读取。
|
|
4
|
+
|
|
5
|
+
> **核心约定**:渲染错误用 `ErrorBoundary`,异步加载用 `react-query` 的 `isPending/isError`(必要时叠 `Suspense`),全局兗底必须存在。**不允许**白屏 / 红屏直出给用户。**uni-manager 额外提供跨云资源专属 fallback。**
|
|
4
6
|
|
|
5
7
|
---
|
|
6
8
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# 表单与校验规范(uni-manager)
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 本文件是 [SKILL.md](./SKILL.md) Step 4 的条件读取项。任务涉及表单时必须读取。
|
|
4
|
+
|
|
3
5
|
> **核心约定**:表单状态用 `react-hook-form`,schema 用 `zod`,**永远不要**用一堆 `useState` 拼表单。**uni-manager 额外约定:危险操作走 `useDangerConfirm`(输入资源完整名称才执行),切租户/区域时表单未保存内容必须二次确认。**
|
|
4
6
|
|
|
5
7
|
---
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Reuse-First · 组件 / 工具复用决策流(uni-manager)
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 本文件是 [SKILL.md](./SKILL.md) Step 1 的强制读取项。AI 写任何新代码前必须先读完本文件并执行复用查询。
|
|
4
|
+
|
|
3
5
|
> 在写**任何**新组件 / Hook / 工具函数之前,AI 必须按本流程跑一遍。"没找到现成的"必须是查询的结论,不能是默认假设。
|
|
4
6
|
>
|
|
5
|
-
> uni-manager 在 OpenTrek 通用流程之上,叠加 **biz-ui/uni-manager** 实物层与"
|
|
7
|
+
> uni-manager 在 OpenTrek 通用流程之上,叠加 **biz-ui/uni-manager** 实物层与"组件兗底铁律"。
|
|
6
8
|
|
|
7
9
|
---
|
|
8
10
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# 路由与代码分包规范(uni-manager)
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> ⚠️ **Prerequisites**: 本文件是 [SKILL.md](./SKILL.md) Step 6 的条件读取项。任务涉及路由或页面入口时必须读取。
|
|
4
|
+
|
|
5
|
+
> **核心约定**:页面级 `React.lazy` 默认分包,鉴权 / 角色守卫集中在 `src/routes/`,404 / 401 / 403 必有兗底。**uni-manager 额外约定:tenantId / regionId / cloudProvider 同步到 URL search params,um-topbar 切换上下文时改写 URL。**
|
|
4
6
|
|
|
5
7
|
---
|
|
6
8
|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# 测试规范(uni-manager)
|
|
2
2
|
|
|
3
|
+
> ⚠️ **Prerequisites**: 本文件是 [SKILL.md](./SKILL.md) Step 7 的读取项。纯函数和 zod schema 必测,其余按关键路径覆盖。
|
|
4
|
+
|
|
3
5
|
> **核心约定**:`vitest` + `@testing-library/react` + `msw`,文件就近 `*.test.ts(x)`。**不追求覆盖率数字**,追求"关键路径必有测试 + 纯函数全测"。**uni-manager 额外要求 msw handler 校验 X-Tenant-Id / X-Region-Id / X-Cloud-Provider 请求头。**
|
|
4
6
|
|
|
5
7
|
---
|
|
@@ -7,65 +7,226 @@ description: |
|
|
|
7
7
|
Coordinates with: teamix-evo-code-opentrek (run alongside when the screen also creates new files).
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# 页面规则系统 v7.8.4
|
|
11
11
|
|
|
12
|
-
>
|
|
13
|
-
>
|
|
14
|
-
>
|
|
15
|
-
> 本技能是 **完整自包含** 的 OpenTrek 设计规则(非 overlay)。
|
|
16
|
-
> Token 具体值请参照 `tokens/theme.css` 中的 CSS 变量,组件详细 API 通过 MCP `get_component_meta` 按需查询。
|
|
12
|
+
> 本文件是**入口索引**:只负责意图路由 + 文件角色索引。
|
|
13
|
+
> 生成 / 翻新 / 验证的详细执行步骤、GATE 门禁、MUST READ 清单一律在 [generation-flow.md](./generation-flow.md)。
|
|
14
|
+
> 页面类型决策树、子类型识别在 [patterns/page-types.md](./patterns/page-types.md)。
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
路由分发架构 — 根技能负责意图识别和索引路由,详细规则在子技能和 `./rules/` 目录。
|
|
17
|
+
三层参数化架构:元规则(固化)+ 产品配置(灵活)+ 模式细节。
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. 意图路由
|
|
22
|
+
|
|
23
|
+
根据用户输入自动判断执行路径,无需用户指定:
|
|
24
|
+
|
|
25
|
+
| 意图 | 识别关键词 | 路由路径 | 详细流程 |
|
|
26
|
+
| -------- | -------------------------------------------------------------------- | -------------------- | ---------------------------------------------------------------------- |
|
|
27
|
+
| **翻新** | "改造"/"升级"/"替换"/"刷新规范"/"翻新"/"对齐规范"/"重新生成这个页面" | 翻新路径 | 详见 [generation-flow.md §2](./generation-flow.md) |
|
|
28
|
+
| **生成** | "生成"/"创建"/"新建"/"设计一个" | 生成路径(六步门控) | 详见 [generation-flow.md §1](./generation-flow.md) |
|
|
29
|
+
| **验证** | "检查"/"验证"/"评估"/"合规"/"是否符合规范" | 验证路径 | 详见 [generation-flow.md §3](./generation-flow.md) |
|
|
30
|
+
| **查询** | "token"/"色值"/"间距"/"字体"/"圆角"/"阴影"/"组件尺寸" | 查询路径 | 直接读取 `./rules/design-tokens.json` / `./rules/component-specs.json` |
|
|
31
|
+
| **规则** | 其他通用问题("列表页怎么设计"/"弹窗宽度"/"用什么颜色") | 根技能 | 读取对应 `./rules/` 文件回答 |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. 页面类型索引
|
|
36
|
+
|
|
37
|
+
| 类型 ID | 中文名 | 核心特征 | 子技能目录 | 状态 |
|
|
38
|
+
| ------------------------------------------------------------------------------------------------- | ------ | -------------------------------------- | ---------------------- | ------ |
|
|
39
|
+
| ListPage | 列表页 | 多条结构化数据 + 搜索/筛选 + 分页 | `./pages/list-page/` | 已就绪 |
|
|
40
|
+
| DetailPage | 详情页 | 单条记录只读展示 + 描述列表 + 操作按钮 | `./pages/detail-page/` | 已就绪 |
|
|
41
|
+
| FormPage | 表单页 | 用户输入数据 + 字段校验 + 提交 | `./pages/form-page/` | 已就绪 |
|
|
42
|
+
| Dashboard | 仪表板 | 数据可视化 / 统计聚合 | — | 待开发 |
|
|
43
|
+
| WizardPage / ResultPage / ExceptionPage / WorkspacePage / KanbanPage / WelcomePage / OverviewPage | — | 见 patterns/page-types.md | — | 待开发 |
|
|
44
|
+
|
|
45
|
+
> 决策树、Zone Map、易混点速查、子类型识别详见 [patterns/page-types.md](./patterns/page-types.md)。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 3. 子技能索引
|
|
50
|
+
|
|
51
|
+
> 📖 **读取顺序**:生成/翻新页面时,**主入口 = `./pages/{type}-page/`**(完整规范与布局硬约束);`./patterns/{type}-page.md` 仅作为**索引概览**用于快速判断子类型。
|
|
52
|
+
|
|
53
|
+
| 子技能 ID | 名称 | 子类型数 | 入口文件 |
|
|
54
|
+
| ----------- | ---------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
55
|
+
| list-page | 列表页技能 | 6 | **生成入口**:[`./pages/list-page/`](./pages/list-page/) ← 完整规范 | 索引概览:[`./patterns/list-page.md`](./patterns/list-page.md) |
|
|
56
|
+
| detail-page | 详情页技能 | 2 | **生成入口**:[`./pages/detail-page/`](./pages/detail-page/) ← 完整规范 | 索引概览:[`./patterns/detail-page.md`](./patterns/detail-page.md) |
|
|
57
|
+
| form-page | 表单页技能 | 3 | **生成入口**:[`./pages/form-page/`](./pages/form-page/) ← 完整规范 | 索引概览:[`./patterns/form-page.md`](./patterns/form-page.md) |
|
|
58
|
+
|
|
59
|
+
### 关键词 → 子技能路由
|
|
60
|
+
|
|
61
|
+
| 关键词 | 路由到 |
|
|
62
|
+
| -------------------------------------- | -------------------------------------------------------------------------- |
|
|
63
|
+
| "列表"/"表格"/"查询"/"检索"/"数据列表" | → `./pages/list-page/` |
|
|
64
|
+
| "详情"/"查看"/"信息"/"配置详情" | → `./pages/detail-page/` |
|
|
65
|
+
| "表单"/"创建"/"编辑"/"填写"/"新建" | → `./pages/form-page/` |
|
|
66
|
+
| "仪表板"/"统计"/"分析"/"指标" | → [`./patterns/dashboard.md`](./patterns/dashboard.md)(完整子技能待开发) |
|
|
67
|
+
| 其他通用问题 | 根技能 + `./rules/` 索引 |
|
|
68
|
+
|
|
69
|
+
### 高频业务场景速查
|
|
70
|
+
|
|
71
|
+
完整 16 种业务场景映射见 `./rules/business-mapping.json`。核心 6 类:
|
|
72
|
+
|
|
73
|
+
| 业务场景 | 关键词 | 页面类型 | 返回行为 |
|
|
74
|
+
| -------- | ------------------- | -------------- | -------------- |
|
|
75
|
+
| 查看列表 | 列表/表格/查询/检索 | ListPage | 带分页和筛选 |
|
|
76
|
+
| 查看详情 | 详情/查看/信息 | DetailPage | 可返回列表 |
|
|
77
|
+
| 新建记录 | 新建/创建/新增 | FormPage(新建) | 保存后返回列表 |
|
|
78
|
+
| 编辑记录 | 编辑/修改 | FormPage(编辑) | 保存后返回原页 |
|
|
79
|
+
| 删除记录 | 删除/移除 | Dialog | 确认后刷新列表 |
|
|
80
|
+
| 复制新建 | 复制/克隆 | FormPage(复制) | 保存后返回列表 |
|
|
81
|
+
|
|
82
|
+
> 完整 CRUD 流转规则见 [flows.md](./flows.md) §3。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 4. 文件角色简表
|
|
87
|
+
|
|
88
|
+
> 一句话说明每个文件的职责。详细 MUST READ 时机见 [generation-flow.md](./generation-flow.md) 各 Step。
|
|
89
|
+
|
|
90
|
+
### 4.1 流程与认知文档
|
|
91
|
+
|
|
92
|
+
| 文件 | 作用 |
|
|
93
|
+
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
|
|
94
|
+
| [generation-flow.md](./generation-flow.md) | 生成 / 翻新 / 验证三大路径的完整执行步骤与 GATE 门禁(**唯一执行路径**) |
|
|
95
|
+
| [philosophy.md](./philosophy.md) | 设计哲学四大原则(理解"为什么这么做") |
|
|
96
|
+
| [brand.md](./brand.md) | 视觉调性 + 文案语气基调 + 视觉五维(圆角/配色/密度/阴影/焦点) |
|
|
97
|
+
| [foundations.md](./foundations.md) | Token 真值:色彩 / 间距 / 字号 / 圆角 / 阴影 / 动效 |
|
|
98
|
+
| [boundaries.md](./boundaries.md) | 38 条硬规则:F1-F10 禁止项 + S1-S8 样式规则 + C1-C12 结构 + I1-I4 图标 + FF1-FF4 表单 + Overlay 选型 |
|
|
99
|
+
| [components.md](./components.md) | 组件双层架构 + 选型决策树 + 拼装配方 |
|
|
100
|
+
| [checklist.md](./checklist.md) | 10 项自检清单(Step 7 必读) |
|
|
101
|
+
| [flows.md](./flows.md) | **页间流转唯一真值源**:四条用户旅程 + 主流转图 + CRUD 速查 + 资源生命周期 + 流转设计规则 |
|
|
102
|
+
|
|
103
|
+
### 4.2 模式文档(patterns/)
|
|
104
|
+
|
|
105
|
+
| 文件 | 作用 |
|
|
106
|
+
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
107
|
+
| [patterns/page-types.md](./patterns/page-types.md) | 页面类型决策树 + Zone Map + 易混点判定 |
|
|
108
|
+
| [patterns/list-page.md](./patterns/list-page.md) | 列表页 6 种子类型规格(standard / pure-card / standard-card / drawer / expandable / l2-sidebar) |
|
|
109
|
+
| [patterns/detail-page.md](./patterns/detail-page.md) | 详情页 2 种子类型规格(tabbed / single-section) |
|
|
110
|
+
| [patterns/form-page.md](./patterns/form-page.md) | 表单页 3 种子类型规格(single-page / wizard / drawer-form) |
|
|
111
|
+
| [patterns/dashboard.md](./patterns/dashboard.md) | 仪表板模式(待开发) |
|
|
112
|
+
| [patterns/color-mapping.md](./patterns/color-mapping.md) | 语义色映射表(Step 6 必读) |
|
|
113
|
+
|
|
114
|
+
### 4.3 规则文件(rules/)
|
|
115
|
+
|
|
116
|
+
按读取层次分组,需要时按需读取:
|
|
117
|
+
|
|
118
|
+
**① 基础定义层**("有什么")
|
|
21
119
|
|
|
22
|
-
|
|
120
|
+
| 文件 | 作用 |
|
|
121
|
+
| -------------------------------- | ---------------------------------------------------------- |
|
|
122
|
+
| `./rules/page-frame.json` | L0/L1/L2 页面框架规范 + 框架组件继承 + 响应式规则 |
|
|
123
|
+
| `./rules/page-types.json` | 12 种页面类型 JSON 定义 |
|
|
124
|
+
| `./rules/business-mapping.json` | 16 个业务场景映射(含关键词数组 / 子技能目录 / CRUD 映射) |
|
|
125
|
+
| `./rules/common-components.json` | 40 个业务组件索引(v4.0,以组件名为唯一标识) |
|
|
23
126
|
|
|
24
|
-
|
|
25
|
-
| -------- | -------------------------------------------------- | ------------------------------------------- |
|
|
26
|
-
| **生成** | "生成" / "创建" / "新建" / "设计一个" / "做一个" | → generation-flow.md 六步流程 |
|
|
27
|
-
| **翻新** | "改造" / "升级" / "翻新" / "对齐规范" / "重新生成" | → generation-flow.md §翻新路径 |
|
|
28
|
-
| **验证** | "检查" / "验证" / "评估" / "是否符合规范" | → checklist.md 逐项对照 |
|
|
29
|
-
| **查询** | "token" / "色值" / "间距" / "组件尺寸" | → foundations.md(MCP `tokens_*` 工具规划中) |
|
|
127
|
+
**② 布局规则层**("怎么排")
|
|
30
128
|
|
|
31
|
-
|
|
129
|
+
| 文件 | 作用 |
|
|
130
|
+
| --------------------------- | ----------------------------------------------- |
|
|
131
|
+
| `./rules/layout-rules.json` | 4 种布局模式(A/B/C/D)+ PageContainer 嵌套约束 |
|
|
132
|
+
| `./rules/page-flow.json` | CRUD 页面流转 + 导航 + 操作确认三级规范 |
|
|
133
|
+
|
|
134
|
+
**③ 视觉规范层**("长什么样")
|
|
135
|
+
|
|
136
|
+
| 文件 | 作用 |
|
|
137
|
+
| ---------------------------- | ---------------------------------------------------------------- |
|
|
138
|
+
| `./rules/design-tokens.json` | 语义化色值 / 间距 / 字体 / 尺寸 / 断点(锚定 TrekClaw v4.1 CSS) |
|
|
139
|
+
| `./rules/design-tokens.css` | 完整 CSS 变量定义(:root 变量块),HTML 内联 / TSX `@import` |
|
|
140
|
+
|
|
141
|
+
**④ 实现约束层**("怎么写")
|
|
142
|
+
|
|
143
|
+
| 文件 | 作用 |
|
|
144
|
+
| ------------------------------ | --------------------------------------------------------------------------------------------- |
|
|
145
|
+
| `./rules/component-specs.json` | 26 条组件精确尺寸约束 C1-C26(Button / Input / Dialog / Table / Select / DescriptionList 等) |
|
|
146
|
+
| `./rules/styling.json` | S1-S8 样式规则 + F1-F10 禁止项 |
|
|
147
|
+
|
|
148
|
+
### 4.4 范例文档(examples/)
|
|
149
|
+
|
|
150
|
+
| 文件 | 作用 |
|
|
151
|
+
| ------------------------------------- | -------------------------------------------------- |
|
|
152
|
+
| `./examples/standard-table-list.html` | 标准表格列表参考范例(表格列规范 / 操作列 / 分页) |
|
|
153
|
+
| `./examples/standard-card-list.html` | 卡片列表参考范例(CardGrid / ItemCard 结构) |
|
|
154
|
+
| `./examples/detail-page.html` | 详情页参考范例(L2 框架 / Tabs / DescriptionList) |
|
|
155
|
+
| `./examples/wizard-form-page.html` | 向导表单参考范例(Steps / 动态底栏 / 校验) |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 5. 通用组件分层(速查)
|
|
160
|
+
|
|
161
|
+
子技能通过**组件名**引用,通过 `shadcnComponent` 字段定位 @teamix-evo/ui 实现。完整索引见 `./rules/common-components.json` v4.0。
|
|
162
|
+
|
|
163
|
+
- **核心业务组件**:TopNavigation / Sidebar / PageHeader / Breadcrumb / Pagination / Dialog / Sheet / Button / Tag / Badge / Select / Input / Tooltip / Separator / Empty / Spinner / Alert / Sonner
|
|
164
|
+
- **业务扩展组件**:SearchCombo / ContextSwitcher / Steps / ItemCard / CardGrid / CardActionBar
|
|
165
|
+
- **详情页组件**:DescriptionList / DescriptionItem / InfoCard(component-specs.json C26)
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 6. 全局执行约束
|
|
170
|
+
|
|
171
|
+
> 所有路径共享的硬约束。生成代码时强制遵守,违反即不合规。Step 级 Token 用法详见 [generation-flow.md](./generation-flow.md) Step 6。
|
|
172
|
+
|
|
173
|
+
### 6.1 组件选用优先级(不得跳级)
|
|
32
174
|
|
|
33
175
|
```
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- Dashboard → patterns/dashboard.md
|
|
41
|
-
- Dialog/Sheet/Drawer → 视为复合组件(非页面);走 components.md §3.1 选型
|
|
42
|
-
+ boundaries.md F8 / F9 / S7 / C2 / FF1-FF4
|
|
43
|
-
→ 读 patterns/page-types.md §6 确认页间流转(主流转图 / 规则 / CRUD 速查)
|
|
44
|
-
→ 涉及用户旅程时读 flows.md(A 资源查找 / B 创建 / C 异常 / D 批量)
|
|
45
|
-
|
|
46
|
-
阶段 ③ 生成代码
|
|
47
|
-
→ 读 foundations.md (Token 约束)
|
|
48
|
-
→ 读 boundaries.md (硬规则)
|
|
49
|
-
→ MCP get_component_meta(id) 查组件 Props
|
|
50
|
-
→ 对照 checklist.md 自检
|
|
176
|
+
优先级 1:./rules/ 中已定义的规范组件
|
|
177
|
+
→ common-components.json / component-specs.json / boundaries.md
|
|
178
|
+
优先级 2:@teamix-evo/ui 原子组件合理拼装
|
|
179
|
+
→ 遵循 styling.json 的 S1-S8 + F1-F10
|
|
180
|
+
优先级 3:自定义实现(仅当以上均无法满足)
|
|
181
|
+
→ 必须 <!-- CUSTOM: 原因 --> 标注 + 在 common-components.json 注册 shadcnComponent
|
|
51
182
|
```
|
|
52
183
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
184
|
+
### 6.2 Token 引用格式(速查)
|
|
185
|
+
|
|
186
|
+
所有视觉属性必须引用 Token,禁止硬编码。完整 Token 定义见 [foundations.md](./foundations.md)。
|
|
187
|
+
|
|
188
|
+
| 属性类别 | 正确写法 | 禁止写法 |
|
|
189
|
+
| -------- | ------------------------------------------- | ---------------------------------- |
|
|
190
|
+
| 颜色 | `hsl(var(--token-name))` | `#0055EE`、`rgb(0,85,238)`、`blue` |
|
|
191
|
+
| 间距 | Token 变量或 Tailwind spacing class | 裸写 `16px`、`1rem` |
|
|
192
|
+
| 字号 | `var(--font-size-*)` 四级(base/lg/xl/2xl) | 裸写 `14px`、`0.875rem` |
|
|
193
|
+
| 圆角 | `var(--radius-*)` 层级(sm/md/lg) | 裸写 `8px`、`0.5rem` |
|
|
194
|
+
| 阴影 | `var(--shadow-*)` | 裸写 `0 1px 3px rgba(...)` |
|
|
195
|
+
| 字体族 | `var(--font-sans)` / `var(--font-mono)` | 裸写 `Inter, sans-serif` |
|
|
196
|
+
|
|
197
|
+
### 6.3 标准范例引用
|
|
198
|
+
|
|
199
|
+
生成页面前**必须**参考对应类型的标准范例(见 §4.4 examples/),作为输出质量基准。
|
|
200
|
+
|
|
201
|
+
### 6.4 设计语言一致性
|
|
202
|
+
|
|
203
|
+
| 维度 | 约束 | 依据 |
|
|
204
|
+
| -------- | -------------------------------------------------------------------- | -------------------------------------- |
|
|
205
|
+
| 间距模型 | v7.5 分层 padding:Card.paddingX = 20px,Table 首末列 padding = 20px | `design-tokens.json` §componentSpacing |
|
|
206
|
+
| 品牌主色 | #0055EE(HSL 218.6° 100% 46.7%),通过 `var(--primary)` 引用 | `design-tokens.css` |
|
|
207
|
+
| 页面框架 | 遵循 `page-frame.json` 的 L0/L1/L2 层级继承 | `./rules/page-frame.json` |
|
|
208
|
+
| 布局模式 | 遵循 `layout-rules.json` 的 A/B/C/D 四种模式 + 扩展模式 | `./rules/layout-rules.json` |
|
|
209
|
+
| 页面流转 | 遵循 `page-flow.json` 的 CRUD 路径与导航规范 | `./rules/page-flow.json` |
|
|
210
|
+
| 表面规则 | v7.6 ContentCard:去 border,使用 shadow-sm | `styling.json` |
|
|
211
|
+
| 设计原则 | 优先使用已有组件 → 组合而非重写 → 优先内置 variant → 使用语义色值 | `foundations.md` |
|
|
212
|
+
|
|
213
|
+
### 6.5 降级拼装规则
|
|
214
|
+
|
|
215
|
+
当规范中未定义某组件需求时,使用 @teamix-evo/ui 拼装须满足:
|
|
216
|
+
|
|
217
|
+
1. **结构合规**:通过 `boundaries.md` C1-C12 校验
|
|
218
|
+
2. **样式合规**:通过 `styling.json` F1-F10 自检
|
|
219
|
+
3. **Token 合规**:所有视觉属性引用 Token,无硬编码
|
|
220
|
+
4. **语义清晰**:使用 @teamix-evo/ui 的 variant 体系
|
|
221
|
+
5. **可追溯**:HTML 注释中标注拼装来源和决策原因
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 7. 与 code-opentrek skill 协作
|
|
226
|
+
|
|
227
|
+
页面级任务通常 design + code 两个 skill 同时触发。冲突时按 ADR 0018:
|
|
228
|
+
|
|
229
|
+
- **design 决定"做什么"**:页面骨架 / Zone 划分 / 组件选型 / Token 绑定 / 视觉规则
|
|
230
|
+
- **code 决定"怎么做"**:文件放置 / import 路径 / API 层 / 表单实现细节
|
|
231
|
+
|
|
232
|
+
> 完整分工矩阵见 [generation-flow.md §5](./generation-flow.md)。
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# 硬约束 · Boundaries
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> ⚠️ **何时读本文件**: [generation-flow.md](./generation-flow.md) Step 7(自检)、翻新路径、验证路径均强制要求完整读取本文件。
|
|
4
|
+
> 本文件是硬规则的**唯一真值**,不得跳过。
|
|
5
|
+
|
|
6
|
+
> 本文件列出所有“AI 生成页面 / 组件代码时**不能做什么**”的硬规则。共 38 条规则分 5 组:
|
|
4
7
|
>
|
|
5
8
|
> - **F1-F10**:禁止项(视觉与 token 层面)
|
|
6
9
|
> - **FF1-FF4**:表单专属硬约束(错误信息、必填、状态色块、Card 嵌套)
|
|
@@ -41,6 +44,23 @@
|
|
|
41
44
|
>
|
|
42
45
|
> 检查: eslint `teamix-evo/no-arbitrary-tw-value` (Tailwind className) · stylelint `teamix-evo/no-hardcoded-dimension` (CSS gap/padding/margin/width/height/font-size 等)
|
|
43
46
|
|
|
47
|
+
### [ERROR] F2.5 · 禁止使用原生 HTML form 控件
|
|
48
|
+
|
|
49
|
+
```diff
|
|
50
|
+
- <input value={v} onChange={(e) => setV(e.target.value)} />
|
|
51
|
+
- <select value={v} onChange={(e) => setV(e.target.value)}>...</select>
|
|
52
|
+
- <textarea ... />
|
|
53
|
+
+ <Input value={v} onChange={setV} />
|
|
54
|
+
+ <Select options={...} value={v} onChange={setV} />
|
|
55
|
+
+ <Textarea ... />
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
任何场景(业务页面 / 模板 demo / 示例代码 / story)**都禁止**直接使用原生 `<input>` / `<select>` / `<textarea>` / `<form>` 字段元素 — 必须用 ui 包的 `<Input>` / `<Select>` / `<Textarea>` / `<Switch>` / `<Checkbox>` / `<RadioGroup>` / `<DatePicker>` 等组件。原生控件不带 token 视觉、不联动 Field 校验态、不参与 `react-hook-form` Controller。
|
|
59
|
+
|
|
60
|
+
**列表筛选区**用 `<FilterBarPreset>` / `<FilterBar>` + `<FormField>` + 原子组件;**表单页**用 `<Form>` + `<FieldGroup>` + `<FormField>` + 原子组件;**单字段输入**仍用 `<Input>` / `<Select>` 直传 value/onChange。
|
|
61
|
+
|
|
62
|
+
> 检查: eslint(规划中:`teamix-evo/no-native-form-control`)+ 人工 review
|
|
63
|
+
|
|
44
64
|
### [ERROR] F3 · 禁止按组件新增重复语义变量
|
|
45
65
|
|
|
46
66
|
新增 CSS 变量前**必须**先检索 `tokens/theme.css`:
|
|
@@ -155,7 +175,7 @@
|
|
|
155
175
|
+ </Card>
|
|
156
176
|
```
|
|
157
177
|
|
|
158
|
-
|
|
178
|
+
白卡由 [`OpPageContainer`](../../biz-ui/variants/opentrek/op-page-container/op-page-container.meta.md) **内置**(`bg-card rounded-2xl p-6` 撑满主区),是 opentrek 任何页面类型的**单例容器**(参 [list-page.md §9 嵌套约束](./patterns/list-page.md#9-嵌套约束) / [form-page.md §9](./patterns/form-page.md#9-嵌套约束))。**不要再手写 `<Card>` 包整个 PageHeader / DataTable / Form**(违反白卡单例)。分区表单确需在白卡内嵌入子 Card 划分若干小节时,子 Card 必须有明确边框/阴影差异,且仅限**分区表单**用例(form-page.md §2.3)。
|
|
159
179
|
|
|
160
180
|
> 检查: 无 lint (人工评审 / reviewer subagent)
|
|
161
181
|
|
|
@@ -259,7 +279,7 @@ CSS 变量已在 dark 模式下自动切换。手动 `dark:` 会绕过主题系
|
|
|
259
279
|
+ <Dialog><DialogContent>
|
|
260
280
|
```
|
|
261
281
|
|
|
262
|
-
适用:`Dialog / Sheet /
|
|
282
|
+
适用:`Dialog / Sheet / Popover / Tooltip / DropdownMenu / HoverCard`。组件自带层级管理。
|
|
263
283
|
|
|
264
284
|
> 检查: 无 lint (运行时 / 评审,可由 reviewer subagent 抽检)
|
|
265
285
|
|
|
@@ -306,7 +326,7 @@ CSS 变量已在 dark 模式下自动切换。手动 `dark:` 会绕过主题系
|
|
|
306
326
|
|
|
307
327
|
> 检查: 无 lint (后续可加 ESLint JSX 结构规则,目前由 reviewer subagent 抽检)
|
|
308
328
|
|
|
309
|
-
### [ERROR] C2 · Dialog / Sheet
|
|
329
|
+
### [ERROR] C2 · Dialog / Sheet 必须有 Title
|
|
310
330
|
|
|
311
331
|
```diff
|
|
312
332
|
- <DialogContent>...</DialogContent>
|
|
@@ -496,7 +516,7 @@ CSS 变量已在 dark 模式下自动切换。手动 `dark:` 会绕过主题系
|
|
|
496
516
|
| 需要输入的任务 | `Dialog` |
|
|
497
517
|
| 危险操作确认 | `AlertDialog variant="destructive"` |
|
|
498
518
|
| 侧面板(详情 / 筛选) | `Sheet` |
|
|
499
|
-
| 移动端底部面板 | `
|
|
519
|
+
| 移动端底部面板 | `Sheet side="bottom"` |
|
|
500
520
|
| 悬浮信息(hover 触发) | `HoverCard` |
|
|
501
521
|
| 点击弹出小内容 | `Popover` |
|
|
502
522
|
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
|
|
7
7
|
## 1. 视觉风格五维
|
|
8
8
|
|
|
9
|
-
| 维度 | 定位 | 具体表现
|
|
10
|
-
| ------------ | -------- |
|
|
11
|
-
| **色彩情绪** | 沉稳专业 |
|
|
12
|
-
| **信息密度** | 高效紧凑 | 单屏承载核心操作,减少翻页
|
|
13
|
-
| **视觉层次** | 克制有序 | 间距、字重、色彩建立 3 级层级
|
|
14
|
-
| **交互反馈** | 即时确定 | 操作后 200ms 内明确反馈
|
|
15
|
-
| **圆角风格** |
|
|
9
|
+
| 维度 | 定位 | 具体表现 | 对立面(禁止) |
|
|
10
|
+
| ------------ | -------- | ---------------------------------------------------------------------------------- | -------------------- |
|
|
11
|
+
| **色彩情绪** | 沉稳专业 | 品牌主色 `#0055EE` (hsl(218.6 100% 46.7%)) + 高对比信息层级 | 花哨多彩、渐变堆叠 |
|
|
12
|
+
| **信息密度** | 高效紧凑 | 单屏承载核心操作,减少翻页 | 大面积留白、装饰占位 |
|
|
13
|
+
| **视觉层次** | 克制有序 | 间距、字重、色彩建立 3 级层级 | 多重强调、全部高亮 |
|
|
14
|
+
| **交互反馈** | 即时确定 | 操作后 200ms 内明确反馈 | 模糊状态、静默 |
|
|
15
|
+
| **圆角风格** | 中圆角 | OpenTrek v4.1:`rounded-md` (8px) / `rounded-lg` (12px);legacy `rounded-sm` (4px) | 全直角、超大圆角 |
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|