Skip to content

refactor(steps): v15 #3216

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 20 commits into from
May 17, 2025
Merged

refactor(steps): v15 #3216

merged 20 commits into from
May 17, 2025

Conversation

irisSong
Copy link
Collaborator

@irisSong irisSong commented May 2, 2025

…nto feat_v3.x

🤔 这个变动的性质是?

  • 新特性提交
  • 日常 bug 修复
  • 站点、文档改进
  • 演示代码改进
  • 组件样式/交互改进
  • TypeScript 定义更新
  • 包体积优化
  • 性能优化
  • 功能增强
  • 国际化改进
  • 重构
  • 代码风格优化
  • 测试用例
  • 分支合并
  • 其他改动(是关于什么的改动?)

🔗 相关 Issue

💡 需求背景和解决方案

☑️ 请求合并前的自查清单

⚠️ 请自检并全部勾选全部选项⚠️

  • 文档已补充或无须补充
  • 代码演示已提供或无须提供
  • TypeScript 定义已补充或无须补充
  • fork仓库代码是否为最新避免文件冲突
  • Files changed 没有 package.json lock 等无关文件

Summary by CodeRabbit

  • 新功能

    • 步骤条组件支持更多布局和样式:新增横向/纵向、单/双行、文本/点/图标类型、状态(default/business/dynamic/enhanced)、自定义步数和图标,支持点击事件。
    • 步骤条演示 Demo 全面重构,展示多种布局、状态与交互方式,增加动态交互和多样化数据驱动示例。
    • 步骤条组件内部逻辑优化,提升渲染性能和状态管理。
  • 文档

    • 步骤条组件文档全面升级,详细说明新增属性、类型、主题变量及多样化用法示例,支持中英文及繁体中文。
    • 示例代码引用路径更新,更加清晰和一致。
  • 样式

    • 步骤条 SCSS 重构,优化结构,支持多布局和状态,提升视觉一致性和可维护性。
    • 主题变量重命名和扩充,支持更丰富的自定义,新增多种状态和布局相关变量。
  • 测试

    • 步骤条组件测试用例扩展,覆盖更多属性、状态和交互场景,提升稳定性和可靠性。

Copy link

coderabbitai bot commented May 2, 2025

## Walkthrough

本次更新对步骤条(Steps)组件进行了大规模重构,涵盖了样式(SCSS)、类型定义、组件实现、文档和演示示例。样式部分重写并细化了水平与垂直布局、不同状态与类型(文本、点、图标)的样式变量与结构。类型定义引入了更严格的字符串字面量类型和属性约束。组件实现移除了旧的 `dot` 属性,新增了 `status``type``layout``icon` 等属性,类名生成也更加细致。文档和演示同步更新,展示了更多布局、状态和类型的组合用法,并详细列举了新的属性和主题变量。

## Changes

