本文定义 Web Pixel UI Engine(WPUIE)的 CSS 公共 API。它是后续 CSS 重构、示例和组件文档的命名依据。
当前仓库中的部分选择器仍然属于历史 API。本次只确定目标规范,不立即删除旧选择器;迁移工作需要在补齐测试和兼容策略后单独进行。
- CSS 负责视觉表现,HTML 负责语义和原生行为。
- 视觉变体使用 class,真实状态优先使用原生属性、伪类和 ARIA 状态。
- 所有新的公共 class 使用
pui-命名空间。 - 不发布无命名空间的通用 class,也不使用纯视觉自定义 HTML 属性。
- CSS 变量是主题和组件定制的主要入口。
- JavaScript 可以增强交互,但不改变 CSS-only 用户的基础用法。
.pui 是一个特殊的基础启用 class,用于原生 HTML 控件的 WPUIE 样式入口。除此之外,公共 class 都以 pui- 开头。
| 用途 | 命名形式 | 示例 |
|---|---|---|
| 原生控件基础样式 | .pui |
button.pui |
| 组件 | .pui-{component} |
.pui-btn、.pui-dialog |
| 可复用视觉变体 | .pui-{variant} |
.pui-primary、.pui-success |
| 组件专属变体 | .pui-{component}-{variant} |
.pui-btn-compact |
| 组件状态 | .pui-is-{state} |
.pui-is-loading、.pui-is-open |
| 明确的视觉工具类 | .pui-{property}-{value} |
.pui-border-2 |
命名选择遵循以下规则:
- 能跨多个组件复用的视觉能力使用
.pui-{variant},例如颜色主题和边框风格。 - 只适用于一个组件的能力使用
.pui-{component}-{variant},避免产生含义过宽的公共 class。 - 状态 class 只用于自定义组件或 JavaScript 管理的状态;原生控件优先使用
:disabled、:checked、:read-only等原生状态。 - 工具类只在有明确、稳定的使用场景时增加,不把每个 CSS 属性都暴露成 class。
- 同一种能力只保留一种推荐写法,不同时维护多个等价的公共 class。
<button class="pui pui-primary pui-border-2">
Save
</button>
<a class="pui-btn pui-success" href="/save">
Save
</a>
<div class="pui-dialog pui-is-open" role="dialog" aria-modal="true">
Content
</div>上面的 class 只表达视觉或组件实现。真实的禁用、选中、展开等语义仍然应该写在 HTML 属性上:
<button class="pui pui-primary" disabled>Save</button>
<details class="pui-details" open>...</details>以下属性表达 HTML 或无障碍语义,不应被视觉 class 替代:
disabled、checked、selected、open、required、readonly;aria-expanded、aria-selected、aria-checked、aria-disabled等真实的 ARIA 状态;- 原生元素本身定义的属性,例如
type、name、value和合法的size。
CSS 应根据这些属性或伪类绘制状态。JavaScript 更新状态时,也必须同步更新对应的 DOM 属性或 ARIA 状态。
size、bsize、fill、animation、inline、at-after 等仅用于改变外观的自定义属性不作为新的公共 API。它们应逐步迁移到带 pui- 前缀的 class 或 CSS 变量。
data-pui-* 只用于 JavaScript 初始化、内部协议或调试信息,不作为主要视觉配置入口。文档中的视觉示例不应依赖它们。
公共 CSS 变量统一使用 --pui- 前缀:
:root {
--pui-primary: #209cee;
--pui-primary-hover: #108de0;
--pui-primary-shadow: #006bb3;
}
.my-button {
--pui-btn-background: var(--pui-primary);
--pui-btn-border-width: 4px;
}- 主题 token 使用
--pui-{token}; - 组件公开参数使用
--pui-{component}-{property}; - 未加
pui命名空间的自定义属性不应作为公共定制接口; - 实现内部变量不保证兼容,不能写入组件文档或示例。
CSS 变量用于连续值和主题值,例如颜色、尺寸、间距、边框宽度。离散的视觉选择使用 class,例如 pui-primary 和 pui-border-2。
新的公共样式应满足以下约束:
- 组件样式必须由明确的 WPUIE class 进入,例如
.pui-dialog或button.pui; - 不使用裸的
input[type=checkbox]、button等全局选择器改变未启用 WPUIE 的原生控件; - 原生状态选择器可以组合在组件 class 后面,例如
.pui-dialog[open]; - 组件内部实现应尽量降低选择器层级,并通过 Cascade Layers 管理覆盖顺序。
旧 API 在过渡期可以保留兼容选择器,但新文档、测试和示例只使用以下目标写法:
| 旧写法 | 目标写法 |
|---|---|
.primary、.success、.warning、.error |
.pui-primary、.pui-success、.pui-warning、.pui-error |
.inline |
.pui-inline |
.fill |
.pui-fill 或对应组件的 pui-{component}-fill |
.at-after |
.pui-at-after |
.animation |
.pui-animation |
.resizer、.resizer2 |
.pui-resizer、.pui-resizer-2 |
bsize="1"、bsize="2" |
.pui-border-1、.pui-border-2 |
视觉上的 .disabled |
原生 disabled,或自定义组件的 .pui-is-disabled |
迁移时应先增加新选择器和回归测试,再决定旧写法的弃用周期。不能在没有兼容说明的情况下直接改变已有 class 的含义。
CSS API 的第一版实现至少应满足:
- 新增的公共 class 全部带
pui-前缀; - 文档和示例不依赖无命名空间的视觉 class 或自定义视觉属性;
- 原生控件在未添加 WPUIE class 时保持浏览器默认样式;
disabled、checked、open等真实状态仍由 HTML/ARIA 表达;- 主题和组件可调参数均有稳定的
--pui-*入口; - 新旧 API 的兼容选择器有明确测试覆盖。