<div align="center">
# ZSUI
**Rust 原生桌面 UI 框架**
用同一份 Rust 状态、消息和界面声明构建 Windows、macOS 与 Linux 应用。
[](https://crates.io/crates/zsui)
[](https://docs.rs/zsui)
[](https://github.com/qiu7824/zsui/actions/workflows/ci.yml)
[](https://github.com/qiu7824/zsui/blob/main/LICENSE)
[简体中文](https://github.com/qiu7824/zsui/blob/main/README.md) · [English](https://github.com/qiu7824/zsui/blob/main/README.en.md)
</div>
ZSUI 使用真实的系统窗口和平台服务,在窗口内绘制由框架管理的控件。
应用通过 `State → view → Msg → update` 更新界面,平台后端负责窗口事件、
文字、绘制、输入法和系统集成。当前版本为 **`0.3.0-alpha.2`**,属于预发布版本。
[快速开始](#快速开始) · [Cargo features](#cargo-features) · [平台能力](#平台与能力边界) · [示例](#运行示例) · [文档](#文档导航)
## 能力概览
- **一份应用代码**:共享状态、消息、布局和组件声明,使用 Win32、AppKit 或 Linux 原生宿主。
- **按需编译**:控件、系统服务和后端通过 Cargo feature 选择,默认启用 `window`、`button` 和 `label`。
- **显式状态与身份**:类型化消息、强类型 ID、受控输入和稳定的组件身份。
- **平台视觉**:语义主题、系统字体、图标、DPI 和平台组件参数共同决定最终界面。
- **开发与发布两条路径**:直接编写 Rust View,或使用可校验、可热重载、可嵌入的 UI 文档。
- **真实窗口验证**:CI 运行目标平台应用,保留最终窗口截图及布局、输入、焦点等结构化报告。
组件目录包含 **47 个组件家族的运行实现**。各组件的交互、辅助功能和平台覆盖
仍有差异,具体范围见[组件目录](https://github.com/qiu7824/zsui/blob/main/src/component_catalog.rs)。
## 界面预览
Gallery 在三个桌面平台上的实际窗口截图:
<table>
<tr><th>Windows · Win32</th><th>macOS · AppKit</th><th>Linux · X11</th></tr>
<tr>
<td><img src="https://raw.githubusercontent.com/qiu7824/zsui/main/docs/images/component-gallery-preview7-windows.png" alt="Windows Win32 组件界面" width="320"></td>
<td><img src="https://raw.githubusercontent.com/qiu7824/zsui/main/docs/platform-proof/macos/gallery-inputs-light.png" alt="macOS AppKit 组件界面" width="320"></td>
<td><img src="https://raw.githubusercontent.com/qiu7824/zsui/main/docs/platform-proof/linux/gallery-inputs-light.png" alt="Linux X11 组件界面" width="320"></td>
</tr>
</table>
截图展示各平台的组件布局与视觉;窗口尺寸不同,逐像素比较应使用固定场景的验证报告。
更多记事本、计算器、组件与框架对比图见[示例图库](https://github.com/qiu7824/zsui/blob/main/docs/gallery.md)。
## 快速开始
在 Rust 二进制项目的 `Cargo.toml` 中添加:
```toml
[dependencies]
zsui = "0.3.0-alpha.2"
```
将下面的代码保存为 `src/main.rs`:
```rust,no_run
#![cfg_attr(all(windows, not(debug_assertions)), windows_subsystem = "windows")]
use zsui::prelude::{button, column, text, window, Dp, Element, UpdateContext};
#[derive(Clone)]
enum Message {
Increment,
}
struct State {
count: u32,
}
fn view(state: &State) -> Element<Message> {
column([
text(format!("Count: {}", state.count)),
button("Increment").on_click(Message::Increment),
])
.gap(Dp::new(12.0))
.padding(Dp::new(20.0))
}
fn update(state: &mut State, message: Message, _cx: &mut UpdateContext<'_>) {
match message {
Message::Increment => state.count += 1,
}
}
fn main() -> Result<(), zsui::stable::Error> {
window("ZSUI")
.size(480, 320)
.stateful(State { count: 0 }, view, update)
.run()
}
```
```sh
cargo run
```
按钮产生 `Message`,`update` 修改应用状态,运行时随后重建界面并重绘。
普通应用从 `zsui::prelude` 或 `zsui::stable` 导入;接口兼容范围见
[API 稳定性](https://github.com/qiu7824/zsui/blob/main/docs/api-stability.md)。
### 构建环境
使用当前稳定版 Rust 工具链及对应平台的本地开发工具:
| Windows | MSVC 工具链、Visual Studio Build Tools 的 C++ 构建工具与 Windows SDK |
| macOS | Xcode Command Line Tools |
| Linux 默认后端 | C/C++ 构建工具、pkg-config、D-Bus、Cairo 和 Pango 开发包 |
| Linux GTK4 后端 | 在对应构建环境中额外安装 GTK4 4.10 或更新版本的开发包 |
Ubuntu 24.04 的默认 Linux 后端依赖可安装为:
```sh
sudo apt-get install build-essential pkg-config libdbus-1-dev libcairo2-dev libpango1.0-dev
```
选择 `linux-gtk` 时还需要 `libgtk-4-dev`。其他发行版安装对应开发包。
后端选择与移植约束见[平台移植](https://github.com/qiu7824/zsui/blob/main/docs/porting.md)。
## Cargo features
默认配置提供窗口、按钮与文本。需要额外控件时按功能启用:
```toml
[dependencies]
zsui = { version = "0.3.0-alpha.2", default-features = false, features = [
"window", "button", "label", "textbox", "clipboard", "dialog",
] }
```
| 窗口与后端 | `window`、`windows-win32`、`macos-appkit`、`linux-direct`、`linux-direct-lite`、`linux-gtk` |
| 基础界面与布局 | `button`、`label`、`icon`、`grid`、`scroll`、`split-view`、`resize` |
| 文本与数值输入 | `textbox`、`password-box`、`number-box`、`auto-suggest`、`command-palette` |
| 选择与日期 | `checkbox`、`toggle`、`toggle-button`、`radio`、`slider`、`combo`、`date-picker`、`time-picker`、`color-picker` |
| 集合 | `list`、`virtual-list`、`paged-list`、`grid-view`、`tree`、`table` |
| 弹层与反馈 | `dialog`、`flyout`、`menu-flyout`、`context-menu`、`tooltip`、`toast`、`info-bar`、`teaching-tip`、`progress`、`progress-ring` |
| 组合组件 | `shell`、`document-shell`、`tabs`、`accordion`、`breadcrumb`、`badge`、`calculator` |
| 媒体 | `image`、`image-preview`、`video` |
| 系统与主题 | `clipboard`、`tray`、`hotkey`、`settings`、`style`、`dark-mode`、`localization` |
| 辅助功能 | `accessibility`、`linux-direct-accessibility` |
| UI 文档与工具 | `ui-document`、`ui-document-runtime`、`ui-viewer` |
| 汇总配置 | `all-widgets`、`full` |
`window` 通过目标平台依赖选择默认桌面宿主。Linux 默认使用 `linux-direct`;
选择 GTK4 或 `linux-direct-lite` 时,关闭默认 features 并显式选择后端,避免同时
带入默认 Linux 渲染栈。`linux-direct-lite` 使用 tiny-skia 和框架的 Rust 文字引擎。
`accessibility` 提供共享语义及 Win32、AppKit、GTK4 桥接;Linux Direct 的
AccessKit/AT-SPI 桥接另外启用 `linux-direct-accessibility`。
Cargo features 在依赖图中取并集,`full` 会开启广泛的控件、后端和验证能力,
适合框架验证;应用应选择自己使用的功能。项目目前以单个 crate 发布。
## 平台与能力边界
| Windows | Win32 窗口、缓冲 GDI/GDI+ 绘制,默认使用 Rust 文字引擎 | IME、UI Automation、剪贴板、文件面板、菜单、托盘 |
| macOS | NSApplication/NSWindow、AppKit/Core Graphics、Core Text | NSTextInputClient、NSAccessibility、剪贴板、文件面板、菜单、NSStatusItem |
| Linux | 默认 Wayland/X11 + Softbuffer + Cairo/Pango;可选 tiny-skia 或 GTK4 宿主 | IME、剪贴板、XDG portal、菜单;AT-SPI 由所选辅助功能桥接提供 |
| Android | 宿主、生命周期与 FFI 契约 | Activity 运行实现和真机验证仍待完成 |
控件由 ZSUI 在原生窗口中绘制;平台宿主提供系统窗口、事件循环和桌面服务,
组件布局与视觉参数由各平台实现管理。系统服务的可用范围随后端和桌面环境变化,
以能力报告及操作返回值为准。Linux Direct 的托盘宿主尚未接入统一事件循环。
应用使用语义图标。Windows 使用系统图标字体,macOS 使用 SF Symbols;
Linux 默认使用内置符号图形,精确的桌面图标主题解码通过 `linux-system-icons` 启用。
SVG 回退及许可见[平台图标](https://github.com/qiu7824/zsui/blob/main/docs/native-icons.md)。
输入法协议、光标几何和辅助功能桥接有自动化验证;真实候选窗位置与
Narrator/NVDA、VoiceOver、Orca 的朗读和焦点体验还需目标环境人工检查。
触摸与惯性滚动、复杂富文本、部分集合控件的编辑/虚拟化,以及 Android 运行时
仍在扩展。组件与平台的运行实现、目标验证和完整体验分别记录。
## 状态、后台任务与资源
应用拥有业务状态,界面通过类型化消息更新。普通控件可使用结构路径生成的自动身份;
列表重排、跨组件引用或外部定向操作应提供显式稳定 ID。
后台任务使用窗口的 `InvalidationHandle` 请求重建。请求会合并,并由原生 UI 线程
执行状态化界面重建。文件操作、异步任务与原生服务的使用见
[应用效果与命令](https://github.com/qiu7824/zsui/blob/main/docs/app-effects.md)。
文字引擎使用按条目及字节限制的布局/字形缓存,并定期老化成形 run。
这些上限约束对应的框架缓存;应用数据、系统字体和平台资源仍有各自的生命周期。
窗口可选择 `release_view_when_hidden()` 释放隐藏期间的界面资源;Wayland 等宿主对
主动隐藏、恢复和焦点请求有平台限制。详见
[文字渲染](https://github.com/qiu7824/zsui/blob/main/docs/text-rendering.md)、
[桌面运行约束](https://github.com/qiu7824/zsui/blob/main/docs/desktop-hardening-plan.md)。
## UI 文档与原生 Viewer
`ui-document` 定义版本化的语义组件树和类型化绑定清单。Rust 持有状态与消息,
文档描述组件、布局、主题、本地化键、辅助功能和稳定节点 ID。
- `zsui-uic check`:检查 schema、features、属性、节点身份和绑定类型。
- `zsui-viewer`:在原生窗口中重载有效文档,保留兼容的焦点、选择、滚动和控件状态。
- `zsui-uic embed` 与 `ui-document-runtime`:将验证后的文档嵌入发布应用,按所用组件裁剪。
在仓库根目录运行校验器或 Viewer:
```sh
cargo run --locked --bin zsui-uic --no-default-features --features ui-document,button,label -- check examples/ui-documents/basic.json --bindings examples/ui-documents/basic.bindings.json
cargo run --locked --bin zsui-viewer --no-default-features --features ui-viewer -- examples/ui-documents/basic.json --bindings examples/ui-documents/basic.bindings.json --values examples/ui-documents/basic.values.json
```
Viewer 编译后,保存兼容的文档修改即可更新同一个窗口,无需重新调用 Cargo。
正式应用使用 `ui-document-runtime`,Viewer 的轮询、开发诊断和全组件配置属于独立工具。
格式、绑定、密码安全通道与发布嵌入见
[UI Document](https://github.com/qiu7824/zsui/blob/main/docs/ui-document.md)。
## 运行示例
克隆仓库后,在仓库根目录执行:
```sh
cargo run --locked --example stable_api
cargo run --locked --example component_gallery --no-default-features --features component-gallery-demo
cargo run --locked --example zsui_notepad --no-default-features --features notepad-demo
cargo run --locked --example zsui_calculator --no-default-features --features calculator-demo
```
| `component_gallery` | 组件、主题和平台布局 | [图库](https://github.com/qiu7824/zsui/blob/main/docs/gallery.md) |
| `zsui_notepad` | 同一份三平台记事本、编辑命令与文件面板 | [记事本](https://github.com/qiu7824/zsui/blob/main/docs/notepad-demo.md) |
| `zsui_calculator` | Decimal 运算、内存与历史、自适应键盘 | [计算器](https://github.com/qiu7824/zsui/blob/main/docs/calculator-demo.md) |
| `resizable_layout` | 导航栏、SplitView 与 DataGrid 的受控尺寸 | [可调整布局](https://github.com/qiu7824/zsui/blob/main/docs/resizable-layout.md) |
| `paged_virtual_list` | 后台分页、预取、稳定滚动锚点和 LRU 页缓存 | [分页虚拟列表](https://github.com/qiu7824/zsui/blob/main/docs/paged-virtual-list.md) |
| `image_preview` | 后台 PNG 解码、请求合并与完整帧切换 | [图片预览](https://github.com/qiu7824/zsui/blob/main/docs/image-preview.md) |
`video` 接收应用提供的最新像素帧并处理布局与呈现;摄像头采集、编解码、音频、
拖动进度和字幕由媒体适配层负责。接口范围见
[视频与帧源](https://github.com/qiu7824/zsui/blob/main/docs/video.md)。
## 文档导航
| 架构与职责 | [架构](https://github.com/qiu7824/zsui/blob/main/docs/architecture.md) · [框架目标](https://github.com/qiu7824/zsui/blob/main/docs/framework-goals.md) |
| API 与兼容性 | [Rustdoc](https://docs.rs/zsui) · [API 稳定性](https://github.com/qiu7824/zsui/blob/main/docs/api-stability.md) |
| 布局、主题与平台视觉 | [平台设计契约](https://github.com/qiu7824/zsui/blob/main/docs/platform-design-contracts.md) · [可调整布局](https://github.com/qiu7824/zsui/blob/main/docs/resizable-layout.md) |
| 本地化 | [Fluent 与语言切换](https://github.com/qiu7824/zsui/blob/main/docs/localization.md) |
| 输入与辅助功能 | [输入体验](https://github.com/qiu7824/zsui/blob/main/docs/v0.3-input-experience.md) · [人工检查清单](https://github.com/qiu7824/zsui/blob/main/docs/quality/manual-assistive-technology-checklist.md) |
| 原生验证 | [Native Proof CI](https://github.com/qiu7824/zsui/blob/main/docs/v0.3-native-proof-ci.md) · [目标机验证](https://github.com/qiu7824/zsui/blob/main/docs/native-host-smoke.md) |
| 性能测量 | [四档性能矩阵](https://github.com/qiu7824/zsui/blob/main/docs/ui-performance-matrix.md) · [应用对比](https://github.com/qiu7824/zsui/blob/main/docs/invoice-tool-comparison.md) |
| 分发与更新 | [安装包、签名与更新清单](https://github.com/qiu7824/zsui/blob/main/docs/distribution.md) |
| 发布记录 | [0.3.0-alpha.2](https://github.com/qiu7824/zsui/blob/main/docs/releases/v0.3.0-alpha.2.md) |
性能文档按平台、构建 features、窗口场景和工作负载记录结果。
Minimal、Common、Full Native App 与 Viewer 分别测量,比较时应保持相同条件。
## 开发与验证
```powershell
cargo fmt --all -- --check
cargo test --locked --no-default-features
cargo test --locked --features full
cargo check --locked --manifest-path tools/native-proof/Cargo.toml
.\scripts\check-native-boundary.ps1 -Locked
.\scripts\check-feature-matrix.ps1 -Locked
```
CI 还运行桌面目标编译、原生交互、最终表面截图和 ARM64 验证。
贡献代码前阅读[开发入口](https://github.com/qiu7824/zsui/blob/main/docs/ai-agent.md),
按模块加载对应上下文和检查命令。
## 支持与许可证
ZSUI 使用 [MPL-2.0](https://github.com/qiu7824/zsui/blob/main/LICENSE)。
内置 Fluent System Icons SVG 回退资源使用 MIT 许可证,详见
[第三方许可](https://github.com/qiu7824/zsui/blob/main/THIRD_PARTY_NOTICES.md)。
欢迎通过 [GitHub Star](https://github.com/qiu7824/zsui) 或赞赏支持项目。
<details>
<summary>赞赏支持</summary>

</details>
[](https://github.com/qiu7824/zsui/stargazers)