| 文件/分组                                                         | 变更摘要 |
|-------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| src/packages/step/step.scss<br>src/packages/steps/steps.scss      | 步骤条样式重构,细化水平/垂直布局、状态、类型的样式,移除旧的 `.dot`、RTL 等遗留样式,统一命名和结构。 |
| src/packages/step/step.tsx<br>src/packages/step/step.taro.tsx     | Step 组件重构,使用 hooks 优化状态、类名、渲染逻辑,支持 type/status/layout 等新属性,移除 dot 相关逻辑。 |
| src/packages/steps/steps.tsx<br>src/packages/steps/steps.taro.tsx | Steps 组件默认属性新增 layout/type/status/icon,类名生成更细致,移除 dot 相关逻辑和类名。 |
| src/types/spec/steps/base.ts                                      | 新增并细化类型别名(如 StepStatus、StepType、StepLayout 等),BaseStep/BaseSteps 接口属性调整,移除 dot,direction 改为字面量类型。 |
| src/packages/steps/__tests__/steps.spec.tsx                       | 测试用例重构,覆盖更多属性组合和行为,结构更清晰,增加多类型/状态/布局的测试。 |
| src/packages/steps/demo.*.ts(x) <br>src/packages/steps/demos/**   | 演示组件重构,支持多种状态、类型、布局的组合,采用数据驱动,增加交互和多组展示,移除旧的 dot 示例。 |
| src/packages/steps/doc*.md                                        | 文档重写,属性表和主题变量全面更新,移除 dot,新增 status/type/layout/icon/onStepClick 等属性,CSS 变量大幅扩展和细化。 |
| src/styles/variables.scss<br>src/styles/variables-jmapp.scss      | 步骤条相关 SCSS 变量重组,移除旧变量,新增并细化多种状态、类型、布局的样式变量。 |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
  participant User
  participant Steps
  participant Step

  User->>Steps: 传入 props(status, type, layout, icon, count, value, onStepClick 等)
  Steps->>Step: 传递 context(type, status, value, icon, onStepClick)
  Step->>Step: 计算 currentStatus/useMemo 渲染 head/content
  User-->>Step: 点击 Step
  Step->>Steps: 触发 onStepClick(带当前 step value)

Suggested reviewers

  • Alex-huxiyang

Poem

小兔敲键跳三行,
步骤条焕新妆。
横竖变幻多类型,
状态切换色彩亮。
变量细分齐上阵,
组件结构更清爽。
前端同伴快来赏!

(_/)
( •_•)
/ >🌟


<!-- walkthrough_end -->

<!-- announcements_start -->

> [!NOTE]
> <details>
> <summary>⚡️ AI Code Reviews for VS Code, Cursor, Windsurf</summary>
> 
> CodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback.
> Learn more [here](http://coderabbit.ai/ide).
> 
> </details>

---

> [!NOTE]
> <details>
> <summary>⚡️ Faster reviews with caching</summary>
> 
> CodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 16th. To opt out, configure `Review - Disable Cache` at either the organization or repository level. If you prefer to disable all data retention across your organization, simply turn off the `Data Retention` setting under your Organization Settings.
> Enjoy the performance boost—your workflow just got faster.
> 
> </details>

<!-- announcements_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=jdf2e/nutui-react&utm_content=3216):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@github-actions github-actions bot added 3.x Target branch 3.x action:review This PR needs more reviews (less than 2 approvals) labels May 2, 2025
Copy link

codecov bot commented May 2, 2025

Codecov Report

Attention: Patch coverage is 97.95918% with 2 lines in your changes missing coverage. Please review.

Project coverage is 86.84%. Comparing base (9499ec7) to head (560759e).
Report is 5 commits behind head on feat_v3.x.

Files with missing lines Patch % Lines
src/packages/step/step.tsx 98.63% 1 Missing ⚠️
src/packages/steps/steps.tsx 96.00% 1 Missing ⚠️
Additional details and impacted files
@@              Coverage Diff              @@
##           feat_v3.x    #3216      +/-   ##
=============================================
+ Coverage      86.70%   86.84%   +0.13%     
=============================================
  Files            291      291              
  Lines          19062    19205     +143     
  Branches        2891     2918      +27     
=============================================
+ Hits           16528    16678     +150     
+ Misses          2529     2522       -7     
  Partials           5        5              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

🧹 Nitpick comments (14)
src/packages/steps/demos/h5/demo8.tsx (2)

5-26: 数据定义中存在描述文本重复和错别字问题

数据数组中第二项和第三项的描述文本都是"购买下单",这可能会使用户混淆。另外,第四项"服务屡约"疑似存在错别字,应该是"服务履约"。

建议修改如下:

    {
      value: 3,
-      description: '购买下单',
+      description: '支付成功',
    },
    {
      value: 4,
-      description: '服务屡约',
+      description: '服务履约',
    },

69-71: 建议优化用户体验

按钮交互良好,但建议考虑添加当前状态指示,让用户知道当前处于哪一步,尤其是当步骤较多时。

- <Button type="primary" size="small" onClick={handleStep}>
+ <Button type="primary" size="small" onClick={handleStep}>
+   下一步 ({val}/5)
</Button>
src/packages/steps/demos/taro/demo3.tsx (1)

111-113: 考虑添加按钮状态指示

按钮实现功能正确,但建议添加当前步骤指示,以提高用户体验。

- <Button size="small" type="danger" onClick={() => handleStep()}>
+ <Button size="small" type="danger" onClick={() => handleStep()}>
+   下一步 ({val}/3)
  </Button>
src/packages/steps/demos/taro/demo9.tsx (1)

83-85: 按钮功能实现良好

下一步按钮正确实现了步骤值的循环更新,代码逻辑清晰。建议考虑添加当前步骤指示。

- <Button type="primary" size="small" onClick={handleStep}>
+ <Button type="primary" size="small" onClick={handleStep}>
+   下一步 ({value}/3)
  </Button>
src/packages/steps/demos/taro/demo1.tsx (2)

25-27: 建议优化步骤切换逻辑

当前步骤切换逻辑是硬编码的数字4,建议使用data.length替代,以便更灵活地适应数据变化。

- const newVal = (val % 4) + 1
+ const newVal = (val % data.length) + 1

30-91: 考虑重构相似代码块

在三个Cell中,Steps组件的结构和用法非常相似,只是状态和数据切片不同。可以考虑将这些相似代码块提取为一个函数或组件,减少重复代码。

+ const renderStepsGroup = (dataSlice, useValue = false) => {
+   const value = useValue ? val : 2;
+   return (
+     <Space direction="vertical">
+       <Steps value={value} status="default">
+         {dataSlice.map((item, index) => (
+           <Step key={index} value={item.value} title={item.title} />
+         ))}
+       </Steps>
+       <Steps value={value} status="business">
+         {dataSlice.map((item, index) => (
+           <Step key={index} value={item.value} title={item.title} />
+         ))}
+       </Steps>
+       <Steps value={value} status="dynamic">
+         {dataSlice.map((item, index) => (
+           <Step key={index} value={item.value} title={item.title} />
+         ))}
+       </Steps>
+       {useValue && (
+         <Steps value={value} status="enhanced">
+           {dataSlice.map((item, index) => (
+             <Step key={index} value={item.value} title={item.title} />
+           ))}
+         </Steps>
+       )}
+     </Space>
+   );
+ };

  return (
    <>
      <Cell>
-        <Space direction="vertical">
-          <Steps value={2} status="default">
-            {data.slice(0, 2).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={2} status="business">
-            {data.slice(0, 2).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={2} status="dynamic">
-            {data.slice(0, 2).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-        </Space>
+        {renderStepsGroup(data.slice(0, 2))}
      </Cell>
      <Cell>
-        <Space direction="vertical">
-          <Steps value={2} status="default">
-            {data.slice(0, 3).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={2} status="business">
-            {data.slice(0, 3).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={2} status="dynamic">
-            {data.slice(0, 3).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-        </Space>
+        {renderStepsGroup(data.slice(0, 3))}
      </Cell>
      <Cell>
-        <Space direction="vertical">
-          <Steps value={val} status="default">
-            {data.map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={val} status="business">
-            {data.map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={val} status="dynamic">
-            {data.map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={val} status="enhanced">
-            {data.map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-        </Space>
+        {renderStepsGroup(data, true)}
      </Cell>
src/packages/steps/steps.tsx (1)

14-14: 未使用的属性

icon属性在默认值中定义,但在当前组件实现中未被直接使用。如果该属性仅用于子组件,建议添加相关注释说明。

 value: 0,
-icon: null,
+// icon: 传递给Step子组件使用的图标
+icon: null,
src/packages/steps/demos/taro/demo2.tsx (3)

29-32: 建议优化步骤切换逻辑

当前步骤切换逻辑是硬编码的数字5,建议使用data.length替代,以便更灵活地适应数据变化。

- const newVal = (val % 5) + 1
+ const newVal = (val % data.length) + 1

54-90: 图标类型Steps的多种实现方式

此部分展示了两种设置图标的方式:

  1. 在Steps组件上设置通用图标(56-77行)
  2. 在每个Step组件上单独设置图标(79-88行)

这两种实现方式都是有效的,但在同一个示例中使用不同方式可能会造成一些混淆。

为保持一致性,建议统一使用一种方式设置图标,或者添加注释说明两种方式的区别和应用场景。


36-109: 考虑重构相似代码块

在三个Cell中,Steps组件的结构和用法非常相似,只是类型和数据切片不同。可以考虑将这些相似代码块提取为一个函数或组件,减少重复代码。

+ const renderStepsGroup = (
+   type = undefined,
+   icon = undefined,
+   stepIcon = false
+ ) => {
+   return (
+     <Space direction="vertical" style={{ width: '100%' }}>
+       <Steps 
+         value={2} 
+         status="business" 
+         type={type} 
+         layout="double"
+         icon={!stepIcon ? icon : undefined}
+       >
+         {data.slice(0, 3).map((item, index) => (
+           <Step 
+             key={index} 
+             value={item.value} 
+             title={item.title}
+             icon={stepIcon ? icon : undefined} 
+           />
+         ))}
+       </Steps>
+       <Steps 
+         value={2} 
+         status="dynamic" 
+         type={type} 
+         layout="double"
+         icon={!stepIcon ? icon : undefined}
+       >
+         {data.slice(0, 4).map((item, index) => (
+           <Step 
+             key={index} 
+             value={item.value} 
+             title={item.title}
+             icon={stepIcon ? icon : undefined}
+           />
+         ))}
+       </Steps>
+       <Steps 
+         value={val} 
+         status="enhanced" 
+         type={type} 
+         layout="double"
+         icon={!stepIcon ? icon : undefined}
+       >
+         {data.map((item, index) => (
+           <Step 
+             key={index} 
+             value={item.value} 
+             title={item.title}
+             icon={stepIcon ? icon : undefined}
+           />
+         ))}
+       </Steps>
+     </Space>
+   )
+ }

  return (
    <Space direction="vertical">
      <Cell>
-        <Space direction="vertical" style={{ width: '100%' }}>
-          <Steps value={2} status="business" type="dot" layout="double">
-            {data.slice(0, 3).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={2} status="dynamic" type="dot" layout="double">
-            {data.slice(0, 4).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={val} status="enhanced" type="dot" layout="double">
-            {data.map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-        </Space>
+        {renderStepsGroup("dot")}
      </Cell>
      <Cell>
-        <Space direction="vertical" style={{ width: '100%' }}>
-          <Steps
-            value={2}
-            status="business"
-            type="icon"
-            layout="double"
-            icon={<Check />}
-          >
-            {data.slice(0, 3).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps
-            value={2}
-            status="dynamic"
-            type="icon"
-            layout="double"
-            icon={<Check />}
-          >
-            {data.slice(0, 4).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-
-          <Steps value={val} status="enhanced" type="icon" layout="double">
-            {data.map((item, index) => (
-              <Step
-                key={index}
-                value={item.value}
-                title={item.title}
-                icon={<Check />}
-              />
-            ))}
-          </Steps>
-        </Space>
+        {renderStepsGroup("icon", <Check />, true)}
      </Cell>
      <Cell>
-        <Space direction="vertical" style={{ width: '100%' }}>
-          <Steps value={2} status="business" layout="double">
-            {data.slice(0, 3).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={2} status="dynamic" layout="double">
-            {data.slice(0, 4).map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-          <Steps value={val} status="enhanced" layout="double">
-            {data.map((item, index) => (
-              <Step key={index} value={item.value} title={item.title} />
-            ))}
-          </Steps>
-        </Space>
+        {renderStepsGroup()}
      </Cell>
src/packages/steps/demos/h5/demo9.tsx (2)

8-9: 建议优化步骤切换逻辑

当前步骤切换逻辑是硬编码的数字3,建议使用更灵活的方式,如获取Steps子组件的数量。

- const newVal = (value % 3) + 1
+ // 假设存在一个方式获取步骤总数
+ const stepsCount = 3 // 理想情况下应动态获取
+ const newVal = (value % stepsCount) + 1

26-31: 描述中使用JSX片段的优化方案

多处使用JSX片段作为描述,特别是包含时间信息的部分。这种方式虽然有效,但考虑到多处重复使用相似结构,可以提取为一个工具函数或组件以减少重复代码。

+ // 在组件外部或文件顶部定义
+ const StepDescription = ({ content, time }) => (
+   <>
+     <p>{content}</p>
+     {time && <p className="description-time">{time}</p>}
+   </>
+ )

  // 使用示例
  <Step
    type="icon"
    value={2}
    title="待取件"
    description={
-     <>
-       <p>
-         你的订单已由【深圳市福田区福华路京东快递自
-         提点】上架完成,请上门自提
-       </p>
-       <p className="description-time">2025-01-20 07:12:30</p>
-     </>
+     <StepDescription 
+       content="你的订单已由【深圳市福田区福华路京东快递自提点】上架完成,请上门自提" 
+       time="2025-01-20 07:12:30" 
+     />
    }
    icon={<WaitReceive />}
  />

Also applies to: 41-43, 56-59, 68-71

src/packages/steps/doc.zh-TW.md (1)

93-99: 文档示例缺少 “dynamic” 与 “enhanced” 说明

新增的 status="dynamic" | "enhanced" 在 Props 表格中已有列出,但示例与描述部分未给出对应 demo,可能导致使用者不清楚两者区别,建议补充示例代码或文字说明。

src/packages/step/step.scss (1)

11-17: 头部样式存在重复定位声明

在第12行和第16行都声明了position: relative;,建议删除其中一个以避免冗余。

  &-head {
    position: relative;
    display: flex;
    align-items: center;
    height: $steps-base-head-height;
-    position: relative;
    z-index: 1;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e84f671 and 153299a.

📒 Files selected for processing (34)
  • src/packages/step/step.scss (1 hunks)
  • src/packages/step/step.taro.tsx (1 hunks)
  • src/packages/step/step.tsx (2 hunks)
  • src/packages/steps/__tests__/steps.spec.tsx (1 hunks)
  • src/packages/steps/demo.taro.tsx (1 hunks)
  • src/packages/steps/demo.tsx (1 hunks)
  • src/packages/steps/demos/h5/demo1.tsx (1 hunks)
  • src/packages/steps/demos/h5/demo2.tsx (1 hunks)
  • src/packages/steps/demos/h5/demo3.tsx (1 hunks)
  • src/packages/steps/demos/h5/demo4.tsx (2 hunks)
  • src/packages/steps/demos/h5/demo5.tsx (1 hunks)
  • src/packages/steps/demos/h5/demo6.tsx (1 hunks)
  • src/packages/steps/demos/h5/demo7.tsx (1 hunks)
  • src/packages/steps/demos/h5/demo8.tsx (1 hunks)
  • src/packages/steps/demos/h5/demo9.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo1.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo2.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo3.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo4.tsx (2 hunks)
  • src/packages/steps/demos/taro/demo5.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo6.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo7.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo8.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo9.tsx (1 hunks)
  • src/packages/steps/doc.en-US.md (3 hunks)
  • src/packages/steps/doc.md (3 hunks)
  • src/packages/steps/doc.taro.md (3 hunks)
  • src/packages/steps/doc.zh-TW.md (3 hunks)
  • src/packages/steps/steps.scss (1 hunks)
  • src/packages/steps/steps.taro.tsx (2 hunks)
  • src/packages/steps/steps.tsx (2 hunks)
  • src/styles/variables-jmapp.scss (1 hunks)
  • src/styles/variables.scss (2 hunks)
  • src/types/spec/steps/base.ts (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (4)
src/packages/steps/demos/taro/demo4.tsx (2)
src/packages/steps/steps.taro.tsx (1)
  • Steps (17-58)
src/packages/step/step.taro.tsx (1)
  • Step (20-120)
src/packages/steps/demos/taro/demo6.tsx (2)
src/packages/steps/steps.taro.tsx (1)
  • Steps (17-58)
src/packages/step/step.taro.tsx (1)
  • Step (20-120)
src/packages/steps/steps.tsx (1)
src/types/spec/steps/h5.ts (1)
  • WebStepsProps (4-4)
src/packages/step/step.tsx (2)
src/packages/step/step.taro.tsx (1)
  • Step (20-120)
src/types/spec/steps/base.ts (1)
  • StepStatus (4-4)
🪛 GitHub Check: codecov/patch
src/packages/step/step.tsx

[warning] 89-89: src/packages/step/step.tsx#L89
Added line #L89 was not covered by tests

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: test
🔇 Additional comments (125)
src/styles/variables-jmapp.scss (1)

1302-1305: 变量命名与使用方式符合规范

添加的SCSS变量$steps-base-head-size使用了合适的CSS变量作为值,并使用了!default标记,这符合项目的样式变量定义模式。此变量将用于Steps组件的头部大小设置,是Steps组件重构的一部分。

src/packages/steps/demos/h5/demo4.tsx (3)

2-2: 正确引入Cell组件

Cell组件的引入符合组件嵌套的结构需求,有助于统一布局展示。


25-31: 使用Cell组件包装Steps结构提升了布局一致性

使用Cell组件包装Steps结构是一个很好的改进,使演示更加规范化,与其他演示例子保持一致的布局结构。


33-36: 按钮样式简化与统一

按钮直接使用size="small"属性,移除了多余的包装容器,使代码更简洁清晰。

src/packages/steps/demos/taro/demo4.tsx (3)

2-8: 导入结构优化

导入结构更有组织性,Cell组件的添加符合新的布局结构要求。


31-37: 使用Cell组件优化结构布局

使用Cell组件包装Steps结构,保持了H5和Taro示例的一致性,提升了代码的可维护性。


40-42: 按钮样式简化

按钮样式简化,直接使用size属性,移除了冗余的包装容器,与H5示例保持一致。

src/packages/steps/demos/h5/demo6.tsx (2)

2-2: 导入简化,移除不必要的依赖

移除了ConfigProvider,简化了导入,只保留了必要的组件。


7-13: 使用新的API重构Steps组件

代码更新反映了Steps组件API的重大改变:

  1. 使用type="icon"代替了原来的dot属性
  2. 添加了新的layout="double"status="enhanced"属性
  3. 第一个Step明确使用type="dot"
  4. 图标实现简化,直接使用Transit组件
  5. 更新了步骤标题为更符合业务逻辑的文案

这些变更与整体重构方向一致,更好地展示了组件的新特性。

src/packages/steps/demos/taro/demo6.tsx (2)

2-2: 导入改为更聚焦的组件引用

导入更新以包含Cell组件,同时保持了必要的Steps和Step导入,提高了代码的组织性。


7-13: 良好地使用了新的Steps组件API

这个演示很好地展示了Steps组件的新特性:

  1. 使用了type="icon"替代了旧的dot属性
  2. 添加了layout="double"status="enhanced"属性来增强视觉效果
  3. 第一个Step特别指定了type="dot",而其他Step使用了图标
  4. 使用Cell组件作为容器,提供了更一致的布局

这些变更符合Steps组件的整体重构方向,展示了更灵活的配置选项。

src/packages/steps/demos/taro/demo8.tsx (5)

1-2: 增强了导入以支持更复杂的交互

导入了useState以支持状态管理,同时添加了Button、Space和Cell组件以支持更丰富的布局和交互功能。


5-26: 结构化数据模型优化了Steps的渲染

创建了一个包含步骤信息的数据数组,每个步骤包含值和描述,这种方法:

  1. 提高了代码的可维护性
  2. 简化了Steps的动态渲染
  3. 使添加或修改步骤变得更加容易

数据结构清晰,命名规范。


27-31: 添加了状态管理和步骤控制逻辑

使用useState管理当前步骤值,并实现了循环增加步骤的处理函数,使演示更具交互性。


34-68: 优雅地展示了三种不同状态类型的Steps

使用Space组件创建了并排布局,展示三种不同状态类型的Steps:

  1. status="business"
  2. status="dynamic"
  3. status="enhanced"

这种并排比较方式有效地展示了不同状态的视觉差异,同时所有Steps共享相同的数据和当前值,便于对比。


69-71: 添加了交互控制按钮

添加了一个按钮来控制步骤切换,增强了演示的交互性,使用户可以直观地看到不同步骤状态下各种样式的变化。

src/packages/steps/demos/taro/demo5.tsx (4)

1-2: 更新了组件导入以支持新的布局

导入了Image、Cell和Space组件,以支持更丰富的布局和内容展示。


4-17: 创建了结构化的数据模型

使用数组对象结构定义了步骤数据,包含标题和图标URL,这种方式:

  1. 使代码更具可维护性
  2. 简化了步骤的动态渲染
  3. 清晰地分离了数据和展示逻辑

数据结构清晰,包含城市/地点名称和相应的图标。


21-37: 展示了带居中布局的图标步骤条

使用Space和Cell组件创建了垂直布局,第一个Cell通过样式设置了居中对齐,展示了带有自定义图标的Steps,很好地展示了type="icon"的功能。


38-49: 展示了双层布局的图标步骤条

第二个Cell展示了使用layout="double"属性的Steps,与上面的默认布局形成对比,清晰地演示了不同布局选项的视觉效果。

src/packages/steps/demos/h5/demo5.tsx (4)

1-2: 更新了组件导入以支持新的布局

导入了Image、Cell和Space组件,以支持更丰富的布局和内容展示,与Taro版本保持一致。


4-17: 创建了结构化的数据模型

使用数组对象结构定义了步骤数据,包含标题和图标URL,与Taro版本保持了一致的数据结构和命名。


21-37: 展示了带居中布局的图标步骤条

使用Space和Cell组件创建了垂直布局,第一个Cell通过样式设置了居中对齐,展示了带有自定义图标的Steps,与Taro版本保持一致的实现方式。


38-49: 展示了双层布局的图标步骤条

第二个Cell展示了使用layout="double"属性的Steps,与上面的默认布局形成对比,清晰地演示了不同布局选项的视觉效果,与Taro版本保持一致。

src/packages/steps/demos/h5/demo8.tsx (1)

36-66: 完善垂直状态步骤条示例

这个示例很好地展示了不同状态的垂直步骤条,但可以考虑增加更多交互说明来帮助用户理解各种状态的区别和适用场景。

src/packages/steps/demos/taro/demo3.tsx (3)

27-29: 良好的步骤点击事件处理

步骤点击事件处理函数实现正确,能够正确记录用户点击的步骤值。


33-65: 良好的状态对比展示

这个部分很好地展示了不同状态(default、business、dynamic)的步骤条样式,并且使用了相同的数据源,便于直观比较差异。


98-107: 交互式增强步骤条实现良好

增强状态的步骤条添加了点击事件处理,提供了更好的交互体验。代码实现完善。

src/packages/steps/demo.tsx (2)

16-24: 翻译键名更新更具描述性

更新后的翻译键名(如'horizontalTwoLine'、'horizontalIcon'等)比原来的更具描述性,更清晰地表达了每个演示的布局和特点。


51-69: 演示顺序优化合理

演示布局顺序的调整很合理,从基础的左右布局到复杂的混合布局,再到自定义和垂直布局,形成了清晰的学习路径。CSS类的简化也使代码更加整洁。

src/packages/steps/demos/h5/demo1.tsx (6)

2-2: 数据驱动结构重构得很好

将步骤数据抽象为数组结构,使组件更具可复用性和可维护性。数据与UI分离的模式符合React最佳实践。

Also applies to: 5-22


23-27: 状态管理实现合理

使用useState钩子管理步骤状态,并通过取模运算实现步骤循环,实现方式简洁明了。


30-48: 布局结构清晰,展示完整

使用Cell和Space组件进行垂直布局,并通过slice方法展示不同数量的步骤,形成了良好的演示层次。展示了status="default"、"business"和"dynamic"的效果,帮助用户直观理解各种状态的视觉差异。


49-67: 不同步骤数量的展示案例

通过slice(0, 3)展示了3步骤的情况,与2步骤形成对比,帮助用户了解不同步骤数量的展示效果。这种渐进式的示例结构非常有助于用户理解组件的适用场景。


68-91: 动态步骤展示实现完善

将val状态绑定到Steps的value属性,实现了动态步骤变化。同时展示了所有四种status类型,包括新增的"enhanced"状态,全面覆盖了组件的功能特性。


92-94: 交互控件设计合理

按钮大小设置为small并使用danger类型,视觉上更加突出,能够清晰地指示用户交互位置。通过简洁的onClick处理函数实现步骤切换。

src/packages/steps/demos/taro/demo7.tsx (5)

1-3: 导入结构清晰完整

正确导入了所需组件,包括Steps、Step核心组件和辅助布局组件Cell、Space。同时引入了Location图标组件用于步骤标识,符合Taro项目的引入规范。


6-27: 数据结构设计合理

数据对象包含value、title和icon属性,结构完整且统一。每个步骤使用相同的Location图标保持了视觉一致性,是图标类型步骤条的良好实践。


28-32: 状态管理实现简洁

使用React useState管理当前步骤,初始值设为2。handleStep函数通过取模运算实现1-4的循环切换,逻辑清晰简洁。


35-78: 组件结构层次分明

使用Cell和Space组件构建垂直布局,展示了四种不同配置的Steps:

  1. 默认状态的2步骤
  2. 商业状态的3步骤
  3. 动态状态的全部步骤(绑定val状态)
  4. 增强状态的全部步骤(绑定val状态)

通过type="icon"属性统一设置图标类型,结构清晰,覆盖了多种使用场景。


80-82: 交互控件位置合理

按钮位于Steps组展示区域下方,size="small"和type="danger"属性使其在视觉上更加突出。功能明确,点击后通过handleStep函数更新当前步骤值。

src/packages/steps/demos/h5/demo3.tsx (6)

2-2: 导入结构完整

正确导入了所需的组件,包括Steps、Step核心组件和辅助布局组件Space、Cell,符合组件库的使用规范。


5-21: 数据结构设计合理

数据对象包含value、title和description属性,结构完整且统一。description属性的加入展示了Steps组件支持详细描述的能力,增强了信息展示的完整性。


22-29: 状态管理和事件处理完善

使用React useState钩子管理当前步骤状态,初始值为2。

  1. handleStep函数实现步骤循环切换
  2. 新增handleClickStep函数处理步骤点击事件,展示了组件的交互能力

32-65: 第一组Steps展示结构清晰

第一个Cell中展示了2步骤的三种状态类型:

  1. default状态
  2. business状态
  3. dynamic状态

通过统一的数据切片方式(slice(0, 2))保持了结构的一致性,便于用户对比不同状态的视觉效果。


66-109: 第二组Steps展示功能完整

第二个Cell中展示了完整步骤的四种状态类型:

  1. default状态
  2. business状态
  3. dynamic状态
  4. enhanced状态

所有Steps绑定val状态实现动态变化,最后一个Steps添加了onStepClick事件处理,展示了组件的交互能力。结构层次清晰,功能展示完整。


111-113: 交互控件设计合理

按钮位置独立于内容区域,使用size="small"和type="danger"属性使其在视觉上更加突出。功能明确,点击后通过handleStep函数更新当前步骤值。

src/packages/steps/demos/h5/demo7.tsx (5)

1-3: 导入结构清晰完整

正确导入了所需组件,包括Steps、Step核心组件和辅助布局组件Cell、Space。同时引入了Location图标组件用于步骤标识,符合H5项目的引入规范。


6-27: 数据结构设计合理

数据对象包含value、title和icon属性,结构完整且统一。每个步骤使用相同的Location图标保持了视觉一致性,是图标类型步骤条的良好实践。地点名称的选择很好地匹配了Location图标的语义。


28-32: 状态管理实现简洁

使用React useState钩子管理当前步骤,初始值设为2。handleStep函数通过(val % 4) + 1的计算方式实现1-4的循环切换,逻辑清晰简洁。


35-78: 组件结构层次分明

使用Cell和Space组件构建垂直布局,展示了四种不同配置的Steps:

  1. 默认状态的2步骤
  2. 商业状态的3步骤
  3. 动态状态的全部步骤(绑定val状态)
  4. 增强状态的全部步骤(绑定val状态)

通过type="icon"属性统一设置图标类型,多种status属性展示了不同的视觉效果,结构清晰,覆盖了多种使用场景。


80-82: 交互控件位置合理

按钮位于Steps组展示区域下方,size="small"和type="danger"属性使其在视觉上更加突出。功能明确,点击后通过handleStep函数更新当前步骤值,实现了动态演示效果。

src/packages/steps/demos/taro/demo1.tsx (5)

5-22: 数据结构定义清晰且完整

数据结构设计合理,每个步骤包含了值和标题,为组件提供了良好的数据支持。


30-48: 组件结构清晰,展示了多种状态

使用Cell和Space进行布局结构清晰,展示了Steps组件的多种状态变化(default、business、dynamic),代码组织良好。


49-67: 展示了不同步骤数量的应用场景

此部分展示了3步流程的多种状态,继续保持了良好的代码组织结构。


68-91: 完整展示了所有状态类型

此部分完整展示了所有4个步骤和全部状态类型,包括额外的"enhanced"状态,结构完善。


92-94: 按钮样式和功能合理

按钮样式和功能设计合理,提供了良好的交互体验。

src/packages/steps/steps.tsx (3)

7-15: 默认属性定义完善

新增了layouttypestatusicon的默认值,使组件配置更加灵活和完整。默认值选择合理,符合组件使用场景。


21-32: 属性解构顺序合理

属性解构的顺序经过重新调整,包含了新增的属性,使得代码结构更加清晰。


38-50: 类名生成逻辑优化

类名生成逻辑得到了显著扩展,现在动态包含了基于方向、子元素数量、布局、类型和状态的修饰符,替代了之前仅有的单个条件类。这种改进支持了更详细的样式变体,增强了组件的灵活性。

src/packages/steps/demos/taro/demo2.tsx (3)

6-27: 数据结构定义清晰

数据结构设计合理,每个步骤包含了值和标题,为组件提供了良好的数据支持,步骤数量适当增加到5个。


34-53: 展示了不同类型和布局的Steps组件

此部分展示了带有点状标记(dot)和双列布局(double)的Steps组件,展示了多种状态(business, dynamic, enhanced),结构清晰。


91-109: 未指定类型的Steps组件展示

此部分展示了未指定类型(默认为text类型)的Steps组件,与前面的示例形成对比,有助于用户理解不同类型的视觉效果差异。

src/packages/steps/demos/h5/demo9.tsx (3)

1-10: 状态管理和交互逻辑清晰

使用useState跟踪当前步骤值,并通过handleStep函数在步骤之间循环切换,交互逻辑清晰。


13-48: 垂直布局Steps的丰富展示

使用垂直布局展示不同类型的步骤,结合丰富的图标和复杂的描述内容,很好地展示了组件的灵活性。
使用了适当的类型组合,包括dot和icon类型,并有动态状态。


49-82: 不同状态的Steps展示

展示了enhanced状态的Steps,并使用了丰富的图标和描述,呈现了良好的视觉层次结构。
时间信息的展示使用了专门的类名,有助于统一样式。

src/packages/steps/demos/h5/demo2.tsx (6)

6-27: 数据结构清晰且易于扩展

数据数组的结构设计得当,每个步骤包含 value 和 title 属性,便于动态渲染不同数量的步骤。这种数据驱动的方式使组件更加灵活,适应性更强。


28-32: 状态管理实现良好

使用 useState 来管理当前步骤值,并通过 handleStep 函数实现步骤的循环切换,逻辑清晰。


34-53: 组件布局结构清晰

使用 Space 和 Cell 组件嵌套创建了良好的布局结构,同时展示了 business/dynamic/enhanced 三种不同状态下的 dot 类型步骤条,代码组织有序。


54-90: 图标类型示例实现完整

此代码段展示了带图标的步骤条,同时演示了两种不同的图标传递方式:全局传递图标和单独为每个步骤设置图标。这对于用户理解图标使用方式非常有帮助。


91-109: 默认类型示例清晰

展示了默认文本类型的步骤条在不同状态下的表现,保持了与前两个示例的一致性和完整性,使整个演示更加系统。


111-113: 交互控制按钮设计合理

添加了类型为 danger 的小型按钮用于控制步骤切换,并清晰地标明了"下一步"功能,增强了演示的交互性。

src/packages/steps/steps.taro.tsx (3)

8-14: 默认属性配置合理

为组件添加了新的默认属性(layout, type, status, icon),并移除了旧的 dot 属性,使API更加清晰和一致。默认值设置合理,符合常见使用场景。


22-32: 属性解构得当

属性解构顺序调整合理,新增加的属性(count, layout, status, type)位置适当,保持了代码的可读性。


42-47: 类名生成逻辑优化

类名生成逻辑得到了增强,动态包含基于方向、子元素数量、布局、类型和状态的修饰符,替换了之前的静态 dot 类。这样的设计提供了更细粒度的样式控制能力。

src/packages/steps/steps.scss (5)

6-56: 水平布局基础样式结构完善

水平布局样式结构清晰,包含了头部、图标、标题等元素的样式定义,并针对不同流程状态(process、wait、finish)设置了对应的样式变量。样式嵌套合理,便于维护。


58-99: 单行布局样式设计合理

单行布局(single)样式定义完整,包括内边距、线条位置和特殊情况处理。针对不同数量的步骤(如三步)提供了特殊处理,增强了布局的灵活性。


101-179: 双行布局样式实现全面

双行布局(double)样式实现全面,使用了 flex 布局实现步骤间的均匀分布,并对头部、线条、图标等元素进行了精细调整。同时针对不同类型(icon、dot、text)提供了对应的高度调整,确保视觉一致性。


182-311: 垂直布局样式结构完善

垂直布局样式设计全面,包括内边距、线条、头部等元素的样式定义。针对不同类型(icon、dot、text)提供了对应的宽度和线条位置调整,保证了垂直方向的视觉协调性。


313-333: 增强状态样式定义明确

增强状态(enhanced)下的样式定义清晰,针对已完成步骤提供了特殊的背景色和图标颜色定义,增强了视觉区分度。

src/packages/steps/demo.taro.tsx (5)

19-28: 翻译键名优化

中文翻译键名更新为更具描述性的命名,如"横版左右布局1行文案"、"横版上下布局点状、icon、文案"等,使键名更直观地反映了组件的实际展示效果。


30-39: 繁体中文翻译同步更新

繁体中文翻译也相应进行了更新,保持了与简体中文的一致性,确保多语言支持的完整性。


41-50: 英文翻译更新得当

英文翻译也进行了相应更新,内容清晰表达了各个演示的特点,如"Horizontal 1-line text layout"、"Horizontal dot, icon, text layout"等。


55-69: 演示布局结构优化

ScrollView 的类名简化了,并根据环境添加条件类名。演示的顺序和分组更加合理,使用户更容易理解各种布局方式的区别。


77-81: 垂直布局演示组织合理

垂直布局的演示部分组织合理,清晰区分了普通垂直点状和混合点状+图标的两种情况。

src/packages/steps/__tests__/steps.spec.tsx (1)

151-170: vi.fn() 在 Jest 环境下不可用,请显式区分测试框架

当前仓库既引入了 @testing-library/jest-dom 又使用 vi.fn()。如果测试框架切换为 Jest,vi 不存在将导致用例崩溃。建议:

-    const handleClickStep = vi.fn()
+    // 兼容 vitest / jest
+    const handleClickStep = (typeof vi !== 'undefined' ? vi.fn() : jest.fn())

或者在文件顶部统一按框架导入/声明。

src/types/spec/steps/base.ts (3)

4-9: 类型定义完善,提高类型安全性

引入了多个类型别名来约束步骤条相关属性的值范围,这有助于提高代码的类型安全性和开发效率。使用字符串字面量类型代替泛型字符串类型是一个很好的实践。


15-15: 为BaseStep增加了必要的type属性

将type属性添加到BaseStep接口中,与组件重构方向一致,使类型定义更加完整。


19-25: BaseSteps接口属性扩展合理

用新的强类型属性替换了旧的dot布尔属性,增加了status、count、type、layout、icon等属性,使组件更加灵活和可定制。这些变更与整体重构方向一致,提供了更丰富的配置选项。

src/packages/step/step.tsx (9)

1-6: 引入React hooks优化组件性能

引入useMemo和useCallback钩子函数可以避免不必要的重新计算和函数重建,优化了组件性能。


10-10: 更新导入以使用严格类型定义

从类型定义文件中导入StepStatus类型,增强了代码的类型安全性。


23-35: 属性解构和默认值设置更加清晰

使用对象解构和默认值合并的方式处理组件属性,代码结构清晰易读。将type作为第一个解构的属性也体现了它在新API中的重要性。


38-44: 从上下文获取父组件属性

正确使用了Context API获取父组件传递的数据,简化了组件间通信。


46-52: 使用useMemo优化状态计算逻辑

通过useMemo缓存状态计算结果,避免不必要的重复计算。状态逻辑清晰,考虑了特殊状态和默认状态处理。


54-56: 使用useCallback优化事件处理函数

通过useCallback缓存点击事件处理函数,只有当依赖项变化时才会重新创建,提高了性能。


60-73: 类名生成逻辑优化

使用useMemo缓存类名计算结果,根据当前状态、类型和是否有描述动态生成类名,实现了更精细的样式控制。


93-105: 内容渲染逻辑模块化

将内容渲染逻辑提取为独立的useMemo函数,只有在有标题或描述时才渲染内容,避免了不必要的DOM节点创建。


108-118: 渲染结构优化

使用缓存的类名和渲染函数构建组件DOM结构,代码结构清晰。点击事件绑定正确,样式类名命名规范。

src/packages/step/step.scss (13)

1-9: 布局结构优化

使用relative定位和flex布局优化了步骤条的结构,并正确处理了最后一个步骤的线条隐藏逻辑。


19-35: 头部文本和图标样式规范化

为文本和图标元素设置了一致的尺寸、背景色和文字颜色,使用了变量提高了可定制性。图标样式设置合理,使用白色作为默认文字颜色。


37-41: 点状头部样式优化

为点状头部设置了合适的尺寸和背景色,使用变量便于主题定制。


43-52: 统一头部元素样式

将点状、图标和文本头部的共同样式提取出来,统一设置为flex布局并居中对齐,添加了圆角和边框样式。这种做法减少了代码重复,提高了维护性。


55-67: 线条样式重构

将线条改为绝对定位的flex容器,增加了inner元素用于实际显示线条,提高了布局的灵活性和可控性。


70-76: 主体内容布局优化

简化了主体内容的样式,使用flex布局和最小高度确保了内容的一致性和灵活性。


78-82: 设置背景色提高可读性

为线条、标题和描述设置白色背景,确保它们在不同背景下都有良好的可读性。


84-96: 标题样式规范化

为标题设置了固定高度、行高和字体大小,添加了溢出处理逻辑,确保长文本能够正确显示。


98-105: 描述样式规范化

为描述文本设置了高度、行高、边距和字体样式,添加了溢出处理,确保长文本能够正确显示。


107-118: 进行中状态样式优化

为进行中状态的头部元素设置了特定的背景色和文字颜色,样式结构清晰。


120-127: 等待状态样式优化

为等待状态的图标设置了特定的颜色,保持了样式的一致性。


129-136: 完成状态样式优化

为完成状态的图标设置了特定的颜色,保持了样式的一致性。


138-166: 业务状态样式完善

为业务状态添加了全面的样式覆盖,包括文本颜色、标题颜色、描述颜色和头部样式等,使业务状态有明显的视觉差异。

src/packages/steps/doc.md (7)

13-43: 示例分类更加明确

将示例代码按照布局方式和内容类型重新组织,命名更加清晰,帮助用户更好地理解和使用组件。示例引用文件也相应更新。


45-59: 补充混合布局示例

添加了横向上下布局混合使用点状和图标的示例,以及自定义图标的示例,展示了组件的灵活性。


61-67: 自定义步骤条示例

添加了自定义步骤条的示例,展示了组件的高度可定制性。


69-83: 竖向布局示例完善

新增了竖向点状和竖向混合两种布局示例,使文档更加完整。


93-98: 属性文档更新,反映API变更

移除了已废弃的dot属性,新增了status、count、type、layout和icon属性的说明,使文档与代码实现保持一致。


106-110: Step组件属性文档更新

更新了title和description属性的类型为ReactNode,增加了type属性的说明,使文档与代码实现保持一致。


120-169: 主题变量文档全面更新

大幅扩展了CSS变量列表,详细说明了各种状态、布局和元素的样式变量,方便用户进行主题定制。变量命名规范,描述清晰。

src/packages/steps/doc.en-US.md (4)

89-98: Props 部分更新正确
Steps 组件属性已从 current 重命名为 value,并新增了 statuscounttypelayouticononStepClick 等字段,文档已同步更新。


104-111: Step 子组件 Props 正确
Step 子组件的 titledescription 类型已升级为 ReactNode,并引入了统一的 type,文档同步。


118-170: Theming 部分完整
CSS 变量列表已全面覆盖所有新的样式变量,名称、默认值与更新后的 SCSS 对应一致。


13-81:

✅ Verification successful

检查 Demo 引用一致性
请确认所有 Demo 标题和 <CodeBlock src='h5/demoX.tsx'> 路径与实际文件结构一致,确保 h5 目录下存在对应的 demo 文件。


🏁 Script executed:

#!/bin/bash
# 验证所有 demo 源文件路径是否存在
for file in demo{1,3,7,2,6,5,4,8,9}.tsx; do
  if [ ! -f src/packages/steps/demos/h5/$file ]; then
    echo "Missing demo file: src/packages/steps/demos/h5/$file"
  fi
done

Length of output: 872


验证通过:Demo 文件引用一致
已在 src/packages/steps/demos/h5 目录下确认存在 demo1.tsx、demo3.tsx、demo7.tsx、demo2.tsx、demo6.tsx、demo5.tsx、demo4.tsx、demo8.tsx、demo9.tsx,与文档中 <CodeBlock src='h5/demoX.tsx'> 的引用保持一致,无需修改。

src/packages/steps/doc.taro.md (3)

89-98: Props 部分更新正确
Steps 组件属性与 EN 版保持一致,文档已同步,Taro 和 H5 行为一致。


104-111: Step 子组件 Props 正确
与 EN 版一致,类型与默认值描述齐全。


118-170: Theming 部分完整
CSS 变量列表与 EN 版保持一致,已覆盖所有主题定制。

Comment on lines 19 to 80
/>
<Step
type="icon"
value={2}
title="待取件"
description={
<>
<p>
你的订单已由【深圳市福田区福华路京东快递自
提点】上架完成,请上门自提
</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<WaitReceive />}
/>
<Step
type="icon"
value={3}
title="运输中"
description={
<>
<p>订单在【淮安分拣中心】完成分拣</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<PickedUp />}
/>
</Steps>
</Cell>
<Cell>
<Steps direction="vertical" value={value} type="icon" status="enhanced">
<Step
type="icon"
value={3}
title="待安装 工程师已接单"
description={
<>
<p>已分配工程师 XXX 为您服务,联系电话 15112786087</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<Service />}
/>
<Step
type="icon"
value={2}
title="已签收"
description={
<>
<p>京东快递 · 您的订单派送完成,已由家人签收</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<Check />}
/>
<Step
type="dot"
value={1}
title="京东总部大厦B座"
description="京小东 136 **** 8618"
/>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

步骤值顺序与状态更新逻辑不一致

在第二个Steps组件中,步骤值按3、2、1的顺序定义,但状态更新逻辑是按1、2、3循环。这可能导致用户点击"下一步"时,状态变化与展示顺序不一致,造成混淆。

建议保持一致的步骤值顺序,修改第二个Steps组件的顺序,或者调整状态更新逻辑:

<Steps direction="vertical" value={value} type="icon" status="enhanced">
  <Step
    type="icon"
-    value={3}
+    value={1}
    title="待安装  工程师已接单"
    description={
      <>
        <p>已分配工程师 XXX 为您服务,联系电话 15112786087</p>
        <p className="description-time">2025-01-20 07:12:30</p>
      </>
    }
    icon={<Service />}
  />
  <Step
    type="icon"
-    value={2}
+    value={2}
    title="已签收"
    description={
      <>
        <p>京东快递 · 您的订单派送完成,已由家人签收</p>
        <p className="description-time">2025-01-20 07:12:30</p>
      </>
    }
    icon={<Check />}
  />
  <Step
    type="dot"
-    value={1}
+    value={3}
    title="京东总部大厦B座"
    description="京小东 136 **** 8618"
  />
</Steps>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
/>
<Step
type="icon"
value={2}
title="待取件"
description={
<>
<p>
你的订单已由【深圳市福田区福华路京东快递自
提点】上架完成,请上门自提
</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<WaitReceive />}
/>
<Step
type="icon"
value={3}
title="运输中"
description={
<>
<p>订单在【淮安分拣中心】完成分拣</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<PickedUp />}
/>
</Steps>
</Cell>
<Cell>
<Steps direction="vertical" value={value} type="icon" status="enhanced">
<Step
type="icon"
value={3}
title="待安装 工程师已接单"
description={
<>
<p>已分配工程师 XXX 为您服务,联系电话 15112786087</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<Service />}
/>
<Step
type="icon"
value={2}
title="已签收"
description={
<>
<p>京东快递 · 您的订单派送完成,已由家人签收</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<Check />}
/>
<Step
type="dot"
value={1}
title="京东总部大厦B座"
description="京小东 136 **** 8618"
/>
<Cell>
<Steps direction="vertical" value={value} type="icon" status="enhanced">
<Step
type="icon"
value={1}
title="待安装 工程师已接单"
description={
<>
<p>已分配工程师 XXX 为您服务,联系电话 15112786087</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<Service />}
/>
<Step
type="icon"
value={2}
title="已签收"
description={
<>
<p>京东快递 · 您的订单派送完成,已由家人签收</p>
<p className="description-time">2025-01-20 07:12:30</p>
</>
}
icon={<Check />}
/>
<Step
type="dot"
value={3}
title="京东总部大厦B座"
description="京小东 136 **** 8618"
/>
</Steps>
</Cell>

Comment on lines 71 to +75
<View className="h2">{translated.customIcon}</View>
<Demo7 />
<Demo5 />

<View className="h2">{translated.customIcon}</View>
<Demo4 />
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

发现重复的标题

在第71行和第74行都使用了相同的翻译键 customIcon,导致页面上会出现两个相同的标题但展示不同的 Demo 组件(Demo5 和 Demo4)。这会让用户感到困惑。

建议修改第74行的翻译键,使用一个新的唯一键名:

-<View className="h2">{translated.customIcon}</View>
+<View className="h2">{translated.horizontalDouble}</View>

同时,确保在翻译对象中有对应的键值对。

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<View className="h2">{translated.customIcon}</View>
<Demo7 />
<Demo5 />
<View className="h2">{translated.customIcon}</View>
<Demo4 />
<View className="h2">{translated.customIcon}</View>
<Demo5 />
<View className="h2">{translated.horizontalDouble}</View>
<Demo4 />

Comment on lines +75 to +91
// 头部渲染
const renderHeadType = useMemo(() => {
switch (type || parentType) {
case 'text':
return <View className={`${classPrefix}-head-text`}>{value}</View>
case 'dot':
return <View className={`${classPrefix}-head-dot`} />
case 'icon':
return (
<View className={`${classPrefix}-head-icon`}>
{icon || parentIcon}
</View>
)
default:
return null
}
if (!dot && !icon) {
return `${classPrefix}-icon is-text`
}
return `${classPrefix}-icon`
}
}, [type, value, icon])
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

renderHeadType 依赖不完整,父级变更无法反映

useMemo 只依赖 type | value | icon,但实际渲染还用到了 parentTypeparentIcon。当父组件动态修改这两个属性时,子组件无法及时更新,出现“旧头像”或“旧类型”的问题。

-  }, [type, value, icon])
+  }, [type, parentType, value, icon, parentIcon])
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// 头部渲染
const renderHeadType = useMemo(() => {
switch (type || parentType) {
case 'text':
return <View className={`${classPrefix}-head-text`}>{value}</View>
case 'dot':
return <View className={`${classPrefix}-head-dot`} />
case 'icon':
return (
<View className={`${classPrefix}-head-icon`}>
{icon || parentIcon}
</View>
)
default:
return null
}
if (!dot && !icon) {
return `${classPrefix}-icon is-text`
}
return `${classPrefix}-icon`
}
}, [type, value, icon])
// 头部渲染
const renderHeadType = useMemo(() => {
switch (type || parentType) {
case 'text':
return <View className={`${classPrefix}-head-text`}>{value}</View>
case 'dot':
return <View className={`${classPrefix}-head-dot`} />
case 'icon':
return (
<View className={`${classPrefix}-head-icon`}>
{icon || parentIcon}
</View>
)
default:
return null
}
}, [type, parentType, value, icon, parentIcon])

Comment on lines +1267 to +1274
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

移除重复:Process 边框颜色
$steps-process-head-border-color 重复定义了两次,建议删除冗余的第二处,保持一处声明。

- $steps-process-head-border-color: var(
-   --nutui-steps-base-head-border-color,
-   $color-border
- ) !default;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;

Comment on lines +1213 to +1216
$steps-base-head-size: var(
--nutui-steps-base-icon-size,
$font-size-xxs
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

修复变量名:基础头部尺寸
使用了错误的 CSS 变量 --nutui-steps-base-icon-size,应为 --nutui-steps-base-head-size

-$steps-base-head-size: var(
-  --nutui-steps-base-icon-size,
-  $font-size-xxs
-) !default;
+$steps-base-head-size: var(
+  --nutui-steps-base-head-size,
+  $font-size-xxs
+) !default;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
$steps-base-head-size: var(
--nutui-steps-base-icon-size,
$font-size-xxs
) !default;
$steps-base-head-size: var(
--nutui-steps-base-head-size,
$font-size-xxs
) !default;

Comment on lines +1234 to 1237
$steps-vertical-head-icon-size: var(
--nutui-steps-vertical-item-icon-size,
20px
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

修复变量名:垂直布局图标尺寸
引用了错误的 --nutui-steps-vertical-item-icon-size,文档应使用 --nutui-steps-vertical-head-icon-size

-$steps-vertical-head-icon-size: var(
-  --nutui-steps-vertical-item-icon-size,
-  20px
-) !default;
+$steps-vertical-head-icon-size: var(
+  --nutui-steps-vertical-head-icon-size,
+  20px
+) !default;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
$steps-vertical-head-icon-size: var(
--nutui-steps-vertical-item-icon-size,
20px
) !default;
$steps-vertical-head-icon-size: var(
--nutui-steps-vertical-head-icon-size,
20px
) !default;

Comment on lines +1251 to 1254
$steps-base-description-margin-top: var(
--nutui-steps-base-title-margin-bottom,
10px
2px
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

修复变量名:描述上边距
当前引用 --nutui-steps-base-title-margin-bottom 不正确,应为 --nutui-steps-base-description-margin-top

-$steps-base-description-margin-top: var(
-  --nutui-steps-base-title-margin-bottom,
-  2px
-) !default;
+$steps-base-description-margin-top: var(
+  --nutui-steps-base-description-margin-top,
+  2px
+) !default;

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

♻️ Duplicate comments (4)
src/packages/step/step.taro.tsx (1)

66-82: 🛠️ Refactor suggestion

头部渲染逻辑依赖数组不完整

虽然逻辑本身是良好的,但依赖数组仍然缺少parentTypeparentIcon,当父组件这些属性变化时,组件不会重新渲染。

-  }, [type, value, icon])
+  }, [type, parentType, value, icon, parentIcon, classPrefix])
src/packages/step/step.tsx (3)

46-52: 🛠️ Refactor suggestion

当前状态计算逻辑优化,但依赖数组不完整

使用useMemo优化状态计算,但缺少对status的依赖,可能导致当父组件状态更改时未重新计算。

-  }, [value, parentValue])
+  }, [value, parentValue, status])

60-72: 🛠️ Refactor suggestion

使用useMemo计算className,但依赖数组不完整

虽然使用useMemo优化了类名计算,但依赖数组缺少description,可能导致描述文本变化时未重新计算类名。

-    [currentStatus, type, className]
+    [currentStatus, type, description, className, classPrefix]

75-91: 🛠️ Refactor suggestion

头部渲染逻辑优化,但测试覆盖不完整

使用useMemo优化了头部渲染,但依赖数组不完整,且默认分支(第89行)缺少测试覆盖。

建议:

  1. 完善依赖数组
  2. 添加测试用例覆盖默认分支
-  }, [type, value, icon])
+  }, [type, parentType, value, icon, parentIcon, classPrefix])
🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 89-89: src/packages/step/step.tsx#L89
Added line #L89 was not covered by tests

🧹 Nitpick comments (9)
src/packages/step/step.scss (9)

11-16: 移除重复的定位声明
&-head 中在行 13 已声明 position: relative,第 16 行又重复声明一次,建议删去多余那行,以减少冗余。


19-24: 统一文本头部尺寸与样式
.nut-step-head-text 通过变量定义了高度、宽度、背景色、文字色和字体大小,风格一致。可考虑为这些值增加主题覆盖变量,以便在多种主题下灵活调整。


27-34: 图标头部样式可扩展性
.nut-step-head-icon 使用基础尺寸和默认背景,内部 .nut-icon 强制白色。若将来需要图标反色,建议允许通过外部类或变量覆盖 .nut-icon color


43-52: 复用头部元素公共样式
&-dot, &-icon, &-text 的弹性居中、圆角、边框等属性抽取到一处,提升了样式复用性。建议将 border-radius: 50% 提取为变量以增强主题可配置性。


62-66: 连线内层伸展与背景
&-inner 使用 flex: 1、固定高度和背景色变量,有效撑满父容器。建议补充 width: 100% 以防父容器未定义宽度时出现水平收缩。


89-94: 标题文本溢出处理
通过固定高度、overflow:hiddenwhite-space:nowrap 避免溢出,但未加省略号提示。建议补充 text-overflow: ellipsis; 以改善用户体验。


97-103: 描述文本溢出与多行支持
.nut-step-description 限高并隐藏溢出,符合文本长度可控场景;若需多行省略,可考虑使用 -webkit-line-clamp 等方案提升灵活性。


119-124: 等待状态配色是否完整
.nut-step-wait 仅修改了图标颜色,若需要同样对 .nut-step-head-text.nut-step-head-dot 等元素做灰度或等待提示,应同步处理。


137-163: 业务模式样式可精简
.nut-step-business 针对文本、标题、描述、点、图标等均做了单独配置,建议将共用背景色 $steps-business-head-background-color 上提到根级 .nut-step-business,减少重复并提升可读性:

&.nut-step-business {
+  background-color: $steps-business-head-background-color;
  .nut-step-head-icon,
  .nut-step-head-text {
-    background-color: $steps-business-head-background-color;
  }
  // ...
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f39a420 and b685923.

📒 Files selected for processing (9)
  • src/packages/step/step.scss (1 hunks)
  • src/packages/step/step.taro.tsx (1 hunks)
  • src/packages/step/step.tsx (2 hunks)
  • src/packages/steps/demos/h5/demo3.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo3.tsx (1 hunks)
  • src/packages/steps/steps.scss (1 hunks)
  • src/packages/steps/steps.taro.tsx (2 hunks)
  • src/packages/steps/steps.tsx (2 hunks)
  • src/types/spec/steps/base.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/packages/steps/demos/taro/demo3.tsx
  • src/packages/steps/steps.scss
  • src/types/spec/steps/base.ts
  • src/packages/steps/demos/h5/demo3.tsx
🧰 Additional context used
🧬 Code Graph Analysis (4)
src/packages/steps/steps.tsx (1)
src/packages/steps/steps.taro.tsx (1)
  • Steps (17-67)
src/packages/steps/steps.taro.tsx (2)
src/types/spec/steps/taro.ts (1)
  • TaroStepsProps (4-4)
src/packages/steps/steps.tsx (1)
  • Steps (17-67)
src/packages/step/step.taro.tsx (3)
src/types/spec/steps/taro.ts (1)
  • TaroStepProps (3-3)
src/packages/step/step.tsx (1)
  • Step (20-120)
src/types/spec/steps/base.ts (1)
  • StepStatus (4-4)
src/packages/step/step.tsx (2)
src/packages/step/step.taro.tsx (1)
  • Step (20-111)
src/types/spec/steps/base.ts (1)
  • StepStatus (4-4)
🪛 GitHub Check: codecov/patch
src/packages/steps/steps.tsx

[warning] 62-62: src/packages/steps/steps.tsx#L62
Added line #L62 was not covered by tests

src/packages/step/step.tsx

[warning] 89-89: src/packages/step/step.tsx#L89
Added line #L89 was not covered by tests

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: test
🔇 Additional comments (26)
src/packages/steps/steps.tsx (3)

10-14: 新增了更丰富的默认配置属性

添加了更多默认属性配置,包括layouttypestatusicon,丰富了组件的可配置性。


22-30: 更新了属性解构,支持了更多的配置项

属性解构顺序更符合逻辑,将value属性放在新增的布局属性之前。


41-46: 增强了className生成逻辑

新增了基于子元素数量、布局类型、显示类型和状态的动态类名生成,使样式更加灵活和可定制。

src/packages/steps/steps.taro.tsx (4)

10-14: 新增了更丰富的默认配置属性

添加了更多默认属性配置,包括layouttypestatusicon,与Web版本保持一致,确保了跨平台一致性。


22-30: 更新了属性解构,支持了更多的配置项

与Web版本保持一致的属性解构顺序,确保了代码的一致性和可维护性。


41-46: 增强了className生成逻辑

新增了基于子元素数量、布局类型、显示类型和状态的动态类名生成,与Web版本保持一致的类名生成逻辑。


53-63: 优化了子组件渲染逻辑

使用React.Children.map迭代子组件,并为最后一个子组件添加特殊类名,与Web版本实现一致的子组件处理机制。

src/packages/step/step.taro.tsx (6)

1-6: 优化导入结构,增加React Hooks支持

更新了导入结构,增加了对React Hooks的支持,包括useCallbackuseMemo等,提高了组件性能。


11-11: 更新了类型定义引用

从使用通用类型转换为使用Taro专用类型TaroStepProps,改善了类型安全性。


22-26: 优化了属性解构

解构了更多属性,提高了代码可读性和结构性。


37-43: 当前状态计算逻辑优化

使用useMemo优化状态计算,考虑父组件的status值,判断逻辑更加完整。

注意:虽然将status添加到依赖数组是好的改进,但在parentStatus变化时依然应该重新计算状态。


51-64: 使用useMemo计算className,但依赖数组较为完整

添加了descriptionclassPrefix到依赖数组,这是对先前审查意见的良好修复。


98-109: 更新了JSX结构和样式引用

优化了组件结构,使用了计算好的类名和内容渲染函数,提高了代码的可读性和性能。

src/packages/step/step.tsx (5)

1-6: 优化导入结构,增加React Hooks支持

更新了导入结构,增加了对React Hooks的支持,包括useCallbackuseMemo等,提高了组件性能。


10-10: 更新了类型定义引用

从基本类型引用扩展为引入StepStatusWebStepProps类型,改善了类型安全性。


23-35: 优化了属性解构与组合

清晰地解构了更多属性,提高了代码可读性和结构性。


38-44: 父组件属性解构更明确

解构出父组件中的相关属性,使用描述性变量名,提高了代码的可读性。


109-116: 更新了JSX结构和样式引用

优化了组件结构,使用了计算好的类名和内容渲染函数,提高了代码的可读性和性能。

src/packages/step/step.scss (8)

2-3: 父容器定位与弹性布局
.nut-step 根选择器中添加了 position: relativedisplay: flex,使其既可作为定位容器又可进行子元素的弹性布局。


5-8: 隐藏最后一步的连接线
&-last .nut-step-line 上应用 display: none,能有效移除末尾的横线,使 UI 更加符合预期。


37-40: 点样式配置正确
.nut-step-head-dot 通过变量控制尺寸和背景色,与其他头部变体保持一致。


55-60: 连线容器布局
&-line 设置为绝对定位并通过 flex 居中内容,搭配 z-index 0 实现层级分离。结构清晰,符合预期。


71-76: 主内容区最小高度
&-main 指定 min-height: $steps-base-head-height,确保内容区至少与头部一样高,提升视觉一致性。


83-86: 标题层级控制
第一处 &-title 为标题添加了 position: relativez-index: 1,保证其在连线之上渲染,逻辑正确。


106-116: 当前步骤状态样式优先级
&.nut-step-process 分别设置了 head 图标、文本、点的背景色及文本色,风格统一。请确认该状态类样式在基础样式之后引入,以避免被通用规则覆盖。


128-133: 完成状态样式正确
.nut-step-finish 下仅变更图标颜色,其它元素继承基础样式即可满足需求,保持简洁。

Comment on lines +53 to +63
{React.Children.map(children, (child, index) => {
if (React.isValidElement(child)) {
return React.cloneElement(child, {
// @ts-ignore
className: classNames(child.props.className, {
'nut-step-last': index === React.Children.count(children) - 1,
}),
})
}
return child
})}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

❓ Verification inconclusive

优化了子组件渲染逻辑

使用React.Children.map迭代子组件,并为最后一个子组件添加特殊类名以支持差异化样式。

注意:第62行的代码路径缺少测试覆盖,建议添加非有效React元素作为子组件的测试用例。


🏁 Script executed:

#!/bin/bash
# 检查是否有测试用例覆盖非有效React元素作为子组件的情况
rg -A 5 -B 5 "非React元素|非有效元素|not a valid React element|invalid child" --type=tsx src/packages/steps/__tests__/

Length of output: 140


🏁 Script executed:

#!/bin/bash
# 使用 glob 模式查找测试文件中是否验证了非有效 React 元素子组件的情况
rg -A5 -B5 "React.isValidElement" src/packages/steps/__tests__ -g "*.test.tsx" -g "*.spec.tsx" -g "*.test.ts" -g "*.spec.ts"

Length of output: 124


请补充非 React 元素子组件的测试覆盖

我们在 src/packages/steps/__tests__ 目录中未发现针对以下场景的用例,建议新增对应测试,确保组件对“无效”子元素的鲁棒性:

  • 传入字符串、数字、nullundefined 等非 React 元素时,组件应正常渲染且不抛出异常
  • 验证 React.cloneElement 仅对有效元素生效,其它类型原样返回

定位:

  • 测试目录:src/packages/steps/__tests__/
  • 建议新增文件:steps.invalid-child.test.tsx 或在现有测试中添加用例
🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 62-62: src/packages/steps/steps.tsx#L62
Added line #L62 was not covered by tests

Comment on lines 84 to 96
// 内容渲染
const renderContent = useMemo(() => {
if (!title && !description) return null

return (
<div className={`${classPrefix}-main`}>
{title && <span className={`${classPrefix}-title`}>{title}</span>}
{description && (
<span className={`${classPrefix}-description`}>{description}</span>
)}
</div>
)
}, [title, description])
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

内容渲染逻辑优化

使用useMemo优化内容渲染,避免不必要的重新渲染。

注意:依赖数组中应添加classPrefix以确保当类名前缀变化时重新计算。

-  }, [title, description])
+  }, [title, description, classPrefix])
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// 内容渲染
const renderContent = useMemo(() => {
if (!title && !description) return null
return (
<div className={`${classPrefix}-main`}>
{title && <span className={`${classPrefix}-title`}>{title}</span>}
{description && (
<span className={`${classPrefix}-description`}>{description}</span>
)}
</div>
)
}, [title, description])
// 内容渲染
const renderContent = useMemo(() => {
if (!title && !description) return null
return (
<div className={`${classPrefix}-main`}>
{title && <span className={`${classPrefix}-title`}>{title}</span>}
{description && (
<span className={`${classPrefix}-description`}>{description}</span>
)}
</div>
)
}, [title, description, classPrefix])

Comment on lines +93 to +105
// 内容渲染
const renderContent = useMemo(() => {
if (!title && !description) return null

return (
<div className={`${classPrefix}-main`}>
{title && <span className={`${classPrefix}-title`}>{title}</span>}
{description && (
<span className={`${classPrefix}-description`}>{description}</span>
)}
</div>
)
}, [title, description])
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

内容渲染逻辑优化

使用useMemo优化内容渲染,避免不必要的重新渲染。

注意:依赖数组中应添加classPrefix以确保当类名前缀变化时重新计算。

-  }, [title, description])
+  }, [title, description, classPrefix])
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// 内容渲染
const renderContent = useMemo(() => {
if (!title && !description) return null
return (
<div className={`${classPrefix}-main`}>
{title && <span className={`${classPrefix}-title`}>{title}</span>}
{description && (
<span className={`${classPrefix}-description`}>{description}</span>
)}
</div>
)
}, [title, description])
// 内容渲染
const renderContent = useMemo(() => {
if (!title && !description) return null
return (
<div className={`${classPrefix}-main`}>
{title && <span className={`${classPrefix}-title`}>{title}</span>}
{description && (
<span className={`${classPrefix}-description`}>{description}</span>
)}
</div>
)
}, [title, description, classPrefix])

Comment on lines +78 to +81
&-line,
&-title {
background-color: #ffffff;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

避免背景色硬编码
&-line, &-title 中直接写死 #ffffff,建议用主题或变量替代,以便后续亮暗主题或品牌色切换。

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

🧹 Nitpick comments (1)
src/styles/variables-jrkf.scss (1)

1509-1524: 建议:将 business 相关颜色抽象为变量或主题令牌
$steps-business-* 系列变量直接使用了硬编码的 #994d00#fff4e8,若项目后续需统一品牌色或深色模式下切换,建议改用已有 $color-warning 系列或新增主题令牌进行引用,以提高维护性。

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b685923 and 320ca50.

📒 Files selected for processing (3)
  • src/config.json (2 hunks)
  • src/styles/variables-jmapp.scss (1 hunks)
  • src/styles/variables-jrkf.scss (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/config.json
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: test
  • GitHub Check: build
🔇 Additional comments (19)
src/styles/variables-jmapp.scss (10)

1302-1312: 基础样式变量定义无误
这些变量声明与 CSS 自定义属性命名一致,提供了步骤条组件的基础背景、头部高度、背景色、边框和文字大小。


1375-1399: process 和 wait 状态变量声明良好
processwait 相关的背景、文字和图标颜色变量均与命名预期一致。


1400-1403: finish 状态图标颜色变量合理
$steps-finish-icon-color--nutui-steps-finish-icon-color 保持一致,默认值符合设计规范。


1404-1419: business 状态相关变量定义无误
business 状态下标题、描述、圆点、图标与背景色变量命名及默认值合理。


1428-1443: enhanced finish 状态变量声明良好
$steps-enhanced-finish-head-* 系列 SCSS 变量与对应 CSS 变量命名及默认值对齐。


1444-1451: 横向布局间距变量合理
$steps-horizontal-item-padding-right--nutui-steps-horizontal-item-padding-right 对应正确。


1452-1459: 特殊横向间距变量定义符合预期
$steps-horizontal-item-special-*-padding-right 变量系列声明清晰。


1460-1467: 垂直布局项目底部间距正确
$steps-vertical-item-padding-bottom 命名与默认值合理。


1468-1475: 垂直布局标题相关变量无误
$steps-vertical-title-font-size--nutui-steps-vertical-title-margin-bottom 对应正确。


1476-1495: 垂直布局描述及时间样式变量合理
描述字体大小、间距及时间样式变量声明一致。

src/styles/variables-jrkf.scss (9)

1407-1417: 批准:Steps 基础布局参数
这部分定义了 Steps 组件的整体背景及基础头部尺寸、背景色、边框和字体大小,符合设计预期并与其他组件保持一致。


1422-1431: 批准:Steps 基础头部颜色与点样式
基础头部文字和点的默认颜色、大小以及禁用态背景色定义合理。保持了对设计系统的兼容。


1443-1455: 批准:Steps 基础连线及标题样式
base-linebase-title 等变量定义清晰,连线高度、背景、标题字体大小和颜色均合理,对应不同布局无冲突。


1460-1471: 批准:Steps 基础描述与边框颜色
描述文本大小、颜色以及头部默认边框色定义准确,保持了视觉一致性。


1480-1488: 批准:Steps 进行中(process)状态配色
process-head-background-color、文字与图标颜色配合主品牌色,符合设计语言,建议继续沿用。


1489-1504: 批准:Steps 等待(wait)状态配色
等待状态图标、标题和描述色定义清晰,使用辅助色加强状态区分度。


1505-1508: 批准:Steps 完成(finish)状态图标色
$steps-finish-icon-color 默认使用辅助文本色,符合完成态视觉反馈。


1533-1548: 批准:Steps 加强完成(enhanced finish)状态样式
背景、点、图标和文本颜色均已精细化,满足增强完成态的可视化需求。


1549-1596: 批准:Steps 各布局间距和尺寸
横向和纵向的 item padding、行间距、特殊状态间距等均按照设计稿设置,逻辑清晰且易于维护。

Comment on lines +1363 to +1374
$steps-base-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

移除重复声明并修正 process 边框变量
$steps-process-head-border-color 出现两次且引用的是 --nutui-steps-base-head-border-color,应删除冗余声明,并新增 --nutui-steps-process-head-border-color 以覆盖默认边框色。

Comment on lines +1351 to 1362
$steps-base-description-margin-top: var(
--nutui-steps-base-title-margin-bottom,
0
2px
) !default;
$steps-base-description-font-size: var(
--nutui-steps-base-description-font-size,
$font-size-s
$font-size-xxs
) !default;
$steps-base-description-color: var(
--nutui-steps-base-description-color,
$color-text
$color-text-help
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

修复描述间距变量的 CSS 属性名
$steps-base-description-margin-top 使用了 --nutui-steps-base-title-margin-bottom,建议新增或使用 --nutui-steps-base-description-margin-top,保持意图和命名一致。

Comment on lines +1331 to 1337
--nutui-steps-base-head-icon-size-right,
20px
) !default;
$steps-vertical-head-icon-size: var(
--nutui-steps-vertical-item-icon-size,
20px
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

调整垂直模式图标尺寸变量名称
$steps-vertical-head-icon-size 对应的 CSS 变量 --nutui-steps-vertical-item-icon-size 与变量名不匹配,建议改为 --nutui-steps-vertical-head-icon-size

Comment on lines +1313 to +1330
$steps-base-head-size: var(
--nutui-steps-base-icon-size,
$font-size-xxs
) !default;
$steps-base-head-color: var(
--nutui-steps-base-head-color,
$color-text
) !default;
$steps-base-head-dot-size: var(--nutui-steps-base-head-dot-size, 6px) !default;
$steps-base-head-dot-background-color: var(
--nutui-steps-base-head-dot-background-color,
$color-text-disabled
) !default;
$steps-base-head-icon-size: var(
--nutui-steps-base-head-icon-size,
16px
) !default;
$steps-double-head-icon-size: var(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

修正变量命名不一致问题
$steps-base-head-size 使用了 --nutui-steps-base-icon-size,应与 SCSS 变量名 steps-base-head-size 对应,比如 --nutui-steps-base-head-size
同样 $steps-double-head-icon-size 应使用 --nutui-steps-double-head-icon-size 而非 --nutui-steps-base-head-icon-size-right

Comment on lines +1456 to 1459
$steps-base-description-margin-top: var(
--nutui-steps-base-title-margin-bottom,
0
2px
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

关键问题:$steps-base-description-margin-top 引用的 CSS 变量名错误
当前使用 --nutui-steps-base-title-margin-bottom,但应对应描述文本与标题的间距,应为 --nutui-steps-base-description-margin-top

请修复为:

- $steps-base-description-margin-top: var(--nutui-steps-base-title-margin-bottom, 2px) !default;
+ $steps-base-description-margin-top: var(--nutui-steps-base-description-margin-top, 2px) !default;

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +1472 to +1479
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
$steps-process-head-border-color: var(
--nutui-steps-base-head-border-color,
$color-border
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

关键问题:重复定义并引用错误的 CSS 变量
$steps-process-head-border-color 被定义两次,且引用的 CSS 变量同为 --nutui-steps-base-head-border-color,应分别引用 --nutui-steps-process-head-border-color 并保留一条定义。

建议合并并修复引用:

- $steps-process-head-border-color: var(--nutui-steps-base-head-border-color, $color-border) !default;
- $steps-process-head-border-color: var(--nutui-steps-base-head-border-color, $color-border) !default;
+ $steps-process-head-border-color: var(--nutui-steps-process-head-border-color, $color-border) !default;

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +1418 to +1421
$steps-base-head-size: var(
--nutui-steps-base-icon-size,
$font-size-xxs
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

关键问题:$steps-base-head-size 引用的 CSS 变量名错误
当前写法使用了 var(--nutui-steps-base-icon-size, $font-size-xxs),但应该引用 --nutui-steps-base-head-size

请应用以下修复:

- $steps-base-head-size: var(--nutui-steps-base-icon-size, $font-size-xxs) !default;
+ $steps-base-head-size: var(--nutui-steps-base-head-size, $font-size-xxs) !default;

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +1435 to +1438
$steps-double-head-icon-size: var(
--nutui-steps-base-head-icon-size-right,
20px
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

关键问题:$steps-double-head-icon-size 引用的 CSS 变量名不一致
SCSS 变量名为 double-head-icon-size,但引用的 CSS 变量 --nutui-steps-base-head-icon-size-right 与其命名不匹配,应为 --nutui-steps-double-head-icon-size

建议修复:

- $steps-double-head-icon-size: var(--nutui-steps-base-head-icon-size-right, 20px) !default;
+ $steps-double-head-icon-size: var(--nutui-steps-double-head-icon-size, 20px) !default;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
$steps-double-head-icon-size: var(
--nutui-steps-base-head-icon-size-right,
20px
) !default;
$steps-double-head-icon-size: var(
--nutui-steps-double-head-icon-size,
20px
) !default;

Comment on lines +1439 to 1442
$steps-vertical-head-icon-size: var(
--nutui-steps-vertical-item-icon-size,
20px
) !default;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

关键问题:$steps-vertical-head-icon-size CSS 变量名与 SCSS 变量不匹配
引用了 --nutui-steps-vertical-item-icon-size,但 SCSS 变量名为 vertical-head-icon-size,应统一为 --nutui-steps-vertical-head-icon-size

建议修复:

- $steps-vertical-head-icon-size: var(--nutui-steps-vertical-item-icon-size, 20px) !default;
+ $steps-vertical-head-icon-size: var(--nutui-steps-vertical-head-icon-size, 20px) !default;

Committable suggestion skipped: line range outside the PR's diff.

Copy link
Collaborator

@xiaoyatong xiaoyatong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1、纵向布局的 description 字色 color-title
2、纵向布局 time 相关的,可以改为 tips 或者其他更具有通用性的样式,或者直接写在demo里就好。
3、最后一个demo里的电话,改个确保永远都无法打通的?
4、样式这块看看是不是可以精简~

$color-primary-stop-2
$steps-business-title-color: var(
--nutui-steps-business-title-color,
#994d00
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个可以使用 theme-default 里的golden 颜色~

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已修改

$color-text
$steps-business-head-background-color: var(
--nutui-steps-business-head-background-color,
#fff4e8
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个值 目前 theme-default 中没有对应的值,需要跟设计对一下,是不是和定义的规范有出入~

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已修改

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

暴露的变量太多了,可以靠拢规范,比如 dot 、 title 可以用一个,根据step的StepStatus 来区分就可以了?

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (12)
src/packages/steps/demos/taro/demo9.tsx (1)

58-89: 步骤值顺序与状态更新逻辑不一致

在第二个Steps组件中,步骤值按3、2、1的顺序定义,但状态更新逻辑是按1、2、3循环。这可能导致用户点击"下一步"时,状态变化与展示顺序不一致,造成混淆。

建议保持一致的步骤值顺序,修改第二个Steps组件的顺序,或者调整状态更新逻辑:

<Steps direction="vertical" value={value} type="icon" status="enhanced">
  <Step
    type="icon"
-    value={3}
+    value={1}
    title="待安装  工程师已接单"
    description={
      <>
        <p>已分配工程师 XXX 为您服务,联系电话 136 **** 8618</p>
        <p style={timeCustomStyle}>2025-01-20 07:12:30</p>
      </>
    }
    icon={<Service />}
  />
  <Step
    type="icon"
-    value={2}
+    value={2}
    title="已签收"
    description={
      <>
        <p>京东快递 · 您的订单派送完成,已由家人签收</p>
        <p style={timeCustomStyle}>2025-01-20 07:12:30</p>
      </>
    }
    icon={<Check />}
  />
  <Step
    type="dot"
-    value={1}
+    value={3}
    title="京东总部大厦B座"
    description="京小东 136 **** 8618"
  />
</Steps>
src/packages/steps/doc.taro.md (1)

17-81: ⚠️ Potential issue

Taro 文档中 Demo 路径应指向 Taro 示例目录
当前所有 <CodeBlock src='h5/demoX.tsx'> 均应更新为 taro/demoX.tsx,以引用 Taro 专用示例,保持与实际文件结构一致。例如:

- <CodeBlock src='h5/demo1.tsx'></CodeBlock>
+ <CodeBlock src='taro/demo1.tsx'></CodeBlock>
src/styles/variables-jmapp.scss (5)

1335-1338: 🛠️ Refactor suggestion

⚠️ Potential issue

修正垂直模式头部图标尺寸变量
$steps-vertical-head-icon-size 应引用 --nutui-steps-vertical-head-icon-size 而非 --nutui-steps-vertical-item-icon-size

- $steps-vertical-head-icon-size: var(--nutui-steps-vertical-item-icon-size, 20px) !default;
+ $steps-vertical-head-icon-size: var(--nutui-steps-vertical-head-icon-size, 20px) !default;

1314-1317: 🛠️ Refactor suggestion

⚠️ Potential issue

修正 steps-base-head-size 对应的 CSS 变量名
当前引用 --nutui-steps-base-icon-size 与变量名不匹配,应使用 --nutui-steps-base-head-size

- $steps-base-head-size: var(--nutui-steps-base-icon-size, $font-size-xxs) !default;
+ $steps-base-head-size: var(--nutui-steps-base-head-size, $font-size-xxs) !default;

1352-1355: 🛠️ Refactor suggestion

⚠️ Potential issue

修正描述文字上边距变量名
$steps-base-description-margin-top 引用了 --nutui-steps-base-title-margin-bottom,应使用 --nutui-steps-base-description-margin-top

- $steps-base-description-margin-top: var(--nutui-steps-base-title-margin-bottom, 2px) !default;
+ $steps-base-description-margin-top: var(--nutui-steps-base-description-margin-top, 2px) !default;

1327-1334: 🛠️ Refactor suggestion

⚠️ Potential issue

修正双行标题图标尺寸变量
$steps-double-head-icon-size 引用了 --nutui-steps-base-head-icon-size-right,应替换为新变量 --nutui-steps-double-head-icon-size

- $steps-double-head-icon-size: var(--nutui-steps-base-head-icon-size-right, 20px) !default;
+ $steps-double-head-icon-size: var(--nutui-steps-double-head-icon-size, 20px) !default;

1368-1375: 🛠️ Refactor suggestion

⚠️ Potential issue

移除重复声明并修正处理状态边框变量
$steps-process-head-border-color 出现两次且引用了 --nutui-steps-base-head-border-color,需保留一次并使用专用 CSS 变量 --nutui-steps-process-head-border-color

- $steps-process-head-border-color: var(--nutui-steps-base-head-border-color, $color-border) !default;
- $steps-process-head-border-color: var(--nutui-steps-base-head-border-color, $color-border) !default;
+ $steps-process-head-border-color: var(--nutui-steps-process-head-border-color, $color-border) !default;
src/styles/variables.scss (5)

1213-1216: 修复变量名:基础头部尺寸

当前 $steps-base-head-size 引用了错误的 CSS 变量 --nutui-steps-base-icon-size,应使用 --nutui-steps-base-head-size,保持与变量命名一致。

-$steps-base-head-size: var(
-  --nutui-steps-base-icon-size,
-  $font-size-xxs
-) !default;
+$steps-base-head-size: var(
+  --nutui-steps-base-head-size,
+  $font-size-xxs
+) !default;

1230-1233: 修复变量名:双行图标尺寸

$steps-double-head-icon-size 正在引用 --nutui-steps-base-head-icon-size-right,应改为 --nutui-steps-double-head-icon-size

-$steps-double-head-icon-size: var(
-  --nutui-steps-base-head-icon-size-right,
-  20px
-) !default;
+$steps-double-head-icon-size: var(
+  --nutui-steps-double-head-icon-size,
+  20px
+) !default;

1234-1237: 修复变量名:垂直布局图标尺寸

$steps-vertical-head-icon-size 正在引用 --nutui-steps-vertical-item-icon-size,建议使用 --nutui-steps-vertical-head-icon-size

-$steps-vertical-head-icon-size: var(
-  --nutui-steps-vertical-item-icon-size,
-  20px
-) !default;
+$steps-vertical-head-icon-size: var(
+  --nutui-steps-vertical-head-icon-size,
+  20px
+) !default;

1251-1254: 修复变量名:描述上边距

$steps-base-description-margin-top 引用了错误的 CSS 变量 --nutui-steps-base-title-margin-bottom,应使用 --nutui-steps-base-description-margin-top

-$steps-base-description-margin-top: var(
-  --nutui-steps-base-title-margin-bottom,
-  2px
-) !default;
+$steps-base-description-margin-top: var(
+  --nutui-steps-base-description-margin-top,
+  2px
+) !default;

1271-1274: 移除重复定义:流程头部边框颜色

出现了两处 $steps-process-head-border-color 重复定义,应删除多余的一处。

- $steps-process-head-border-color: var(
-   --nutui-steps-base-head-border-color,
-   $color-border
- ) !default;
🧹 Nitpick comments (2)
src/packages/steps/demos/taro/demo9.tsx (2)

12-17: 建议使用常量管理样式对象

对于会重复使用的样式对象,建议提取为组件顶层的常量,而不是在渲染函数内部创建。这样可以避免在每次渲染时重新创建对象,提高性能。

+const TIME_CUSTOM_STYLE = {
+  marginTop: pxTransform(2),
+  color: '#808080',
+  fontSize: pxTransform(12),
+  lineHeight: pxTransform(18),
+};

const Demo9 = () => {
  const [value, setValue] = useState(2)
  const handleStep = () => {
    const newVal = (value % 3) + 1
    setValue(newVal)
  }

-  const timeCustomStyle = {
-    marginTop: pxTransform(2),
-    color: '#808080',
-    fontSize: pxTransform(12),
-    lineHeight: pxTransform(18),
-  }

91-93: 建议添加空间间隔组件

按钮与上方Cell组件之间没有间距,在视觉上可能显得拥挤。建议使用Space组件添加适当间距:

+      <Space style={{ margin: '12px 0' }}>
        <Button type="primary" size="small" onClick={handleStep}>
          下一步
        </Button>
+      </Space>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 320ca50 and 6db44ea.

📒 Files selected for processing (10)
  • src/packages/steps/demos/h5/demo9.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo9.tsx (1 hunks)
  • src/packages/steps/doc.en-US.md (3 hunks)
  • src/packages/steps/doc.md (3 hunks)
  • src/packages/steps/doc.taro.md (3 hunks)
  • src/packages/steps/doc.zh-TW.md (3 hunks)
  • src/packages/steps/steps.scss (1 hunks)
  • src/styles/variables-jmapp.scss (1 hunks)
  • src/styles/variables-jrkf.scss (1 hunks)
  • src/styles/variables.scss (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/packages/steps/demos/h5/demo9.tsx
  • src/styles/variables-jrkf.scss
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/packages/steps/demos/taro/demo9.tsx (2)
src/packages/steps/steps.taro.tsx (1)
  • Steps (17-67)
src/packages/step/step.taro.tsx (1)
  • Step (20-111)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: test
🔇 Additional comments (19)
src/packages/steps/demos/taro/demo9.tsx (1)

22-55: 代码结构良好,组件示例清晰展示了垂直步骤条的动态状态

第一个步骤条示例展示了混合使用点状和图标类型的步骤,并正确实现了动态状态切换。时间戳格式统一,描述内容丰富,对于展示组件的使用方式非常有效。

src/packages/steps/steps.scss (3)

6-180: 横向布局样式结构完善,对不同显示类型的支持全面

横向步骤条的样式结构层次清晰,覆盖了单行和双行两种布局类型,以及点状、图标、文本三种显示方式。特别是对不同状态(进行中、等待、完成)的样式处理恰当,使用CSS变量保证了样式的一致性和可定制性。

对于图标尺寸的处理考虑到了不同场景下的视觉平衡,增强了组件的视觉体验。


183-310: 纵向布局样式结构优化,兼容性处理完善

纵向步骤条样式结构清晰,特别是对Harmony环境的特殊处理和对不同类型步骤头部的精细调整值得肯定。步骤项间距、线条位置计算准确,确保了视觉效果的一致性。

标题和描述文本的样式处理也很合理,尤其是对多行文本的支持使组件更加灵活。


312-332: 增强状态样式设计出色,视觉层次分明

为enhanced状态设计的特殊样式处理很出色,通过背景色和图标色的差异化,让用户能够直观区分不同的完成状态。这种设计既保持了视觉一致性,又提供了足够的状态区分度。

src/packages/steps/doc.zh-TW.md (4)

13-83: 文档示例组织结构清晰,分类详细

文档中的示例部分按照横版和竖向两大类,并进一步细分为不同布局和类型的组合,这种组织结构非常有助于用户理解组件的多样性和适用场景。示例标题描述准确,便于用户快速找到所需的实现方式。


93-98: API文档更新全面,新增属性说明清晰

Steps组件新增的status、count、type、layout、icon和onStepClick属性描述准确,类型定义明确,有助于用户正确使用这些新特性。特别是status和type属性的可选值列举完整,便于用户理解各种状态和类型的区别。


106-110: Step子组件属性类型更新合理

将title和description属性从string类型更新为ReactNode,大大增强了步骤内容的灵活性,允许用户插入更丰富的内容。新增type属性也使子步骤能够独立定制显示方式,增强了组件的可配置性。


120-167: 主题变量全面丰富,支持细粒度样式定制

CSS变量系统非常完善,涵盖了步骤条的各种视觉元素和状态。特别是对不同状态(进行中、等待、完成、业务、增强完成)的颜色定制变量很全面,支持用户根据品牌需求进行细致的样式调整。

布局相关的变量(如内边距、行高等)也定义得很详细,使得组件在不同场景下都能保持良好的视觉效果。

src/packages/steps/doc.md (4)

13-83: 文档示例结构清晰,分类详细

文档的示例部分按照横版和竖向两大类,并进一步细分为不同布局和类型的组合,这种结构清晰的组织方式非常有助于用户理解组件的多样性和适用场景。每个示例标题描述准确,便于用户快速找到所需的实现方式。


93-98: API文档更新全面,新增属性说明清晰

Steps组件新增的status、count、type、layout、icon和onStepClick属性描述准确,类型定义明确,有助于用户正确使用这些新特性。特别是status和type属性的可选值列举完整,便于用户理解各种状态和类型的区别。


106-110: Step子组件属性类型更新合理

将title和description属性从string类型更新为ReactNode,大大增强了步骤内容的灵活性,允许用户插入更丰富的内容。新增type属性也使子步骤能够独立定制显示方式,增强了组件的可配置性。


120-167: 主题变量全面丰富,支持细粒度样式定制

CSS变量系统非常完善,涵盖了步骤条的各种视觉元素和状态。特别是对不同状态(进行中、等待、完成、业务、增强完成)的颜色定制变量很全面,支持用户根据品牌需求进行细致的样式调整。

布局相关的变量(如内边距、行高等)也定义得很详细,使得组件在不同场景下都能保持良好的视觉效果。

src/packages/steps/doc.en-US.md (4)

13-83: 检查示例演示部分更新
Demo 标题和对应的 CodeBlock 引用已更新为新的布局、文本行数和图标用法,且 src 路径指向 h5/demoX.tsx。请确认 src/packages/steps/demos/h5/ 目录下存在相应的示例文件,以避免示例渲染异常。


91-98: 验证 Props 表格更新
已移除 current 属性并新增 valuestatuscounttypelayouticononStepClick,表格格式与描述一致。


106-111: 验证 Step 子组件 Props
titledescription 类型变更为 ReactNode,新增 type 属性;表格格式无误。


120-168: 核对主题定制区域
新列表覆盖了所有步骤状态、类型和布局下的 CSS 变量,名称与组件实现保持一致。

src/packages/steps/doc.taro.md (3)

91-98: 校验 Props 表格更新
dot 属性已移除,新增 statuscounttypelayouticononStepClick,内容准确。


106-111: 校验 Step Props 表格更新
titledescription 类型修改为 ReactNode,新增 type 属性;表格条目齐全。


120-168: 核对主题定制 CSS 变量
Taro 文档 CSS 变量段落与英文版保持一致,涵盖新设计 Token,命名格式正确。

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
src/packages/steps/demos/taro/demo9.tsx (1)

60-89: 步骤值顺序与状态更新逻辑不一致

在第二个Steps组件中,步骤值按3、2、1的顺序定义,但状态更新逻辑是按1、2、3循环。这可能导致用户点击"下一步"时,状态变化与展示顺序不一致,造成混淆。

建议保持一致的步骤值顺序,修改第二个Steps组件的顺序,或者调整状态更新逻辑:

<Steps direction="vertical" value={value} type="icon" status="enhanced">
  <Step
    type="icon"
-    value={3}
+    value={1}
    title="待安装  工程师已接单"
    description={
      <>
        <View>已分配工程师 XXX 为您服务,联系电话 136 **** 8618</View>
        <View style={timeCustomStyle}>2025-01-20 07:12:30</View>
      </>
    }
    icon={<Service />}
  />
  <Step
    type="icon"
-    value={2}
+    value={2}
    title="已签收"
    description={
      <>
        <View>京东快递 · 您的订单派送完成,已由家人签收</View>
        <View style={timeCustomStyle}>2025-01-20 07:12:30</View>
      </>
    }
    icon={<Check />}
  />
  <Step
    type="dot"
-    value={1}
+    value={3}
    title="京东总部大厦B座"
    description="京小东 136 **** 8618"
  />
</Steps>
🧹 Nitpick comments (2)
src/packages/steps/demos/taro/demo9.tsx (1)

13-18: 建议将样式抽离到独立的样式文件中

当前的timeCustomStyle对象直接在组件内定义,如果在多个地方需要相同的时间样式,会导致代码重复。建议将这些通用样式抽离到一个独立的样式文件中。

+ // 在单独的样式文件中定义
+ // src/packages/steps/demos/taro/demo.scss
+ .time-custom {
+   margin-top: 2px;
+   color: #808080;
+   font-size: 12px;
+   line-height: 1.5;
+ }

- const timeCustomStyle = {
-   marginTop: pxTransform(2),
-   color: '#808080',
-   fontSize: pxTransform(12),
-   lineHeight: 1.5,
- }

// 然后在JSX中使用类名
- <View style={timeCustomStyle}>2025-01-20 07:12:30</View>
+ <View className="time-custom">2025-01-20 07:12:30</View>
src/packages/steps/steps.scss (1)

313-333: 增强状态样式定义精确

增强状态(enhanced)的样式定义针对完成步骤提供了特殊的视觉效果,包括背景色、图标颜色和文本颜色的定制。这种差异化的视觉处理有助于用户更清晰地识别步骤状态。

建议考虑:

  1. 为其他状态(如process、wait)也提供enhanced模式下的特殊样式,保持样式的一致性和完整性
  2. 考虑添加适当的过渡效果(transition),使状态变化更加平滑
// 示例:为process状态添加enhanced模式下的特殊样式
.nut-step-process {
  .nut-step-head-icon,
  .nut-step-head-text {
    transition: background-color 0.3s, color 0.3s;
    
    // enhanced模式下的特殊样式
    .nut-steps-horizontal-enhanced &,
    .nut-steps-vertical-enhanced & {
      background-color: $steps-enhanced-process-head-background-color;
      
      .nut-icon {
        color: $steps-enhanced-process-head-icon-color;
      }
    }
  }
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6db44ea and a5ef2c0.

📒 Files selected for processing (3)
  • src/packages/step/step.taro.tsx (1 hunks)
  • src/packages/steps/demos/taro/demo9.tsx (1 hunks)
  • src/packages/steps/steps.scss (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/packages/step/step.taro.tsx
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: test
🔇 Additional comments (8)
src/packages/steps/demos/taro/demo9.tsx (4)

1-3: 良好的导入实践

代码从不同包中导入了所需的组件和图标,组织清晰。使用命名导入而不是默认导入有助于提高代码可读性和维护性。


7-11: 状态管理实现得当

使用React的useState钩子来管理步骤值状态,并通过handleStep函数实现了循环切换步骤的功能。这是一个简洁有效的实现。


21-57: 第一个Steps组件结构良好

第一个Steps组件使用了"dynamic"状态和垂直方向布局,组合了dot和icon类型的步骤,展示了不同的步骤样式和内容格式。组件结构清晰,内容丰富,是一个很好的示例。


92-94: 交互控制实现恰当

添加了一个按钮用于切换步骤状态,并通过handleStep函数实现了状态的更新。这种交互方式简单明了,能够很好地展示Steps组件的动态特性。

src/packages/steps/steps.scss (4)

6-180: 横向步骤条样式结构完善

横向步骤条的样式结构清晰,针对不同状态(process、wait、finish)和不同布局(single、double)提供了详细的样式定义。特别是在处理图标、点和文本类型时的差异化处理,以及对步骤连接线的精确定位控制都非常出色。

建议考虑以下优化点:

  1. 在某些嵌套较深的选择器中,可以考虑使用SCSS的父选择器引用(&)简化结构
  2. 对于重复出现的数值(如padding、margin),可以考虑抽取为变量

这些样式的模块化组织方式使得组件能够支持多种布局和状态组合,非常灵活。


182-311: 纵向步骤条样式实现完善

纵向步骤条样式定义详尽,针对不同类型(icon、dot、text)提供了差异化的样式处理。特别是在处理步骤连接线和内容对齐方面的细节处理非常到位。

以下几点特别出色:

  1. 使用了计算属性(calc)动态计算尺寸和位置,增强了样式的灵活性
  2. 对于图标、点和文本的包装元素提供了一致的基础样式,同时保留了类型特定的差异
  3. 考虑了不同设备环境的兼容性(如Harmony环境)

这些样式定义使得纵向步骤条在各种场景下都能保持一致的视觉效果和良好的用户体验。


6-311: 变量使用规范

代码中大量使用了SCSS变量(如$steps-background-color$steps-process-title-color等)来定义颜色、尺寸和间距,这是一个很好的实践,使得主题定制和样式维护变得更加容易。

特别是像$steps-vertical-head-icon-size$steps-base-head-dot-size这样的专用变量,确保了不同类型步骤之间的视觉一致性,同时允许对特定类型进行单独定制。

这种变量命名和使用方式也非常符合组件库的最佳实践,有助于保持整个库的风格一致性。


1-334: 整体结构清晰,模块化程度高

整个SCSS文件的结构组织得非常清晰,通过嵌套选择器创建了逻辑清晰的样式层次。主要分为横向和纵向两大布局模式,每种模式下又细分为不同的类型和状态。

特别值得称赞的是:

  1. 类名命名遵循了BEM方法论的思想,如.nut-steps-horizontal.nut-step-head-icon
  2. 公共样式和特定样式的分离,减少了代码重复
  3. 状态样式(process、wait、finish)和类型样式(icon、dot、text)的清晰分离

这种结构使得样式代码易于维护和扩展,也便于其他开发者理解和使用。

@irisSong irisSong requested a review from xiaoyatong May 12, 2025 10:44
@irisSong
Copy link
Collaborator Author

1、纵向布局的 description 字色 color-title 2、纵向布局 time 相关的,可以改为 tips 或者其他更具有通用性的样式,或者直接写在demo里就好。 3、最后一个demo里的电话,改个确保永远都无法打通的? 4、样式这块看看是不是可以精简~

已修改

@oasis-cloud oasis-cloud merged commit a532330 into jdf2e:feat_v3.x May 17, 2025
8 checks passed
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🔭 Outside diff range comments (1)
src/packages/steps/doc.md (1)

17-82: 💡 Verification agent

🧩 Analysis chain

请校验引用的 demo 文件路径
文档中所有 <CodeBlock src='h5/demoX.tsx'> 均指向 h5 目录下的示例文件,需要与实际项目目录结构保持一致,否则页面渲染时会找不到对应示例。建议在合并前执行如下脚本,确认所有引用文件都存在:


🏁 Script executed:

#!/usr/bin/env bash
# 验证 Steps 组件文档引用的 h5 下示例文件是否存在
demos=(demo1.tsx demo3.tsx demo7.tsx demo2.tsx demo6.tsx demo5.tsx demo4.tsx demo8.tsx demo9.tsx)
missing=0
for f in "${demos[@]}"; do
  if [ ! -f src/packages/steps/h5/"$f" ]; then
    echo "❌ 缺失示例文件: src/packages/steps/h5/$f"
    missing=1
  fi
done
[ $missing -eq 0 ] && echo "✅ 所有示例文件均存在"

Length of output: 1740


修正文档中的示例文件路径引用

根据验证脚本的结果,src/packages/steps/doc.md 中引用的以下示例文件在 src/packages/steps/h5/ 目录下均不存在,渲染时会导致示例无法加载,请检查并修复路径或补充相应文件:

  • src/packages/steps/h5/demo1.tsx
  • src/packages/steps/h5/demo2.tsx
  • src/packages/steps/h5/demo3.tsx
  • src/packages/steps/h5/demo4.tsx
  • src/packages/steps/h5/demo5.tsx
  • src/packages/steps/h5/demo6.tsx
  • src/packages/steps/h5/demo7.tsx
  • src/packages/steps/h5/demo8.tsx
  • src/packages/steps/h5/demo9.tsx

建议在合并前:

  1. 确认上述文件已创建并位于 src/packages/steps/h5/ 下,或
  2. 修改 doc.md<CodeBlock src='h5/demoX.tsx'> 的路径,使之与实际目录结构一致。
♻️ Duplicate comments (1)
src/packages/steps/doc.taro.md (1)

13-81: Taro 文档中的 Demo 路径需修正
当前所有 <CodeBlock src='h5/demoX.tsx'> 应引用 Taro 专用示例(taro/demoX.tsx),否则与示例目录不符。

- <CodeBlock src='h5/demo1.tsx'></CodeBlock>
+ <CodeBlock src='taro/demo1.tsx'></CodeBlock>
🧹 Nitpick comments (4)
src/packages/steps/doc.en-US.md (1)

119-167: 优化主题变量分组与说明
新增了一大批 CSS 变量,命名规范良好。建议将变量按功能(如通用、水平布局、垂直布局、不同状态)进行分组,并在文档中加上小标题或注释,提升可读性和查找效率。

src/packages/steps/doc.taro.md (1)

119-167: 优化 Taro 文档的样式变量分组
新增大量 CSS 变量,建议按通用、水平、垂直、状态等维度分组并添加小标题,增强文档的可读性和维护性。

src/packages/steps/doc.zh-TW.md (1)

119-167: 优化样式变量分组
大量新增 CSS 变量,建议按功能或状态分块展示,并附小标题或注释,提升阅读体验。

src/packages/steps/doc.md (1)

13-77: 示例标题命名不一致
当前示例区块的标题同时使用了“横版”与“横向”两种前缀,并且不同标题中对逗号、顿号与“+”的使用也无统一风格,例如:“横版上下布局点状、icon、文案” vs “横向上下布局混合:点状 + icon”。建议统一术语(“横向”或“水平”)及标点风格,提升文档可读性。

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e5af22f and 560759e.

📒 Files selected for processing (6)
  • src/packages/steps/doc.en-US.md (3 hunks)
  • src/packages/steps/doc.md (3 hunks)
  • src/packages/steps/doc.taro.md (3 hunks)
  • src/packages/steps/doc.zh-TW.md (3 hunks)
  • src/sites/sites-react/doc/docs/react/migrate-from-v2.md (1 hunks)
  • src/sites/sites-react/doc/docs/taro/migrate-from-v2.md (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: test
  • GitHub Check: build
🔇 Additional comments (12)
src/packages/steps/doc.en-US.md (3)

91-97: 校对 Steps 组件属性表
directionvaluestatustypelayouticononStepClick 的默认值和类型是否与 steps.tsx 中的默认属性及类型定义文件保持一致,请逐项确认。


105-110: 校对 Step 子组件属性表
已将 titledescription 类型修改为 ReactNode,新增 type 属性并移除 dot,请对照 step.tsx 中的接口定义验证文档与实现保持同步。


13-82:

✅ Verification successful

验证 Demo 引用路径是否正确
文档中新增了多个 h5/demoX.tsx 示例引用,请确认这些示例文件是否存在且路径无误,否则会导致运行示例失败。

建议运行以下脚本检查文件是否齐全:


🏁 Script executed:

#!/bin/bash
# 验证 h5 目录下的 demo 文件
for i in {1..9}; do
  if [ ! -f src/packages/steps/demos/h5/demo${i}.tsx ]; then
    echo "Missing demo file: src/packages/steps/demos/h5/demo${i}.tsx"
  fi
done

Length of output: 656


示例文件路径验证通过
已执行脚本验证,src/packages/steps/demos/h5/demo1.tsxdemo9.tsx 文件均存在,文档中引用路径正确,无需进一步修改。

src/packages/steps/doc.taro.md (2)

91-98: 校对 Taro 文档的 Steps 属性表
directionvaluestatustypelayouticononStepClick 的类型及默认值是否与 steps.taro.tsx 中的实现和类型定义保持一致,请逐项确认。


105-110: 校对 Taro 文档的 Step 子组件属性
titledescription 已修改为 ReactNode,新增 type 属性并移除 dot,请对照 step.taro.tsx 中的接口定义验证一致性。

src/sites/sites-react/doc/docs/react/migrate-from-v2.md (1)

311-319: 迁移指南已更新 Steps 及 Step API
文档中新增 statuslayouttypeicononStepClick,并移除 dot;同时更新 Step 的 titledescription 类型及 type 属性,完整覆盖了版本差异。

src/sites/sites-react/doc/docs/taro/migrate-from-v2.md (1)

311-319: 迁移指南已同步 Taro 版 Steps API 变更
与 H5 版一致,新增 statuslayouttypeicononStepClick,删除 dot,Step 的类型更新完备。

src/packages/steps/doc.zh-TW.md (3)

13-77: 验证示例引用路径
文档中所有 h5/demoX.tsx 示例,请确认 src/packages/steps/demos/h5/ 目录下对应文件存在,防止示例无法加载。


91-97: 校对 Steps 属性表(中文)
请检查 directionvaluestatustypelayouticononStepClick 的默认值与代码一致。


105-110: 校对 Step 子组件属性表(中文)
已将 titledescription 类型调整为 ReactNode,新增 type,删除 dot 属性,请对照代码确认文档一致。

src/packages/steps/doc.md (2)

91-97: Props 表格需与组件实现保持一致
当前文档列出了 directionvaluestatustypelayouticononStepClick 共 7 个属性,符合重构后新增的 API。请一并确认:

  1. 默认值正确无误;
  2. layout 与实际代码中使用的属性名保持一致(如是否需同步更新);
  3. 是否需要补充对 direction: vertical 场景新增样式或示例的说明。

105-109: Step 子组件 Props 检查
titledescription 已升级为 ReactNodetype 也与父组件保持一致;value 默认 0 无误,文档描述准确。

Comment on lines +119 to 167
| \--nutui-steps-background-color | 步骤条背景色 | `$white` |
| \--nutui-steps-base-head-height | 头部高度 | `14px` |
| \--nutui-steps-base-head-background-color | 头部背景色 | `$color-background` |
| \--nutui-steps-base-head-border | 头部边框 | `none` |
| \--nutui-steps-base-head-text-size | 头部文字大小 | `12px` |
| \--nutui-steps-base-head-size | 头部图标大小 | `$font-size-xxs` |
| \--nutui-steps-base-head-color | 头部颜色 | `$color-text` |
| \--nutui-steps-base-head-dot-size | 头部点状大小 | `6px` |
| \--nutui-steps-base-head-dot-background-color | 头部点状背景色 | `$color-text-disabled` |
| \--nutui-steps-base-head-icon-size | 头部图标大小 | `16px` |
| \--nutui-steps-double-head-icon-size | 双行头部图标大小 | `20px` |
| \--nutui-steps-vertical-head-icon-size | 垂直头部图标大小 | `20px` |
| \--nutui-steps-base-line-height | 分割线高度 | `1px` |
| \--nutui-steps-base-line-background | 分割线背景色 | `$color-border` |
| \--nutui-steps-base-title-font-size | 标题字号 | `$font-size-s` |
| \--nutui-steps-base-title-color | 标题颜色 | `$color-title` |
| \--nutui-steps-base-description-margin-top | 描述上边距 | `2px` |
| \--nutui-steps-base-description-font-size | 描述字号 | `$font-size-xxs` |
| \--nutui-steps-base-description-color | 描述颜色 | `$color-text-help` |
| \--nutui-steps-base-head-border-color | 头部边框颜色 | `$color-border` |
| \--nutui-steps-process-head-background-color | 进行中头部背景色 | `$color-primary` |
| \--nutui-steps-process-color | 进行中颜色 | `$white` |
| \--nutui-steps-process-title-color | 进行中标题颜色 | `$color-primary` |
| \--nutui-steps-process-description-color | 进行中描述颜色 | `$color-primary` |
| \--nutui-steps-wait-icon-color | 等待状态图标颜色 | `$color-text-help` |
| \--nutui-steps-wait-title-color | 等待状态标题颜色 | `$color-title` |
| \--nutui-steps-wait-description-color | 等待状态描述颜色 | `$color-text` |
| \--nutui-steps-finish-icon-color | 完成状态图标颜色 | `$color-text-help` |
| \--nutui-steps-business-title-color | 业务状态标题颜色 | `var(--nutui-color-service-pressed)` |
| \--nutui-steps-business-description-color | 业务状态描述颜色 | `var(--nutui-color-service-pressed)` |
| \--nutui-steps-business-head-text-color | 业务状态头部文字颜色 | `var(--nutui-color-service-pressed)` |
| \--nutui-steps-business-head-dot-background-color | 业务状态头部点状背景色 | `var(--nutui-color-service-pressed)` |
| \--nutui-steps-business-head-icon-color | 业务状态头部图标颜色 | `var(--nutui-color-service-pressed)` |
| \--nutui-steps-business-head-background-color | 业务状态头部背景色 | `var(--nutui-color-service)` |
| \--nutui-steps-enhanced-finish-head-background-color | 增强完成状态头部背景色 | `$color-primary-light-pressed` |
| \--nutui-steps-enhanced-finish-head-dot-background-color | 增强完成状态头部点状背景色 | `$color-primary-disabled-special` |
| \--nutui-steps-enhanced-finish-head-icon-color | 增强完成状态头部图标颜色 | `$color-primary-stop-1` |
| \--nutui-steps-enhanced-finish-head-text-color | 增强完成状态头部文字颜色 | `$color-primary-stop-1` |
| \--nutui-steps-horizontal-item-padding-right | 水平项右内边距 | `28px` |
| \--nutui-steps-horizontal-item-line-padding | 水平项分割线内边距 | `0 8px` |
| \--nutui-steps-horizontal-item-special-padding-right | 特殊水平项右内边距 | `22px` |
| \--nutui-steps-horizontal-item-special-3-padding-right | 3项特殊水平项右内边距 | `9px` |
| \--nutui-steps-vertical-item-padding-bottom | 垂直项下内边距 | `13px` |
| \--nutui-steps-vertical-title-font-size | 垂直标题字号 | `$font-size-l` |
| \--nutui-steps-vertical-title-margin-bottom | 垂直标题下边距 | `4px` |
| \--nutui-steps-vertical-line-height | 垂直行高 | `18px` |
| \--nutui-steps-vertical-description-font-size | 垂直描述字号 | `$font-size-base` |
| \--nutui-steps-vertical-description-margin | 垂直描述边距 | `0 0 1px` |

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

CSS 变量存在命名与重复风险

  1. --nutui-steps-base-head-size--nutui-steps-base-head-icon-size 都描述“头部图标大小”,建议与 SCSS 源文件对齐,避免同义或重复变量;
  2. 建议按“Base / Process / Wait / Finish / Business / Enhanced / 布局”分组,并在表格中加入小节标题,提升可读性;
  3. 请与 src/packages/steps/steps.scsssrc/packages/step/step.scss 中实际定义的变量逐一核对,确保名称与默认值保持一致,避免主题定制失效。
🤖 Prompt for AI Agents
In src/packages/steps/doc.md between lines 119 and 167, the CSS variable
documentation has naming conflicts and lacks clear grouping. First, reconcile
the variables --nutui-steps-base-head-size and --nutui-steps-base-head-icon-size
by aligning their names and descriptions with those in the SCSS source files to
avoid duplication. Second, reorganize the table by grouping variables under
clear section headers such as Base, Process, Wait, Finish, Business, Enhanced,
and Layout to improve readability. Finally, cross-check each variable name and
default value against the actual definitions in src/packages/steps/steps.scss
and src/packages/step/step.scss to ensure consistency and prevent theme
customization issues.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.x Target branch 3.x action:review This PR needs more reviews (less than 2 approvals) size/XXL
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants