README.md

Design System Module

设计系统模块,提供统一的设计令牌(Design Tokens)、布局常量和组件属性扩展,确保应用 UI 的一致性。

功能特性

布局百分比常量

提供 0% 到 100% 的百分比常量,以 5% 为间隔,用于快速设置组件尺寸。

import { P0, P50, P100 } from '@core/designsystem';

Column() {
  Text('半宽')
    .width(P50);

  Text('全宽')
    .width(P100);
}

可用常量:

  • P0 - P100: 0% 到 100%,每 5% 一个常量
  • 常用值: P0, P25, P50, P75, P100

间距组件

提供标准化的垂直和水平间距组件,确保应用内间距的一致性。

垂直间距

import {
  SpaceVerticalXXLarge,  // 32vp
  SpaceVerticalXLarge,   // 24vp
  SpaceVerticalLarge,    // 16vp
  SpaceVerticalMedium,   // 12vp
  SpaceVerticalSmall,    // 8vp
  SpaceVerticalXSmall    // 4vp
} from '@core/designsystem';

Column() {
  Text('标题');
  SpaceVerticalMedium();  // 12vp 间距
  Text('内容');
  SpaceVerticalLarge();   // 16vp 间距
  Text('底部');
}

水平间距

import {
  SpaceHorizontalXXLarge,  // 32vp
  SpaceHorizontalXLarge,   // 24vp
  SpaceHorizontalLarge,    // 16vp
  SpaceHorizontalMedium,   // 12vp
  SpaceHorizontalSmall,    // 8vp
  SpaceHorizontalXSmall    // 4vp
} from '@core/designsystem';

Row() {
  Text('左侧');
  SpaceHorizontalMedium();  // 12vp 间距
  Text('右侧');
}

间距规范:

  • XXLarge (32vp): 页面级别的大间距
  • XLarge (24vp): 模块之间的间距
  • Large (16vp): 组件之间的间距
  • Medium (12vp): 元素之间的标准间距
  • Small (8vp): 紧凑布局的间距
  • XSmall (4vp): 最小间距

属性扩展

size - 快速设置相同宽高

import { size } from '@core/designsystem';

// 设置 24x24 的正方形
Image($r('app.media.icon'))
  .attributeModifier(size(24));

// 等价于
Image($r('app.media.icon'))
  .width(24)
  .height(24);

增强组件

提供增强版的基础组件,添加了额外的属性和功能。

Column / Row / Scroll

增强版的布局组件,提供更多便捷属性(具体功能需查看源码)。

import { Column, Row, Scroll } from '@core/designsystem';

// 使用增强版组件
Column() {
  // 内容
}

使用场景

  • 布局百分比: 响应式布局、弹性尺寸设置
  • 间距组件: 统一应用内的间距规范,提升 UI 一致性
  • 属性扩展: 简化常用属性设置,减少代码重复
  • 增强组件: 提供更强大的布局能力

设计原则

1. 一致性

使用统一的设计令牌确保整个应用的视觉一致性:

// 好的做法 - 使用设计令牌
Column() {
  Text('标题');
  SpaceVerticalMedium();
  Text('内容');
}

// 不好的做法 - 硬编码数值
Column() {
  Text('标题');
  Blank().height(12);  // 魔法数字
  Text('内容');
}

2. 可维护性

集中管理设计令牌,修改时只需更新一处:

// 如果需要调整标准间距,只需修改 space_vertical_medium 资源
// 所有使用 SpaceVerticalMedium() 的地方都会自动更新

3. 语义化

使用语义化的命名,提高代码可读性:

// 清晰表达意图
SpaceVerticalLarge();  // 大间距

// 而不是
Blank().height(16);    // 不清楚为什么是 16

扩展设计系统

添加新的间距规范

entry/src/main/resources/base/element/float.json 中定义:

{
  "float": [
    {
      "name": "space_vertical_custom",
      "value": "20vp"
    }
  ]
}

然后在 Spacer.ets 中添加对应的组件:

@Builder
export function SpaceVerticalCustom(): void {
  Blank().height($r("app.float.space_vertical_custom"));
}

添加新的属性扩展

在 CommonAttribute.ets 中添加新的属性修饰器:

export function padding(value: Length): AttributeModifier<CommonAttribute> {
  return {
    applyNormalAttribute: (instance: CommonAttribute): void => {
      instance.padding(value);
    }
  };
}

最佳实践

1. 优先使用设计令牌

// 推荐
.width(P100)
.padding(SpaceHorizontalMedium())

// 避免
.width('100%')
.padding(12)

2. 保持间距一致

在同一层级的元素间使用相同的间距:

Column() {
  Text('项目 1');
  SpaceVerticalMedium();
  Text('项目 2');
  SpaceVerticalMedium();
  Text('项目 3');
}

3. 响应式布局

结合百分比常量实现响应式布局:

Row() {
  Column()
    .width(P30)  // 左侧 30%

  Column()
    .width(P70)  // 右侧 70%
}

导入方式

// 百分比常量
import { P0, P25, P50, P75, P100 } from '@core/designsystem';

// 间距组件
import {
  SpaceVerticalLarge,
  SpaceVerticalMedium,
  SpaceHorizontalLarge,
  SpaceHorizontalMedium
} from '@core/designsystem';

// 属性扩展
import { size } from '@core/designsystem';

// 增强组件
import { Column, Row, Scroll } from '@core/designsystem';

依赖关系

  • entry/resources: 依赖应用资源文件中定义的间距值
  • 无其他核心模块依赖,可独立使用