lcap-frontend-library 0.0.1
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 +271 -0
- package/bin/lcap-frontend-library.mjs +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +27 -0
- package/dist/init.d.ts +6 -0
- package/dist/init.js +79 -0
- package/dist/sync.d.ts +4 -0
- package/dist/sync.js +70 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.js +101 -0
- package/package.json +34 -0
- package/packages/lcap-frontend-library/LEARNINGS.md +11 -0
- package/packages/lcap-frontend-library/SKILL.md +86 -0
- package/packages/lcap-frontend-library/commands/migrate.check.md +287 -0
- package/packages/lcap-frontend-library/commands/migrate.green.md +190 -0
- package/packages/lcap-frontend-library/commands/migrate.plan.md +169 -0
- package/packages/lcap-frontend-library/commands/migrate.red.md +160 -0
- package/packages/lcap-frontend-library/commands/migrate.scan.md +151 -0
- package/packages/lcap-frontend-library/commands/migrate.spec.md +144 -0
- package/packages/lcap-frontend-library/commands/migrate.tasks.md +179 -0
- package/packages/lcap-frontend-library/commands/speckit.create.md +201 -0
- package/packages/lcap-frontend-library/commands/speckit.implement.md +88 -0
- package/packages/lcap-frontend-library/commands/speckit.plan.md +79 -0
- package/packages/lcap-frontend-library/commands/speckit.self-check.md +177 -0
- package/packages/lcap-frontend-library/commands/speckit.specify.md +91 -0
- package/packages/lcap-frontend-library/commands/speckit.tasks.md +61 -0
- package/packages/lcap-frontend-library/references/frontend-design/LICENSE.txt +177 -0
- package/packages/lcap-frontend-library/references/frontend-design/SKILL.md +42 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/SKILL.md +360 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/api.md +331 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/block.md +160 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/i18n.md +95 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/icon.md +27 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/ide/container.md +728 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/ide/element.md +312 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/ide/expression.md +154 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/ide/index.md +113 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/ide/modal.md +189 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/ide/popover.md +171 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/ide.md +799 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/implementation-rules.md +242 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/index.md +27 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/nasl-view-component.md +895 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/accessibility.md +185 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/child.md +82 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/data-source.md +261 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/event.md +171 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/form.md +266 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/function.md +80 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/link.md +137 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/slot.md +128 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-ant-design.md +1470 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-cloud-ui.md +259 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-element-plus.md +580 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-element-ui.md +1007 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-mobile-ui.md +85 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/theme.md +234 -0
- package/packages/lcap-frontend-library/references/lcap-extension-component/workflow-guardrails.md +328 -0
- package/packages/lcap-frontend-library/references/nasl-logic-authoring/SKILL.md +201 -0
- package/packages/lcap-frontend-library/scripts/bash/create-component-files.sh +95 -0
- package/packages/lcap-frontend-library/scripts/bash/create-extension-project.sh +109 -0
- package/packages/lcap-frontend-library/scripts/bash/create-logic-files.sh +149 -0
- package/packages/lcap-frontend-library/scripts/bash/create-spec.sh +109 -0
- package/packages/lcap-frontend-library/scripts/bash/get-available-port.sh +35 -0
- package/packages/lcap-frontend-library/scripts/bash/list-specs.sh +19 -0
- package/packages/lcap-frontend-library/scripts/node/setup-extension-project.mjs +166 -0
- package/packages/lcap-frontend-library/templates/component-self-check.md +31 -0
- package/packages/lcap-frontend-library/templates/component-template.md +96 -0
- package/packages/lcap-frontend-library/templates/library-report-template.md +52 -0
- package/packages/lcap-frontend-library/templates/logic-template.md +44 -0
- package/packages/lcap-frontend-library/templates/migration-manifest-template.md +84 -0
- package/packages/lcap-frontend-library/templates/migration-plan-template.md +138 -0
- package/packages/lcap-frontend-library/templates/migration-report-template.md +227 -0
- package/packages/lcap-frontend-library/templates/migration-spec-template.md +135 -0
- package/packages/lcap-frontend-library/templates/migration-tasks-template.md +129 -0
- package/packages/lcap-frontend-library/templates/plan-template.md +299 -0
- package/packages/lcap-frontend-library/templates/self-check-report-template.md +148 -0
- package/packages/lcap-frontend-library/templates/tasks-template.md +81 -0
- package/packages/lcap-frontend-library/workflows/create/flow.md +199 -0
- package/packages/lcap-frontend-library/workflows/evolve/flow.md +249 -0
- package/packages/lcap-frontend-library/workflows/generate/flow.md +10 -0
- package/packages/lcap-frontend-library/workflows/harness/flow.md +82 -0
- package/packages/lcap-frontend-library/workflows/migrate/flow.md +302 -0
- package/packages/lcap-frontend-library/workflows/migrate/knowledge-base.md +564 -0
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# [组件名称] - 实现计划
|
|
2
|
+
|
|
3
|
+
**Date**:`[YYYY-MM-DD]`
|
|
4
|
+
**Input**:`specs/[###-组件短名]/spec.md`(路径以实际规范目录为准)
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 摘要
|
|
9
|
+
|
|
10
|
+
[用 3~6 句话概括:要解决什么问题、主要技术路线(依赖与栈)、与 spec「概述」一致。]
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 技术上下文
|
|
15
|
+
|
|
16
|
+
> 与下文「目标与范围」「技术架构方案」**互填**,避免同一事实两处矛盾。
|
|
17
|
+
|
|
18
|
+
| 键 | 内容 |
|
|
19
|
+
|:---|:---|
|
|
20
|
+
| **语言 / 技术栈** | [Vue2 / Vue3 / React,与「组件信息」一致] |
|
|
21
|
+
| **主要依赖** | [见「建议依赖」;无则写 N/A] |
|
|
22
|
+
| **测试** | 栈与目录约定见 **§五 · 测试约定**;执行级细则见 `commands/speckit.plan.md` 与 SKILL.md |
|
|
23
|
+
| **目标平台** | [浏览器 / 设计器;与 spec 一致] |
|
|
24
|
+
| **存储** | 无(纯前端组件) |
|
|
25
|
+
| **性能 / 约束** | [首屏、大数据量、Canvas 等;与 spec 非功能需求对应;无则 N/A] |
|
|
26
|
+
| **范围** | [与「MVP 约定」一致,一句话] |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 规范门禁
|
|
31
|
+
|
|
32
|
+
*计划定稿或评审前自查;与 `implementation-rules.md` 及 SKILL 对齐。与 **§六** 主题相近:本节为「计划能否定稿」,§六为「实现能否提交」。*
|
|
33
|
+
|
|
34
|
+
- [ ] 接口与 spec 一致,类型均为 NASL,无滥用 `Object` / `any`(验收时对照 **§二**)
|
|
35
|
+
- [ ] **idetype** 与 **Slots** 与 **§一 · LCAP 必要产出** 一致(规则仅以该段为准)
|
|
36
|
+
- [ ] **样式与主题**:**§三** 已在计划阶段填表,不推迟到实现再定
|
|
37
|
+
- [ ] **测试**:实现顺序含 **§五** 所列层级(单测、example.stories、e2e;工程已配置 `test:e2e` 时);失败修复后再勾选
|
|
38
|
+
- [ ] **功能内聚**:spec 交互已在 **§一 · 内置 UI 控件清单** 落实;与 **§二 · Methods** 边界一致,未默认推给插槽或仅 Method
|
|
39
|
+
- [ ] **模块化**:已填「文件路径与模块化规划」表;主文件过长时已有 composables/hooks 抽离路径
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 文档与源码产出
|
|
44
|
+
|
|
45
|
+
### 规范侧(`specs/`,相对仓库或沙箱根)
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
specs/[###-组件短名]/
|
|
49
|
+
├── spec.md # 需求与接口来源
|
|
50
|
+
├── plan.md # 本文件(/speckit.plan 输出)
|
|
51
|
+
└── tasks.md # /speckit.tasks 输出(非本命令生成)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 源码侧(扩展工程根目录,路径以实际脚手架为准;计划阶段须将 `[组件目录]` 等写死为真实路径)
|
|
55
|
+
|
|
56
|
+
**结构约束**:**勿将整块业务与算法堆在 `index.vue`(或 `index.tsx`)**。入口文件以模板组装、事件转发、与子模块组合为主;可复用计算、数据变换、与三方库交互等应拆入 `utils/`、`composables/` 或子组件(本模板未列子组件目录时可在计划中补充路径),避免单文件过长、难以测试与维护。
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
<扩展工程根>/
|
|
60
|
+
├── src/components/[组件目录 kebab-case]/
|
|
61
|
+
│ ├── api.ts # NASL、@ExtensionComponent、ideusage
|
|
62
|
+
│ ├── utils/ # Vue3:公用纯函数、与展示无关的工具(.ts)
|
|
63
|
+
│ ├── composables/ # 可选:useXxx(.ts);从 index 抽离的响应式/侦听/生命周期/ref 编排,勿堆在单文件;纯函数放 utils
|
|
64
|
+
│ ├── stories/
|
|
65
|
+
│ │ ├── block.stories.{js|tsx|jsx} # 画布拖拽初始(单 story)
|
|
66
|
+
│ │ └── example.stories.{js|tsx|jsx} # 功能 demo:本地调试与 e2e
|
|
67
|
+
│ ├── __tests__/
|
|
68
|
+
│ │ └── *.spec.ts # Vitest 单元/交互测试
|
|
69
|
+
│ └── index.vue # 或 index.tsx:入口与视图编排;**非**所有逻辑的实现处
|
|
70
|
+
├── e2e/ # Playwright → 组件目录下 example.stories
|
|
71
|
+
└── playwright.config.ts # create-extension-project / setup-extension-project 初始化后通常已有
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
上表为**通用目录约定**;下方「文件路径与模块化规划」须填**本组件实例**的确定路径,二者配合使用,勿只写其一。
|
|
75
|
+
|
|
76
|
+
### 文件路径与模块化规划(必填)
|
|
77
|
+
|
|
78
|
+
> 路径均为 **相对扩展工程根目录** 的完整路径,与上表「组件目录」一致;**禁止**模糊表述。简单组件可仅一行 View;复杂组件须拆行列出 composables/utils 等。
|
|
79
|
+
> **模式 C(增量修改)**:仅列本次变更涉及的文件,"操作"列标注 `新增` 或 `修改`。
|
|
80
|
+
|
|
81
|
+
| 模块名称 | 职责描述 | 抽离方式 | 产出路径(相对扩展工程根) | 测试层 | 操作 |
|
|
82
|
+
|:---|:---|:---|:---|:---|:---|
|
|
83
|
+
| **View 层** | 模板结构、内置工具栏/操作区、样式与组装 | `index.vue` | `src/components/[组件目录 kebab]/index.vue` | Vitest(结构) + E2E(渲染) | 新增 / 修改 |
|
|
84
|
+
| **[如:绘图逻辑]** | [如:画布初始化、网格、Resize] | [如:`useFabric.ts`(Vue3 composable)] | `src/components/[组件目录 kebab]/composables/useFabric.ts` | Vitest(调用参数) + E2E(产出值) | 新增 / 修改 |
|
|
85
|
+
| **[如:业务]** | [如:风险计算、映射] | [如:`useRiskColoring.ts` / `utils/map.ts`] | `src/components/[组件目录 kebab]/composables/useRiskColoring.ts` | Vitest(返回值) | 新增 / 修改 |
|
|
86
|
+
|
|
87
|
+
<!-- 模式 A/B(新组件)时"操作"列全部为"新增";模式 C 按实际填写 -->
|
|
88
|
+
|
|
89
|
+
**测试层填写规则**(依据 workflow-guardrails §8「值的来源」):
|
|
90
|
+
- 模块内部**不调用**浏览器 API(Canvas/WebGL/getBoundingClientRect 等)→ `Vitest(返回值)`
|
|
91
|
+
- 模块内部**调用**浏览器 API → `Vitest(调用参数)` + `E2E(产出值)`,Vitest 仅 mock API 验证调用参数,禁止断言返回值/渲染产出
|
|
92
|
+
- View 层 → `Vitest(结构)` + `E2E(渲染)`
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 规范例外(仅当需偏离 implementation-rules / SKILL 时填写)
|
|
97
|
+
|
|
98
|
+
| 偏离项 | 为何需要 | 更简单方案不可用的原因 |
|
|
99
|
+
|:---|:---|:---|
|
|
100
|
+
| [如:某处暂写死色值] | [场景] | [原因] |
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 一、目标与范围
|
|
105
|
+
|
|
106
|
+
### 组件信息
|
|
107
|
+
|
|
108
|
+
| 项目 | 说明 |
|
|
109
|
+
|------|------|
|
|
110
|
+
| **组件 Tag** | [如 `<qr-code>`,kebab-case] |
|
|
111
|
+
| **组件类名** | [如 QrCode,大驼峰,与 Tag 对应] |
|
|
112
|
+
| **技术栈** | [Vue2/Vue3/React] |
|
|
113
|
+
| **idetype** | [element / container / modal / drawer / messager / popover 等] |
|
|
114
|
+
| **核心职责** | [简述组件的核心功能] |
|
|
115
|
+
|
|
116
|
+
<!-- idetype 参考:references/lcap-extension-component/ide 下对应文档 -->
|
|
117
|
+
|
|
118
|
+
### 建议依赖
|
|
119
|
+
|
|
120
|
+
| 依赖包 | 版本 | 用途 |
|
|
121
|
+
|--------|------|------|
|
|
122
|
+
| [如 qrcode.vue] | [如 3.x] | [如 二维码生成] |
|
|
123
|
+
|
|
124
|
+
<!-- 若依赖的三方库存在**必填参数**未在 spec 中体现,须在下方「接口设计」中补充对应 Props/Options。-->
|
|
125
|
+
|
|
126
|
+
### LCAP 必要产出
|
|
127
|
+
|
|
128
|
+
| 产出 | 说明 |
|
|
129
|
+
|------|------|
|
|
130
|
+
| **api.ts** | 组件配置、Props/Events/Slots/Methods 描述,参考 component/api.md |
|
|
131
|
+
| **block.stories.{js\|tsx}** | 拖拽到画布后的初始代码,参考 component/block.md |
|
|
132
|
+
| **ideusage** | 页面设计器适配,参考 component/ide.md、ide/element.md 或 ide/container.md 等 |
|
|
133
|
+
|
|
134
|
+
**idetype 与插槽必须一致**(门禁、§四、§六 均以此为准,不重复展开):
|
|
135
|
+
- 仅 **element**(原子组件如 button、text)在 api.ts 中**不定义 Slots**;**container、modal、drawer、messager、popover** 均需按 spec 在 api.ts 中保留并定义插槽,不得误删。
|
|
136
|
+
- **若 spec 或 api.ts 中已定义插槽(Slots),则 idetype 不得为 element**,必须根据组件形态选择 container(容器)、modal(弹窗)、drawer(抽屉)、messager(消息弹出)或 popover(弹出层)之一,否则设计器行为与插槽定义矛盾。
|
|
137
|
+
|
|
138
|
+
### MVP 约定
|
|
139
|
+
|
|
140
|
+
| 项目 | 约定 |
|
|
141
|
+
|------|------|
|
|
142
|
+
| 功能范围 | [本期实现的验收点,与 spec 对应] |
|
|
143
|
+
| 不包含 | [暂不支持、不在 skill 脚手架范围的内容] |
|
|
144
|
+
|
|
145
|
+
### 实现风险
|
|
146
|
+
|
|
147
|
+
| 风险点 | 风险等级 | 应对方案 |
|
|
148
|
+
|--------|----------|----------|
|
|
149
|
+
| [如:第三方库不支持 SSR] | 高/中/低 | [方案] |
|
|
150
|
+
|
|
151
|
+
### 技术架构方案(涉及三方库或复杂布局时必填)
|
|
152
|
+
|
|
153
|
+
- **开发前置检查 / 技术调研**:在编写代码前须输出并写入本节的调研结论:
|
|
154
|
+
- 当前安装的依赖库版本(`npm list <package>` 或 package.json 锁定版本)。
|
|
155
|
+
- 该版本中 Props、Events、Methods 的**确切列表**(对照 `node_modules/<package>/package.json` 的 exports/types 或官方文档)。
|
|
156
|
+
- 组件的默认布局方案(如:工具栏在顶部、边距 20px 等,与 spec 视觉契约一致)。
|
|
157
|
+
- **技术预研 (Spike)**:对核心依赖库 API 的实测结论(如:属性优先级、事件顺序、是否注入内联 style);预研中发现的坑(SSR、Mounted/Updated 时机、ResizeObserver 需求)及对策。
|
|
158
|
+
- **数据与状态流向**:`Props → Internal State → Library API → DOM` 的映射关系(可列表或简短描述)。
|
|
159
|
+
- **布局计算公式(若适用)**:关键尺寸计算逻辑,如:`DisplayWidth = Math.min(ContainerWidth, ContentWidth * Scale)`。
|
|
160
|
+
|
|
161
|
+
#### 内置 UI 控件清单(存在用户可感知交互时必填;纯展示无操作可写「无」并简述)
|
|
162
|
+
|
|
163
|
+
- [ ] **工具栏 / 操作区**:如 [按钮:导入]、[按钮:删除]、[按钮:绘制]…(与 spec 逐项对应)
|
|
164
|
+
- [ ] **交互反馈**:如 Loading、空态、错误提示、禁用态…
|
|
165
|
+
- [ ] **视觉对齐**:关键区域(如工具栏背景)映射至主题变量(**§三** 填具体变量名)
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 二、接口设计(Props / Events / Slots / Methods)
|
|
170
|
+
|
|
171
|
+
按 spec 中的「接口定义」列出,类型须使用 NASL 类型(nasl.core.String、Integer、Boolean 等),禁止 Object、any。支持**双向绑定**的 Props 需在组件内部变更时通过对应事件回写父组件,并在 api.ts 中标注。**表单类组件**(输入框、选择器、开关、日期选择等)的 value(或 spec 约定的“值”属性)必须支持双向绑定,详见 component/platform/form.md。
|
|
172
|
+
|
|
173
|
+
### Props
|
|
174
|
+
|
|
175
|
+
与**展示直接相关**的属性(如 data、options、config 等)须设**合理默认值**,确保未传入或传入空数据时也能正常渲染、不报错、不白屏(如空数组、空对象或占位内容)。**实现与验收时的默认值要求以此段为准**,§六 仅作勾选提醒。
|
|
176
|
+
|
|
177
|
+
| 属性 | 类型 | 默认值 | 双向绑定 | Setter | 说明 |
|
|
178
|
+
|------|------|--------|----------|--------|------|
|
|
179
|
+
| [属性名] | [nasl.core.xxx] | [默认] | 是/否 | [InputSetter/EnumSelectSetter 等] | [说明] |
|
|
180
|
+
|
|
181
|
+
### Events
|
|
182
|
+
|
|
183
|
+
| 事件名 | 回调参数 | 说明 |
|
|
184
|
+
|--------|----------|------|
|
|
185
|
+
| [如 onExport] | [如 event: { fileName: nasl.core.String }] | [触发时机] |
|
|
186
|
+
|
|
187
|
+
### Slots
|
|
188
|
+
|
|
189
|
+
| 插槽名 | 说明 |
|
|
190
|
+
|--------|------|
|
|
191
|
+
| [如 slotDefault、slotContent] | [用途] |
|
|
192
|
+
|
|
193
|
+
> **Methods 与内聚性**:优先通过**内置 UI**(按钮、工具栏等)触发组件内逻辑,保证功能在组件内可完整演示与验收。仅当能力**必须**由外部页面流程(如全局保存、路由级编排)驱动时,再定义为 `Method`;避免用 Method 替代本应在组件内完成的默认交互。
|
|
194
|
+
|
|
195
|
+
### Methods(若有)
|
|
196
|
+
|
|
197
|
+
| 方法名 | 参数 | 返回 | 说明 |
|
|
198
|
+
|--------|------|------|------|
|
|
199
|
+
| [如 exportPng] | [fileName?: string] | void | [用途] |
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## 三、样式与主题适配 (Style & Theme)
|
|
204
|
+
|
|
205
|
+
依据 `implementation-rules.md` 规则 4,必须明确组件内部 CSS 变量与平台全局主题变量的映射关系。**计划阶段必须在本节填表,不得推迟至实现阶段再决定。** 涉及 Canvas/WebGL/JS 绘图时,须在表中注明「渲染策略」:**CSS 渲染**(用于容器等,支持 var);**JS 渲染**(Canvas 等用绝对值,禁止将 var 传给绘图 API,见规则 4「例外:Canvas 与 JS 绘图」)。
|
|
206
|
+
|
|
207
|
+
| 组件 CSS 变量 | 映射的平台主题变量 | 默认值参考 | 渲染策略 | 说明 |
|
|
208
|
+
|:---|:---|:---|:---|:---|
|
|
209
|
+
| [如 --qr-code-color] | [如 --el-color-primary] | [如 #409eff] | CSS 渲染 | [用途说明] |
|
|
210
|
+
| [如 Canvas 背景] | — | [如 #ffffff] | **JS 渲染**(Canvas 专用,禁止变量) | [如:确保扫码识别率] |
|
|
211
|
+
|
|
212
|
+
> **注意**:Vue3 请参考 `platform/theme-variables-element-plus.md`,React 请参考 `platform/theme-variables-ant-design.md`;Vue2 等见 `platform/theme-variables-*.md`。禁止在组件内写死颜色、间距等魔法值。Canvas/JS 绘图须用绝对值或 getComputedStyle 取计算值,见 implementation-rules 规则 4「例外:Canvas 与 JS 绘图」。
|
|
213
|
+
|
|
214
|
+
### 样式隔离方式
|
|
215
|
+
|
|
216
|
+
依据 `workflow-guardrails.md` 规则 9,组件样式必须使用 `<style scoped>` 或 `<style module>`,禁止裸 `<style>`。内联 `:style` 仅用于运行时动态计算的值(如 Canvas 生成的 backgroundImage、由 prop 计算的宽高)。
|
|
217
|
+
|
|
218
|
+
| 样式类型 | 放置方式 | 示例 |
|
|
219
|
+
|:---|:---|:---|
|
|
220
|
+
| 静态布局(position/z-index/pointer-events 等) | `<style scoped>` | `.overlay { position: absolute; pointer-events: none; }` |
|
|
221
|
+
| 主题变量引用 | `<style scoped>` | `color: var(--el-color-primary)` |
|
|
222
|
+
| 运行时动态值 | 内联 `:style` | `:style="{ backgroundImage: url(${url}) }"` |
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 四、ideusage 配置要点
|
|
227
|
+
|
|
228
|
+
根据 idetype 填写必选配置,参考 `references/lcap-extension-component/ide/index.md` 及 **与当前 idetype 对应的文档**(如 ide/element.md、ide/container.md、ide/modal.md、ide/drawer.md、ide/popover.md 等),无需阅读该目录下全部文档。**插槽与 idetype 规则见 §一 · LCAP 必要产出**,本节只填具体配置项。
|
|
229
|
+
|
|
230
|
+
| 配置项 | 值 | 说明 |
|
|
231
|
+
|--------|-----|------|
|
|
232
|
+
| idetype | [element/container/...] | 组件类型 |
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 五、实现顺序
|
|
237
|
+
|
|
238
|
+
状态:`[ ]` 待执行 | `[>]` 执行中 | `[X]` 已完成
|
|
239
|
+
|
|
240
|
+
| 序号 | 状态 | 任务 | 依赖 | 验收标准 |
|
|
241
|
+
|------|------|------|------|----------|
|
|
242
|
+
| 1 | [ ] | 创建组件目录与骨架(组件文件、目录结构) | - | 文件路径符合项目约定 |
|
|
243
|
+
| 2 | [ ] | 编写 api.ts:Props、Events、Slots、Options 类 | 1 | 与 spec 接口定义一致,类型为 NASL |
|
|
244
|
+
| 3 | [ ] | 配置 ideusage(idetype、editable 等) | 2 | 符合 component/ide 规范 |
|
|
245
|
+
| 4 | [ ] | [功能点一:如 二维码生成与展示] | 2, 3 | [对应 spec 验收标准] |
|
|
246
|
+
| 5 | [ ] | [功能点二:如 PNG 导出] | 4 | [对应 spec 验收标准] |
|
|
247
|
+
| 6 | [ ] | 编写 block.stories | 4, 5 | 仅静态属性,无事件/外部绑定 |
|
|
248
|
+
| 7 | [ ] | 编写 example.stories 各功能 demo | 4, 5, 6 | 每个功能一个 story,与 spec 验收一一对应,供本地调试与 e2e |
|
|
249
|
+
| 8 | [ ] | 功能测试(Vitest + Playwright e2e) | 4, 5, 6, 7 | 见下方 **测试约定** |
|
|
250
|
+
| 9 | [ ] | 自检验收 | 8 | 对照 spec 与 plan.md 逐条通过 |
|
|
251
|
+
|
|
252
|
+
### 测试约定(权威说明)
|
|
253
|
+
|
|
254
|
+
以下为本计划在**测试策略与命令**上的唯一展开处;技术上下文表、§六 仅作引用。
|
|
255
|
+
|
|
256
|
+
- **单元 / 交互**:Vitest + @vue/test-utils;用例与 spec 验收对应;测试文件 `<组件目录>/__tests__/*.spec.ts`;`npm run test`。
|
|
257
|
+
- **端到端**:针对 **example.stories** 各功能 demo;**storyId**、Playwright 目录、端口与 `test:e2e`、脚手架约定、禁止事项等以 `commands/speckit.plan.md` 与 SKILL.md「Playwright e2e 测试规范」为准。
|
|
258
|
+
- **任务 8 完成标准**:Vitest 覆盖各功能;e2e 覆盖各 demo,`npm run test:e2e`(或工程脚本)通过;监听控制台报错并有断言。
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 六、验收检查清单
|
|
263
|
+
|
|
264
|
+
*提交前对照;与「规范门禁」互补(见门禁段首说明)。*
|
|
265
|
+
|
|
266
|
+
**接口与 api.ts**(细则 **§二**)
|
|
267
|
+
|
|
268
|
+
- [ ] api.ts 中 Props/Events/Slots 与 spec 一致;每项含描述、NASL 类型、默认值或示例
|
|
269
|
+
- [ ] 无 Object/any;双向绑定与 form.md 要求已落实
|
|
270
|
+
|
|
271
|
+
**组件实现(SKILL.md)**
|
|
272
|
+
|
|
273
|
+
- [ ] 展示类属性默认值与 **§二 · Props** 一致;表单类 value 双向绑定见 platform/form.md
|
|
274
|
+
- [ ] 根节点透传 **style、class、data-\***;插槽 EmptySlot 见 platform/slot.md(若适用)
|
|
275
|
+
- [ ] 样式使用全局主题变量(**§三**);内部图标为 SVG(`<svg>` / `<use>`)
|
|
276
|
+
|
|
277
|
+
**ideusage、stories、测试**
|
|
278
|
+
|
|
279
|
+
- [ ] ideusage 与 **§一 LCAP**、**§四** 一致
|
|
280
|
+
- [ ] block.stories、example.stories 符合 component/block.md;demo 与 spec 验收对应
|
|
281
|
+
- [ ] **§五 · 测试约定** 已满足;`npm run test` / `npm run test:e2e` 通过
|
|
282
|
+
|
|
283
|
+
**spec 与构建**
|
|
284
|
+
|
|
285
|
+
- [ ] spec 验收与注意事项已满足;`npm run build` 通过
|
|
286
|
+
|
|
287
|
+
**内聚与模块化**
|
|
288
|
+
|
|
289
|
+
- [ ] 交互由内置 UI 覆盖或已在 plan 中说明例外(与 **§一 · 内置 UI**、**§二 · Methods** 一致)
|
|
290
|
+
- [ ] `index.vue` / `index.tsx` 以组装为主;抽离路径与「文件路径与模块化规划」一致
|
|
291
|
+
|
|
292
|
+
**鲁棒性**
|
|
293
|
+
|
|
294
|
+
- [ ] **初始化**:空数据、加载中、加载失败的视觉表现已定义
|
|
295
|
+
- [ ] **尺寸**:容器从 0 到放大时可正常显示(不白屏、不溢出或已约定溢出规则)
|
|
296
|
+
- [ ] **样式**:与 **§三** 一致;不会被外部 CSS(如 `max-width`)意外破坏
|
|
297
|
+
- [ ] **性能**:频繁操作(Resize、连续缩放等)已做防抖或节流(若适用)
|
|
298
|
+
|
|
299
|
+
提交前可对照 `templates/component-self-check.md` 做最后一轮自检。
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# 对抗性自检报告:[组件名称]
|
|
2
|
+
|
|
3
|
+
- **自检时间**:[DATE]
|
|
4
|
+
- **组件目录**:[如 specs/xx-pdf-preview/ 或 src/components/pdf-preview]
|
|
5
|
+
- **自检范围**:api.ts、e2e、样式、plan.md
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一、接口与测试覆盖率矩阵 (API vs. Test Coverage)
|
|
10
|
+
|
|
11
|
+
| 类型 | 名称 | 是否有 e2e 覆盖 | 备注 |
|
|
12
|
+
|:---|:---|:---|:---|
|
|
13
|
+
| Prop | [如 fileUrl] | 是 / 否 | [若无覆盖则写:缺用例,建议补充 xxx] |
|
|
14
|
+
| Method | [如 zoomIn] | 是 / 否 | |
|
|
15
|
+
| Method | [如 zoomOut] | 是 / 否 | |
|
|
16
|
+
| Event | [如 onPageChange] | 是 / 否 | |
|
|
17
|
+
|
|
18
|
+
**本维度结论**:通过 / 不通过(待修复项见下方)
|
|
19
|
+
|
|
20
|
+
**待修复项**(若无则填「无」):
|
|
21
|
+
- [ ] [如:zoomIn/zoomOut 无测试覆盖] → 建议:[补充对应测试用例并断言关键可观测状态]
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 二、逻辑与样式冲突审计 (Logic-Style Conflict Audit)
|
|
26
|
+
|
|
27
|
+
| 逻辑描述 | 涉及属性/API | 可能冲突的 CSS | 冲突说明 | 结论 |
|
|
28
|
+
|:---|:---|:---|:---|:---|
|
|
29
|
+
| [如:scale 控制缩放] | [scale, transform] | [如 canvas 的 max-width: 100%] | [max-width 锁定宽度,scale 无法扩张] | 待修复 / 无冲突 |
|
|
30
|
+
|
|
31
|
+
**本维度结论**:通过 / 不通过(待修复项见下方)
|
|
32
|
+
|
|
33
|
+
**待修复项**(若无则填「无」):
|
|
34
|
+
- [ ] [如:canvas 的 max-width: 100% 压制缩放] → 建议:[改为 max-width: none 或由 JS 控制,并复测缩放]
|
|
35
|
+
|
|
36
|
+
### 样式隔离检查(Style Isolation Inspection)
|
|
37
|
+
|
|
38
|
+
| 检查项 | 当前状态 | 结论 |
|
|
39
|
+
|:---|:---|:---|
|
|
40
|
+
| 是否使用 `<style scoped>` 或 `<style module>` | [scoped / module / 裸 style] | 通过 / 待修复 |
|
|
41
|
+
| 内联 `:style` 是否仅含动态计算值 | [是 / 存在静态属性内联(如 position/pointer-events/z-index)] | 通过 / 待修复 |
|
|
42
|
+
| 是否存在为迁就 Vitest 而内联的静态样式 | [否 / 是(列出具体属性)] | 通过 / 待修复 |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 三、平台规范合规性扫描 (Platform Compliance Scan)
|
|
47
|
+
|
|
48
|
+
| 文件 | 位置(选择器/行) | 当前值 | 应替换为 | 状态 |
|
|
49
|
+
|:---|:---|:---|:---|:---|
|
|
50
|
+
| [如 PdfPreview.vue] | [.toolbar 或 行号] | [#f5f7fa] | [var(--el-fill-color-light)] | 待修复 / 已修复 |
|
|
51
|
+
|
|
52
|
+
**渲染引擎兼容性**:若组件涉及 Canvas/SVG 动态生成,传给绘图 API 的颜色须为**计算后的绝对值**,不得直接传入 `var(--*)` 字符串(见 implementation-rules 规则 4「例外:Canvas 与 JS 绘图」)。
|
|
53
|
+
|
|
54
|
+
| 检查项 | 动作 | 结论 |
|
|
55
|
+
|:---|:---|:---|
|
|
56
|
+
| **JS 绘图变量解析** | 检索 `canvas`、`ctx`、`qrcode` 等关键字,核对传入绘图 API 的颜色参数是否为绝对值 | 待修复 / 通过 |
|
|
57
|
+
|
|
58
|
+
**变量合法性校验**:组件内使用的 `var(--*)` 须在对应技术栈的 `platform/theme-variables-*.md` 中有定义;未在文档中出现的变量名记为待修复。
|
|
59
|
+
|
|
60
|
+
| 使用的变量 | 是否在 theme-variables-*.md 中定义 | 备注 |
|
|
61
|
+
|:---|:---|:---|
|
|
62
|
+
| [如 var(--el-fill-color-light)] | 是 / 否 | [若否:实际文档中为 --el-xxx,建议修正] |
|
|
63
|
+
|
|
64
|
+
**本维度结论**:通过 / 不通过(待修复项见下方)
|
|
65
|
+
|
|
66
|
+
**待修复项**(若无则填「无」):
|
|
67
|
+
- [ ] [如:background-color: #f5f7fa] → 建议:[替换为 var(--el-fill-color-light)]
|
|
68
|
+
- [ ] [如:var(--el-color-primary-light) 在 theme-variables 中未定义] → 建议:[改为文档中存在的变量名,如 --el-color-primary-light-3]
|
|
69
|
+
- [ ] [如:Canvas 绘图传入了 var(--el-xxx)] → 建议:[用 getComputedStyle 取计算值或改用绝对值,见 implementation-rules 规则 4 例外]
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 四、E2E 断言深度评估 (Assertion Depth Audit)
|
|
74
|
+
|
|
75
|
+
| 功能点 | 当前断言类型 | 是否满足 spec 验收 | 建议 |
|
|
76
|
+
|:---|:---|:---|:---|
|
|
77
|
+
| [如:缩放] | [存在性:toBeVisible()] | 否 | [补充 getBoundingClientRect 或 scale 状态断言] |
|
|
78
|
+
| [如:翻页] | [物理状态:数量/文本] | 是 | - |
|
|
79
|
+
|
|
80
|
+
### Vitest 职责越界检查(workflow-guardrails 规则 8)
|
|
81
|
+
|
|
82
|
+
| 检查项 | 当前状态 | 结论 |
|
|
83
|
+
|:---|:---|:---|
|
|
84
|
+
| Vitest 中是否使用 `getComputedStyle` | [否 / 是(列出位置)] | 通过 / 待修复 |
|
|
85
|
+
| Vitest 中是否断言 Canvas/SVG 渲染产出 | [否 / 是(如 toDataURL、data:image)] | 通过 / 待修复 |
|
|
86
|
+
| Vitest 中是否断言 offsetWidth/getBoundingClientRect | [否 / 是] | 通过 / 待修复 |
|
|
87
|
+
| Mock 是否仅用于防崩溃+验证参数(非伪造返回值) | [是 / 存在断言 mock 返回值] | 通过 / 待修复 |
|
|
88
|
+
| Vitest 中是否验证 CSS 渲染效果(定位/穿透/层叠) | [否 / 是] | 通过 / 待修复 |
|
|
89
|
+
|
|
90
|
+
**本维度结论**:通过 / 不通过(待修复项见下方)
|
|
91
|
+
|
|
92
|
+
**待修复项**(若无则填「无」):
|
|
93
|
+
- [ ] [如:缩放仅有 toBeVisible,未验证尺寸变化] → 建议:[补充对 canvas 宽高或 scale 的 expect]
|
|
94
|
+
- [ ] [如:Vitest 中使用了 getComputedStyle] → 建议:[改用 element.style.xxx 或移至 E2E]
|
|
95
|
+
|
|
96
|
+
**维度四动态验证说明**(若本维度修改了 e2e 用例):须在下文「测试运行证据」中体现 `test:e2e` 的复跑结果且为**通过**;工程须已配置 `test:e2e`(见 speckit.plan / `setup-extension-project.mjs`),否则先补齐再测。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 五、生命周期与资源清理审计 (Lifecycle & Cleanup Audit)
|
|
101
|
+
|
|
102
|
+
| 使用的 API/实例 | 是否在 onUnmounted/cleanup 中清理 | 结论 |
|
|
103
|
+
|:---|:---|:---|
|
|
104
|
+
| [如 ResizeObserver] | 是 / 否(缺 disconnect) | 待修复 / 通过 |
|
|
105
|
+
| [如 window.addEventListener] | 是 / 否(缺 removeEventListener) | 待修复 / 通过 |
|
|
106
|
+
| [如 PDF 实例 / pdfDoc.destroy()] | 是 / 否 | 待修复 / 通过 |
|
|
107
|
+
|
|
108
|
+
**本维度结论**:通过 / 不通过(待修复项见下方)
|
|
109
|
+
|
|
110
|
+
**待修复项**(若无则填「无」):
|
|
111
|
+
- [ ] [如:ResizeObserver 未在 onUnmounted 中 disconnect] → 建议:[在 onUnmounted 中调用 resizeObserver.disconnect()]
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 六、汇总与修复验证
|
|
116
|
+
|
|
117
|
+
### 测试运行证据(日志摘要,必填)
|
|
118
|
+
|
|
119
|
+
**说明**:须根据**实际在终端执行的命令**填写;**禁止**在未执行或未看到成功输出时勾选下方「通过」。可脱敏路径、token;日志可截断为关键行。
|
|
120
|
+
|
|
121
|
+
| 命令 | 是否执行 | 退出码 | 结果摘要 |
|
|
122
|
+
|:---|:---|:---|:---|
|
|
123
|
+
| `npm run test` | 是 / 未执行(说明原因) | [如 0] | [如 vitest: 12 passed;或失败时 1~2 行关键错误] |
|
|
124
|
+
| `npm run build` | 是 / 未执行 / 不适用 | [如 0] | [简述] |
|
|
125
|
+
| `npm run test:e2e` | 是 | [须为 0] | [须为通过摘要,如 playwright: N passed] |
|
|
126
|
+
|
|
127
|
+
**环境/配置问题排查记录**(若曾失败):简述现象 → 已采取的修复(端口、baseURL、启动 Storybook 等)→ **直至通过**。
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
**五维度通过情况**:
|
|
132
|
+
- 维度一(接口与覆盖率):通过 / 不通过
|
|
133
|
+
- 维度二(逻辑-样式冲突):通过 / 不通过
|
|
134
|
+
- 维度三(平台规范合规,含变量合法性):通过 / 不通过
|
|
135
|
+
- 维度四(E2E 断言深度):通过 / 不通过
|
|
136
|
+
- 维度五(生命周期与资源清理):通过 / 不通过
|
|
137
|
+
|
|
138
|
+
**待修复项清单**(合并上述所有待修复项,若无则填「无」):
|
|
139
|
+
1. [描述] → 文件/位置 → 建议
|
|
140
|
+
2. …
|
|
141
|
+
|
|
142
|
+
**修复后验证**(须与上表「测试运行证据」一致;**不得**仅勾选而无终端摘要):
|
|
143
|
+
- [ ] 已对上述待修复项**全部**修复并复检通过
|
|
144
|
+
- [ ] `npm run test`:已在终端执行且上表为**通过**摘要
|
|
145
|
+
- [ ] `npm run build`:已执行且上表为**通过**摘要(或本工程不适用已注明)
|
|
146
|
+
- [ ] `npm run test:e2e`:已在终端执行且上表为**通过**摘要
|
|
147
|
+
|
|
148
|
+
**自检闭环声明**:本报告提交时,五维度均为**通过**,上表三项命令均为成功输出,**无**未关闭待修复项。
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# 任务清单:[组件名称]
|
|
2
|
+
|
|
3
|
+
基于 [spec.md](../spec.md) 与 [plan.md](../plan.md)。
|
|
4
|
+
|
|
5
|
+
**进度**:0 / N 已完成
|
|
6
|
+
|
|
7
|
+
<!-- 状态说明:[ ] 待执行 | [>] 执行中 | [X] 已完成 -->
|
|
8
|
+
|
|
9
|
+
**产出路径约定**:凡涉及文件的「产出」须使用 **相对扩展工程根** 的完整路径(与 `plan.md`「文档与源码产出」及 **「文件路径与模块化规划」** 表一致),例如 `src/components/<组件目录 kebab>/api.ts`、`…/composables/useXxx.ts`。**禁止**仅写文件名;多文件可列多条。**必须在此路径**类表述与 `/speckit.tasks`、`/speckit.implement` 命令中的说明一致。模式 C(增量修改)时,产出路径须标注操作类型:`(新增)` 或 `(修改)`。
|
|
10
|
+
|
|
11
|
+
**代码质量验收(适用时写入各任务「验收」)**:
|
|
12
|
+
|
|
13
|
+
- [ ] `index.vue` / `index.tsx` **仅**含模板与 UI 组装、必要编排;**非**所有业务逻辑的实现处;复杂逻辑已在 `composables/`、`utils/` 等 **plan.md 已规划路径**
|
|
14
|
+
- [ ] 产出文件路径与 `plan.md`「文件路径与模块化规划」**完全一致**(无擅自改目录)
|
|
15
|
+
- [ ] 与 spec 对应的交互由**内置 UI** 可触达(或与 plan 已声明的插槽/Method 边界一致)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 任务列表
|
|
20
|
+
|
|
21
|
+
### 任务 0:技术原型验证(可选,涉及三方库或复杂布局时建议必做)
|
|
22
|
+
|
|
23
|
+
- **状态**:[ ]
|
|
24
|
+
- **描述**:在正式编码前验证技术路径可行性(如:最小 Demo 验证三方库的缩放/渲染 API、ResizeObserver 行为)。
|
|
25
|
+
- **依赖**:无
|
|
26
|
+
- **产出**:预研结论或可运行的最小示例(可放在临时脚本或 `src/components/<组件目录>/` 下可删除的 spike 文件,路径仍须写明);风险与对策记录到 plan.md 的「技术架构方案」。
|
|
27
|
+
- **验收**:
|
|
28
|
+
- [ ] 核心 API 行为已实测并记录
|
|
29
|
+
- [ ] 已知坑与对策已写入计划
|
|
30
|
+
- **备注**:
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
### 任务 1:[任务标题]
|
|
35
|
+
|
|
36
|
+
- **状态**:[ ]
|
|
37
|
+
- **描述**:[任务描述,如:在现有骨架中完善 NASL 定义、实现 xxx 功能。]
|
|
38
|
+
- **依赖**:无
|
|
39
|
+
- **产出**(路径必填,示例):
|
|
40
|
+
- `src/components/<组件目录 kebab>/api.ts`(**必须在此路径**)(新增 / 修改)
|
|
41
|
+
- **验收**:
|
|
42
|
+
- [ ] [验收标准一,对应 spec]
|
|
43
|
+
- [ ] [验收标准二;涉及 DOM/尺寸/弹窗时宜含**可观测的 DOM 状态**,如:某元素的 clientWidth、可见性等]
|
|
44
|
+
- [ ] (适用时)见文首「代码质量验收」
|
|
45
|
+
- **备注**:[执行中遇到的问题或决策记录,无则留空]
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
### 任务 2:[任务标题]
|
|
50
|
+
|
|
51
|
+
- **状态**:[ ]
|
|
52
|
+
- **描述**:[任务描述。]
|
|
53
|
+
- **依赖**:任务 1
|
|
54
|
+
- **产出**(路径必填,示例):
|
|
55
|
+
- `src/components/<组件目录 kebab>/index.vue`(**必须在此路径**;React 则为 `index.tsx`)
|
|
56
|
+
- `src/components/<组件目录 kebab>/utils/foo.ts`(若本任务新增工具文件)
|
|
57
|
+
- **验收**:
|
|
58
|
+
- [ ] [验收标准一]
|
|
59
|
+
- [ ] (适用时)见文首「代码质量验收」
|
|
60
|
+
- **备注**:[执行中遇到的问题或决策记录,无则留空]
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### 可选:环境兼容性验收
|
|
65
|
+
|
|
66
|
+
- **状态**:[ ]
|
|
67
|
+
- **描述**:对不同容器尺寸、关键浏览器或分辨率做专项验收(复杂组件建议做)。
|
|
68
|
+
- **依赖**:功能任务与 e2e 均已完成
|
|
69
|
+
- **验收**:
|
|
70
|
+
- [ ] 小容器(如 320px 宽)下无白屏/错位
|
|
71
|
+
- [ ] 大容器下无溢出或已按 spec 约定处理
|
|
72
|
+
- **备注**:
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
<!-- 按 plan.md 的「实现顺序」继续添加任务,每项任务对应一个实现步骤。涉及 stories / e2e / 单测时,产出中须分别写明,例如:
|
|
77
|
+
- src/components/<组件目录>/stories/block.stories.tsx
|
|
78
|
+
- src/components/<组件目录>/stories/example.stories.tsx
|
|
79
|
+
- e2e/workshop-floor-plan.spec.ts
|
|
80
|
+
- src/components/<组件目录>/index.spec.ts
|
|
81
|
+
-->
|