From 2b1fb15242efa50dfec79d88e9c9b5b1b9430f3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:20:03 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E8=A8=80=E7=95=8C1.0=E5=AE=89=E8=A3=85=E4=B8=8E?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/configuration.mdx | 9 ++++++--- content/docs/ecosystem/desktop/quick-start.mdx | 15 +++++++++------ ...16\247\344\273\266\345\261\225\347\244\272.yx" | 2 +- "examples/desktop/\350\250\200\345\272\217.toml" | 6 +++--- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/content/docs/ecosystem/desktop/configuration.mdx b/content/docs/ecosystem/desktop/configuration.mdx index dc1adbc..13ca506 100644 --- a/content/docs/ecosystem/desktop/configuration.mdx +++ b/content/docs/ecosystem/desktop/configuration.mdx @@ -3,11 +3,12 @@ title: 项目配置与权限 description: 固定言界、言台和言据版本,并为 GUI 系统服务声明最小权限。 --- -应用只需要直接依赖言界;言界的锁文件会解析固定的言台`0.1.x`和言据`1.1.x`。正式项目应固定 Git 标签并提交`言序.lock`: +应用只需要直接依赖言界;言界 1.0 的锁会解析言台`1.0.x`和言据`1.1.x`。正式项目应固定 +Git 标签并提交每个目标独立生成的`言序.lock`: ```toml [依赖] -言界 = { 包 = "yanxu-ui", git = "https://github.com/yanxulang/yanxu-ui.git", 修订 = "v0.1.1", 版 = "^0.1" } +言界 = { 包 = "yanxu-ui", git = "https://github.com/yanxulang/yanxu-ui.git", 修订 = "v1.0.0", 版 = "^1.0" } [权限] 图形界面 = true @@ -25,6 +26,8 @@ description: 固定言界、言台和言据版本,并为 GUI 系统服务声 不使用剪贴板或对话框时,应删除相应权限。图形权限不会自动授予文件、网络、通知、托盘、外部地址或全局快捷键。宿主嵌入应用还会把包权限与宿主上限取交集。 -运行`yanbao update`后,锁文件记录 Git 修订、包内容摘要和当前目标的原生制品摘要。切换目标或平台时要在对应平台重新生成并验证锁文件,不要手工复制另一个架构的动态库。 +运行`yanbao update`后,锁文件记录 Git 修订、包内容摘要、当前目标以及言台原生制品的 ABI、 +SHA-256 和大小。切换目标或平台时要在对应平台重新生成并验证锁文件,不要手工复制另一个 +架构的动态库。言界 1.0 固定消费言台 ABI v2、平台 1.7、事件 1.3、无障碍 1.0 和绘制 1.1。 开发言界本身时可临时使用`路径 = "../yanxu-ui"`;发布应用不得保留工作区路径依赖。 diff --git a/content/docs/ecosystem/desktop/quick-start.mdx b/content/docs/ecosystem/desktop/quick-start.mdx index a0f01d9..a928677 100644 --- a/content/docs/ecosystem/desktop/quick-start.mdx +++ b/content/docs/ecosystem/desktop/quick-start.mdx @@ -1,13 +1,13 @@ --- title: 快速开始 -description: 使用言序 1.1.9、言包 0.5.0 与言界 0.1.1 复现已验证的预览组合。 +description: 使用当前稳定工具链与言界 1.0 创建并运行第一个保留模式桌面应用。 --- - - 本页复现言界 0.1.1 发布时的已验证组合:言序 1.1.9 与言包 0.5.0。言序 1.1.20 会在言界源码的可空目标变量处报告类型错误,言包 0.6.1 也不能运行在 1.1.9 上。使用当前稳定工具链时,请改走[言窗 1.0](/ecosystem/desktop/gui/)。 - +言界 1.0 同时验证最低言序 1.1.9 和当前稳定言序 1.1.20。新项目建议使用言序 1.1.20 与 +言包 0.6.1;依赖锁仍由言序 1.1.9 生成并进入六目标 Release 验收。 -先确认`yanxu --version`为`1.1.9`,`yanbao --version`为`0.5.0`。创建普通言序项目后,在`言序.toml`中加入言界: +先确认`yanxu --version`为`1.1.20`,`yanbao --version`为`0.6.1`。创建普通言序项目后, +在`言序.toml`中加入言界: ```toml [包] @@ -18,7 +18,7 @@ description: 使用言序 1.1.9、言包 0.5.0 与言界 0.1.1 复现已验证 入口 = "src/主.yx" [依赖] -言界 = { 包 = "yanxu-ui", git = "https://github.com/yanxulang/yanxu-ui.git", 修订 = "v0.1.1", 版 = "^0.1" } +言界 = { 包 = "yanxu-ui", git = "https://github.com/yanxulang/yanxu-ui.git", 修订 = "v1.0.0", 版 = "^1.0" } [权限] 图形界面 = true @@ -62,3 +62,6 @@ yanbao run ``` 第一次更新会为当前目标下载锁定的言台原生后端。运行后可在输入框测试中文 IME,再点击“问候”。若只需要显示文字,可继续阅读[创建第一个窗口](/ecosystem/desktop/first-window/);发布独立应用见[打包与发布](/ecosystem/desktop/packaging/)。 + +生产应用应在每个目标系统上重新运行`yanbao update`并提交各自的锁;不能复制其他架构的锁。 +最低工具链只用于验证源码下限,不要求新项目降级当前工具链。 diff --git "a/examples/desktop/\347\273\274\345\220\210\346\216\247\344\273\266\345\261\225\347\244\272.yx" "b/examples/desktop/\347\273\274\345\220\210\346\216\247\344\273\266\345\261\225\347\244\272.yx" index c4ea296..300950e 100644 --- "a/examples/desktop/\347\273\274\345\220\210\346\216\247\344\273\266\345\261\225\347\244\272.yx" +++ "b/examples/desktop/\347\273\274\345\220\210\346\216\247\344\273\266\345\261\225\347\244\272.yx" @@ -2,7 +2,7 @@ 定 应用 为 界面.应用(「言界综合控件展示」); -定 窗口 为 应用.窗口({「标题」:「言界 0.1.1」,「宽」:960,「高」:700,「最小宽」:720,「最小高」:520}); +定 窗口 为 应用.窗口({「标题」:「言界 1.0」,「宽」:960,「高」:700,「最小宽」:720,「最小高」:520}); 定 主列 为 窗口.列({「内边距」:18,「间距」:10}); diff --git "a/examples/desktop/\350\250\200\345\272\217.toml" "b/examples/desktop/\350\250\200\345\272\217.toml" index 59e5fc8..adcaeb3 100644 --- "a/examples/desktop/\350\250\200\345\272\217.toml" +++ "b/examples/desktop/\350\250\200\345\272\217.toml" @@ -1,18 +1,18 @@ [包] 格式 = 2 名称 = "言序文档图形示例" -版本 = "0.1.0" +版本 = "1.0.0" 言序 = ">=1.1.9" 入口 = "自动关闭冒烟.yx" [依赖] -言界 = { 包 = "yanxu-ui", git = "https://github.com/yanxulang/yanxu-ui.git", 修订 = "v0.1.1", 版 = "^0.1" } +言界 = { 包 = "yanxu-ui", git = "https://github.com/yanxulang/yanxu-ui.git", 修订 = "v1.0.0", 版 = "^1.0" } [应用] 类型 = "图形" 名称 = "言序文档图形示例" 标识 = "dev.yanxu.docs-gui-examples" -版本 = "0.1.0" +版本 = "1.0.0" [应用.窗口] 宽 = 960 From 2976c39bb518c4732da18163682e637045fa47ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:22:44 +0800 Subject: [PATCH 02/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=B0=86?= =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E5=85=A5=E5=8F=A3=E5=8D=87=E7=BA=A7=E4=B8=BA?= =?UTF-8?q?=E5=8F=8C=E7=A8=B3=E5=AE=9A=E8=B7=AF=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/choosing.mdx | 16 +++++++----- content/docs/ecosystem/desktop/index.mdx | 29 +++++++++++---------- content/docs/ecosystem/desktop/meta.json | 2 +- content/docs/ecosystem/desktop/routes.mdx | 15 ++++++----- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/content/docs/ecosystem/desktop/choosing.mdx b/content/docs/ecosystem/desktop/choosing.mdx index 30b0956..357d28c 100644 --- a/content/docs/ecosystem/desktop/choosing.mdx +++ b/content/docs/ecosystem/desktop/choosing.mdx @@ -3,34 +3,36 @@ title: 选择 GUI 路线 description: 根据项目阶段、控件需求、稳定性与定制程度选择言窗或言界。 --- -当前稳定言序 1.1.20 与言包 0.6.1 的新项目应选择言窗 1.0。言界 0.1.1 只保留言序 1.1.9 + 言包 0.5.0 的已验证预览组合;在新版本发布前,不要把它与当前工具链混装。 +言窗 1.0 和言界 1.0 都支持六个正式桌面目标。新项目使用当前言序 1.1.20 与言包 0.6.1 +即可评估两条路线;选择依据是编程模型和能力边界,不是稳定/预览之分。 ## 直接选择言窗 -以下情况优先使用稳定的[`yanxu-gui` 1.0](/ecosystem/desktop/gui/): +以下情况优先使用[`yanxu-gui` 1.0](/ecosystem/desktop/gui/): - 现有应用已经上线,当前控件和主题足够; - 希望依赖成熟的 egui 生态与立即模式开发方式; -- 需要言界`0.1.1`尚未提供的复杂控件; -- 不希望在首版阶段承担新 API 迭代成本。 +- 需要言界 1.0 尚未提供的表格、树、富文本或代码编辑器成品控件; +- 希望直接采用 egui 已有组件和立即模式扩展方式; - 需要由 CI 汇总并校验的 Windows、macOS、Linux 六目标原生制品。 ## 选择言界 -以下情况适合`yanxu-ui`: +以下情况适合[`yanxu-ui` 1.0](/ecosystem/desktop/quick-start/): - 新项目希望所有高级控件行为都由言序实现; - 需要保留模式控件树、状态绑定和捕获/冒泡事件; - 需要自定义主题、布局、语义树或绘制命令; - 希望平台差异集中在独立的`yanxu-platform`边界; -- 未来计划实现设计系统、复杂表单或可组合业务组件。 +- 需要叠层菜单、复杂表单、虚拟列表、动画、原生无障碍语义或可组合业务组件; +- 需要版本化运行诊断、资源配额和结构化关闭报告。 ## 决策检查表 | 问题 | 若回答“是” | | --- | --- | | 已有言窗应用是否稳定上线? | 保持言窗 1.x | -| 是否依赖言界首版没有的控件? | 保持言窗或先验证自定义控件 | +| 是否依赖言界 1.0 没有的成品控件? | 选择言窗或先验证自定义控件 | | 是否必须控制事件传播和焦点顺序? | 选择言界 | | 是否要用言据集中描述主题? | 选择言界 | | 是否要直接调用操作系统句柄? | 两条上层路线都不适合;应贡献言台通用能力 | diff --git a/content/docs/ecosystem/desktop/index.mdx b/content/docs/ecosystem/desktop/index.mdx index da9d7ad..c6a6553 100644 --- a/content/docs/ecosystem/desktop/index.mdx +++ b/content/docs/ecosystem/desktop/index.mdx @@ -1,20 +1,20 @@ --- title: 图形界面概览 -description: 在稳定言窗 1.0 与言界、言台保留模式路线之间选择原生桌面 GUI。 +description: 在稳定言窗 1.0 与言界 1.0 保留模式路线之间选择原生桌面 GUI。 --- -言序提供两条并行的原生桌面路线。**言窗 1.0**直接以 ABI v2 封装 eframe/egui 与 -winit,适合需要稳定、完整控件和六目标发布的应用;**言界 + 言台**把高级控件保留在 -言序代码中,提供保留模式控件树和更强的主题/组合能力。两条路线都创建真实窗口,不 -依赖浏览器、Electron、WebView 或 DOM。 +言序提供两条并行的稳定原生桌面路线。**言窗 1.0**直接以 ABI v2 封装 eframe/egui 与 +winit,适合立即模式开发和 egui 控件生态;**言界 1.0 + 言台 1.0**把高级控件保留在 +言序代码中,提供保留模式控件树、确定的事件传播和可组合主题。两条路线都创建真实窗口, +不依赖浏览器、Electron、WebView 或 DOM。 ![言序原生 GUI 两条路线架构图](/desktop-architecture.svg) - - + + ## 平台范围 @@ -22,13 +22,14 @@ winit,适合需要稳定、完整控件和六目标发布的应用;**言界 | 路线 | 版本 | 最低言序 | Windows | macOS | Linux GNU | | --- | ---: | ---: | --- | --- | --- | | 言窗 `yanxu-gui` | 1.0.0 | 1.1.12 | x86-64 / ARM64 | x86-64 / ARM64 | x86-64 / ARM64 | -| 言界 0.1.1 + 言台 0.1.0 | 0.1.x | 1.1.9 | x86-64 / ARM64 | x86-64 / ARM64 | x86-64 / ARM64 | +| 言界 + 言台 | 1.0.0 | 1.1.9 | x86-64 / ARM64 | x86-64 / ARM64 | x86-64 / ARM64 | -言窗 1.0 的 Linux GNU 制品最高需要 glibc 2.39;不支持 musl、WebAssembly、移动平台 -或 32 位目标。言界/言台有独立版本和兼容文档,升级一条路线不会隐式升级另一条。 +言窗 1.0 的 Linux GNU 制品最高需要 glibc 2.39;两条路线都不支持 musl、WebAssembly、 +移动平台或 32 位目标。言界 1.0 的正式 YXB 使用言序 1.1.20 构建,同时保留言序 1.1.9 +源码兼容门禁。言界、言台与言窗各自版本化,升级一条路线不会隐式升级另一条。 - - 言界 0.1.1 的发布门禁只验证言序 1.1.9;其源码目前不能通过言序 1.1.20 的静态检查,言包 0.6.1 又要求核心至少 1.1.17。当前稳定工具链的新项目应选择言窗 1.0。言界页面保留为锁定 1.1.9 + 言包 0.5.0 的预览路线,等待后续言界版本重新建立兼容线。 + + 言界 1.0 已冻结公开 API、言台 1.0 协议组合和六目标发布契约。选型应依据编程模型、控件需求和部署验证,不再需要因工具链兼容缺口回退到言窗。 ## 两条路线的边界 @@ -40,6 +41,6 @@ egui 后端实现。言界中的按钮、输入、列表、布局、状态与事 两条路线不能在同一个原生窗口混用控件树,也不公开操作系统句柄。可在不同应用中并存, 迁移应按独立产品或窗口渐进完成。 -稳定言窗源码与 Release 位于[yanxu-gui](https://github.com/yanxulang/yanxu-gui)。另一条 +稳定言窗源码与 Release 位于[yanxu-gui](https://github.com/yanxulang/yanxu-gui)。保留模式 路线位于[yanxu-platform](https://github.com/yanxulang/yanxu-platform)和 -[yanxu-ui](https://github.com/yanxulang/yanxu-ui)。 +[yanxu-ui](https://github.com/yanxulang/yanxu-ui),两个仓库均从`v1.0.0`提供稳定支持。 diff --git a/content/docs/ecosystem/desktop/meta.json b/content/docs/ecosystem/desktop/meta.json index b5bf8db..4eb4393 100644 --- a/content/docs/ecosystem/desktop/meta.json +++ b/content/docs/ecosystem/desktop/meta.json @@ -1,6 +1,6 @@ { "title": "桌面应用", - "description": "生态选读:用言窗或言界构建原生跨平台桌面应用。", + "description": "生态选读:在言窗 1.0 与言界 1.0 之间选择原生跨平台桌面方案。", "pages": [ "index", "routes", diff --git a/content/docs/ecosystem/desktop/routes.mdx b/content/docs/ecosystem/desktop/routes.mdx index 0c814d2..fc0841f 100644 --- a/content/docs/ecosystem/desktop/routes.mdx +++ b/content/docs/ecosystem/desktop/routes.mdx @@ -1,6 +1,6 @@ --- title: 言窗与言界的区别 -description: 比较现有立即模式言窗与新的言序保留模式言界路线。 +description: 比较两条稳定 1.0 桌面路线的立即模式与保留模式编程模型。 --- 两条路线解决同一个“原生桌面应用”问题,但控件归属和编程模型不同。 @@ -9,18 +9,19 @@ description: 比较现有立即模式言窗与新的言序保留模式言界路 | --- | --- | --- | | 控件实现 | egui/eframe 后端提供 | 言序代码提供 | | 模型 | 立即模式 | 保留模式控件树 | -| 成熟度 | 稳定`1.0.0`路线 | 独立的`0.1.x`路线 | +| 稳定线 | `1.0.x` | `1.0.x` | | 自定义控件 | 围绕 egui API 扩展 | 组合控件、渲染树或画布命令 | | 布局与事件 | 后端框架语义 | 言序统一的布局、捕获/目标/冒泡 | | 原生边界 | 包直接封装 egui/eframe/winit | 言界只调用言台平台原语 | -| 迁移要求 | 无 | 可按窗口或新项目渐进采用,不强制迁移 | +| 发布目标 | Windows、macOS、Linux GNU 的 x86-64/ARM64 | Windows、macOS、Linux GNU 的 x86-64/ARM64 | 言界中的按钮不是系统按钮,也不是言台按钮:它的悬停、按下、焦点、键盘激活、布局、状态和绘制都在`yanxu-ui/src`的言序代码里。言台只接收输入事件,并提交最终绘制帧。 ## 兼容承诺 -言窗 1.0 要求言序 1.1.12、格式 2 清单和 ABI v2;言界 0.1.x 有自己的兼容线。两个 GUI -包可以在不同应用中并存;不支持在同一原生窗口内混合两棵控件树。 +言窗 1.0 要求言序 1.1.12、格式 2 清单和 ABI v2。言界 1.0 最低支持言序 1.1.9,正式 +制品使用 1.1.20 构建,并固定消费言台 1.0。两个 GUI 包可以在不同应用中并存;不支持在 +同一原生窗口内混合两棵控件树。 -若已有言窗项目,应先升级到公开 1.0 制品并保持兼容线。只有当新页面需要保留状态、 -深度主题化、可组合控件、确定的事件传播或将控件逻辑留在言序层时,才评估言界。 +已有言窗项目无需迁移。新页面需要保留状态、深度主题化、可组合控件、确定的事件传播或 +希望把控件逻辑留在言序层时,选择言界;依赖 egui 现成控件或立即模式时继续选择言窗。 From a39407b8067716e4a4a9447aaa6d2493c1646cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:24:36 +0800 Subject: [PATCH 03/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E8=A8=80=E5=8F=B01.0=E6=9E=B6=E6=9E=84=E4=B8=8E?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/ecosystem/desktop/backend-guide.mdx | 2 +- .../ecosystem/desktop/capability-matrix.mdx | 18 +++++++-- .../desktop/platform-architecture.mdx | 39 +++++++++++++++---- content/docs/ecosystem/desktop/protocols.mdx | 21 ++++++++-- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/content/docs/ecosystem/desktop/backend-guide.mdx b/content/docs/ecosystem/desktop/backend-guide.mdx index ec68084..f092a33 100644 --- a/content/docs/ecosystem/desktop/backend-guide.mdx +++ b/content/docs/ecosystem/desktop/backend-guide.mdx @@ -22,4 +22,4 @@ description: 在不泄漏系统句柄或下沉高级控件的前提下扩展言 高频新事件必须选择明确策略:连续状态可保留最新,增量滚轮应累积,按键、按钮、IME、拖放与生命周期事件永不合并。新绘制能力优先增加带自描述长度的次版本操作码;改变既有解释才提升主版本。 -完整贡献流程和本地命令见[言台后端指南](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/BACKEND_GUIDE.md)。 +完整贡献流程和本地命令见[言台 1.0 后端指南](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/BACKEND_GUIDE.md)。 diff --git a/content/docs/ecosystem/desktop/capability-matrix.mdx b/content/docs/ecosystem/desktop/capability-matrix.mdx index d36a216..8a5e998 100644 --- a/content/docs/ecosystem/desktop/capability-matrix.mdx +++ b/content/docs/ecosystem/desktop/capability-matrix.mdx @@ -1,6 +1,6 @@ --- title: 平台能力表 -description: 言台 0.1.0 与言界 0.1.1 在六个正式桌面目标上的能力和验证范围。 +description: 言台 1.0 与言界 1.0 在六个正式桌面目标上的能力和生产验证范围。 --- `支持`表示同一公开接口已实现并进入六目标 CI;`桌面验证`表示自动测试可覆盖确定部分,但最终体验还依赖真实用户会话。 @@ -15,12 +15,16 @@ description: 言台 0.1.0 与言界 0.1.1 在六个正式桌面目标上的能 | 实际中文候选窗 | 桌面验证 | 桌面验证 | 桌面验证(IBus/Fcitx5) | | 文件拖放 | 支持 | 支持 | 支持 | | 文本剪贴板 | 支持,需权限 | 支持,需权限 | 支持,需权限 | +| RGBA8 图片剪贴板 | 支持,需权限 | 支持,需权限 | 支持,需权限 | | 文件/目录对话框 | 支持,需权限 | 支持,需权限 | 支持,需权限 | | 系统字体、回退与复杂整形 | 支持 | 支持 | 支持 | | PNG/JPEG 图片 | 支持 | 支持 | 支持 | | CPU 二维绘制 YXDR 1.1 | 支持 | 支持 | 支持 | -| 言界全部首版控件 | 支持 | 支持 | 支持 | -| 原生无障碍桥 | 尚未接入 | 尚未接入 | 尚未接入 | +| 言界 1.0 全部控件 | 支持 | 支持 | 支持 | +| 原生无障碍桥 | UIA | NSAccessibility | AT-SPI | +| 帧反馈与有界动画 | 支持 | 支持 | 支持 | +| 资源配额与结构化关闭 | 支持 | 支持 | 支持 | +| 版本化运行诊断 | 支持 | 支持 | 支持 | | GPU 后端 | 尚未提供 | 尚未提供 | 尚未提供 | ## 六个正式目标 @@ -34,6 +38,12 @@ x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu ``` -每个目标都会核对动态库实际架构、包清单摘要、言序 1.1.9 类型检查、ABI 集成、API 漂移和 Release 构建。真实窗口自动退出在六个执行器运行;Linux 使用 Xvfb 验证 X11 路径,Wayland 与实际输入法会话需另做桌面冒烟。该矩阵是 0.1.1 的发布证据,不代表已经兼容当前核心 1.1.20。 +言台每个目标都会核对动态库实际架构、ABI 导出、包清单摘要、最低言序 1.1.7 集成、真实 +窗口和原生无障碍桥;另外执行 109 项 Rust 测试、协议/ABI 畸形语料、4096 轮事件背压、 +2048 轮资源浸泡、性能预算和零例外依赖审计。 + +言界每个目标同时验证最低言序 1.1.9 与正式构建基线 1.1.20,覆盖 API 漂移、全部公开 +示例、11 条无窗口集成、5 条真实窗口路径、4096 轮交互和 1024 轮资源归零。Linux 使用 +Xvfb 验证 X11 路径;Wayland、实际输入法候选窗和屏幕阅读器最终播报仍需用户桌面验收。 运行时应调用言台`能力查询()`,根据字段判断可选能力;不要只根据操作系统名称猜测。 diff --git a/content/docs/ecosystem/desktop/platform-architecture.mdx b/content/docs/ecosystem/desktop/platform-architecture.mdx index a4febb8..c52204c 100644 --- a/content/docs/ecosystem/desktop/platform-architecture.mdx +++ b/content/docs/ecosystem/desktop/platform-architecture.mdx @@ -1,34 +1,57 @@ --- title: 言台架构 -description: 言台 0.1.0 的 ABI v2、事件、文字、绘制与资源生命周期边界。 +description: 言台 1.0 的 ABI v2、四套机器协议、资源配额与原生无障碍边界。 --- -言台把三套桌面系统收敛为版本化的平台原语。公开言序包装层调用一个 ABI v2 原生模块;原生模块使用`winit 0.30`创建窗口和接收输入,使用`softbuffer`呈现 CPU 像素缓冲、`tiny-skia`栅格化二维图形、`cosmic-text`完成字体回退、整形、测量和命中。 +言台 1.0 把三套桌面系统收敛为版本化的平台原语。公开言序包装层调用一个 ABI v2 原生 +模块;原生模块使用`winit 0.30`创建窗口和接收输入,使用`softbuffer`呈现 CPU 像素缓冲、 +`tiny-skia`栅格化二维图形、`cosmic-text`完成字体回退与整形,并以 AccessKit 接通系统 +无障碍服务。 ```text 言序应用/言界 - │ 资源句柄、原生值、事件批次、YXDR 帧 + │ 资源、原生值、事件批次、语义树、YXDR 帧 ▼ 言台言序包装层 - │ ABI v2(34 项操作) + │ ABI v2(11 个函数、41 项操作、5 类资源) ▼ Rust 公共后端 ├─ winit:窗口、显示器、键盘、指针、IME、拖放 ├─ softbuffer + tiny-skia:表面与 CPU 二维绘制 ├─ cosmic-text:字体匹配、整形、测量、命中、字形 - └─ arboard / rfd:剪贴板与文件对话框 + ├─ AccessKit:UIA、NSAccessibility、AT-SPI + └─ arboard / rfd:文字与图片剪贴板、文件对话框 ``` ## 协议 - 平台 ABI 主版本为`2`;不匹配的主版本拒绝加载。 -- 事件协议为`1.1`,覆盖 36 种应用、窗口、输入、IME、拖放和系统事件。 +- 平台协议为`1.7`,固定能力查询、帧反馈、运行诊断、配额和生命周期语义。 +- 事件协议为`1.3`,覆盖 39 种应用、窗口、输入、IME、拖放、帧和无障碍事件。 +- 无障碍协议为`1.0`,固定 38 个角色、18 个状态、15 个动作和有界语义树。 - 每批事件有数量和字节上限;队列上限为 4096,高频状态在入队前合并。 - 绘制协议`YXDR 1.1`使用一个完整二进制帧,支持清空、裁剪、变换、矩形、圆角、直线、圆、路径、阴影、文字、字形、图片、图层和透明度。 - 协议解码器拒绝损坏缓冲、超限数据和未知主版本;可忽略兼容的未知次版本字段。 ## 所有权与线程 -应用是资源树根。窗口拥有表面和窗口级回调,字体和图片由应用持有;句柄包含代际,释放后的旧句柄不能访问复用槽位。关闭按子到父顺序执行且可重复调用。原生线程只能把事件投递到有界队列,所有言序回调都在 VM 所有者线程泵出。 +应用是资源树根。窗口、计时器、字体和图片都是应用的直接子资源;句柄包含代际,释放后的 +旧句柄不能访问复用槽位。应用可在创建首个子资源或首次运行前下调资源数、持有字节、帧和 +无障碍树配额,之后配额永久冻结。关闭按子到父顺序执行且可重复调用,应用生命周期只沿 +“就绪 → 运行中 → 退出请求 → 已退出 → 已关闭”前进。 -完整实现文档见[言台架构](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/ARCHITECTURE.md)、[平台 API](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/PLATFORM_API.md)、[事件协议](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/EVENT_PROTOCOL.md)和[绘制协议](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/DRAW_PROTOCOL.md)。 +原生事件循环只把事件投递到容量为 4096 的队列,所有言序回调都在 VM 所有者线程泵出。 +离散事件超限会以稳定错误停止循环;指针移动、窗口尺寸和重绘请求会合并。每个窗口只保留 +一个待呈现帧,新帧有界替换未呈现旧帧,并通过提交回执和`帧呈现`事件提供背压反馈。 + +## 生产可观测性 + +`应用.调试快照()`提供事件队列、资源、帧、无障碍桥、配额和生命周期的当前量、高水位、 +累计量与拒绝统计,不包含窗口标题、用户文本、剪贴板内容或原生句柄。窗口语义树在首次 +显示前接入 UIA、NSAccessibility 或 AT-SPI;焦点和动作请求返回事件循环后,会重新校验 +树修订、节点身份、状态、参数和队列容量。 + +完整实现文档见[言台架构](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/ARCHITECTURE.md)、 +[平台 API](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/PLATFORM_API.md)、 +[1.0 协议冻结](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/PROTOCOL_CONTRACT_1_0.md)和 +[资源生命周期](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/RESOURCE_LIFETIME.md)。 diff --git a/content/docs/ecosystem/desktop/protocols.mdx b/content/docs/ecosystem/desktop/protocols.mdx index 563886d..1302f75 100644 --- a/content/docs/ecosystem/desktop/protocols.mdx +++ b/content/docs/ecosystem/desktop/protocols.mdx @@ -8,21 +8,34 @@ description: 平台、事件、绘制和配置协议的当前版本、协商与 | 协议 | 当前版本 | 数据路径 | 主版本规则 | | --- | --- | --- | --- | | 原生 ABI | 2 | 函数、资源、回调和原生值 | 必须精确匹配 | -| 平台协议 | 1.0 | 能力与平台原语 | 主版本不匹配拒绝 | -| 事件协议 | 1.1 | 一批言序典/列/基础值 | 主版本不匹配拒绝 | +| 平台协议 | 1.7 | 能力、平台原语、配额与诊断 | 主版本不匹配拒绝 | +| 事件协议 | 1.3 | 一批言序典/列/基础值 | 主版本不匹配拒绝 | +| 无障碍协议 | 1.0 | 有界语义树、焦点和动作 | 主版本不匹配拒绝 | | 绘制协议 | YXDR 1.1 | 小端版本化二进制完整帧 | 主版本不匹配拒绝 | | 主题配置 | 1 | 言据优先、JSON 兼容 | 主版本不匹配拒绝 | +1.0 机器契约还固定 50 个能力字段、39 个事件、38 个无障碍角色、18 个状态、15 个动作、 +17 个绘制操作码、5 个路径操作码,以及 ABI v2 的 11 个函数、41 项操作和 5 类资源。 + ## 次版本兼容 - 典格式可以增加可选字段,旧消费者忽略未知字段; - 事件协议可以增加名称,旧消费者忽略未知事件并继续处理批次; +- 无障碍协议可以在可忽略位置追加角色、状态或动作,既有编号和参数语义不可复用; - YXDR 可以增加操作码,旧后端按负载长度安全跳过; - 新消费者不能假设旧生产者提供较新的可选字段; - 不得复用已有字段或操作码表达另一种单位或语义。 ## 安全上限 -事件队列 4096;绘制帧 16 MiB、单命令 4 MiB、命令数 65536、状态栈 256;字体 64 MiB;图片单边 16384、解码分配 256 MiB。损坏长度、错误 UTF-8、非有限数字、非零填充和超限输入都返回稳定错误。 +事件队列容量为 4096。单个绘制帧限制 16 MiB、单命令 4 MiB、命令数 65536、状态栈 256; +单窗口无障碍树限制 16384 个节点、深度 64、文字 4 MiB。应用默认硬上限包括 4096 个 +资源、64 个窗口、2048 个计时器、256 张图片和 64 个字体,应用可以在首次使用前下调。 +剪贴板文字限制 16 MiB,RGBA8 图片单边限制 16384、总量 256 MiB。损坏长度、错误 UTF-8、 +非有限数字、非零填充和超限输入都返回稳定错误。 -规范原文见[事件协议](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/EVENT_PROTOCOL.md)、[绘制协议](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/DRAW_PROTOCOL.md)与[言据/JSON 决策](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/ADR-004-yanju-json-compatibility.md)。 +规范原文见[1.0 协议冻结](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/PROTOCOL_CONTRACT_1_0.md)、 +[事件协议](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/EVENT_PROTOCOL.md)、 +[无障碍协议](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/ACCESSIBILITY_PROTOCOL.md)、 +[绘制协议](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/DRAW_PROTOCOL.md)与 +[言据/JSON 决策](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/ADR-004-yanju-json-compatibility.md)。 From 54aa7b237761e2e988d2ddbad2a197aea116f753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:26:08 +0800 Subject: [PATCH 04/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E8=A8=80=E7=95=8C1.0=E6=8E=A7=E4=BB=B6=E4=B8=8EAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/ecosystem/desktop/api-reference.mdx | 23 +++++++----- content/docs/ecosystem/desktop/controls.mdx | 35 +++++++++++++------ .../ecosystem/desktop/ui-architecture.mdx | 28 ++++++++++----- 3 files changed, 59 insertions(+), 27 deletions(-) diff --git a/content/docs/ecosystem/desktop/api-reference.mdx b/content/docs/ecosystem/desktop/api-reference.mdx index fe0c5aa..7c6efdd 100644 --- a/content/docs/ecosystem/desktop/api-reference.mdx +++ b/content/docs/ecosystem/desktop/api-reference.mdx @@ -9,23 +9,30 @@ description: 言界常用公开入口与言台版本化原语的索引。 引「包:言界」为 界面; 引「包:言界/几何」为 几何; 引「包:言界/文本」为 文本; +引「包:言界/数据源」为 数据; 引「包:言界/配置」为 配置; 引「包:言界/错误」为 错误; ``` | 对象 | 常用方法 | | --- | --- | -| 应用 | `窗口`、`主题`、`主题配置`、`监听`、`定时器`、`加载图片`、`运行`、`退出`、`关闭` | -| 窗口 | `行`、`列`、`堆叠`、`网格`、`显示`、`隐藏`、`标题`、`大小`、`关闭时`、`快捷`、`关闭` | -| 通用控件 | `显示`、`启用`、`可聚焦`、尺寸、边距、伸展、样式、监听、捕获、可访问名称/描述、`关闭` | -| 内容控件 | `内容`、`取内容`、`点击`、`变化时`、`选择范围` | -| 容器 | 行、列、堆叠、网格、滚动、列表、标签页、分割面板、菜单、弹出层、画布、图片 | +| 应用 | `窗口`、主题、监听、资源配额、托管定时器/图片、诊断、生命周期、运行、退出、关闭 | +| 窗口 | 容器、显示、标题、大小、快捷、动画、无障碍同步、诊断、生命周期、关闭 | +| 通用控件 | 显示、启用、可聚焦、只读、必填、无效、尺寸、边距、样式、事件、语义、关闭 | +| 表单控件 | 文字、按钮、复选框、单选框、切换、下拉选择、滑块、进度条、输入框 | +| 数据与导航 | 滚动、列表、虚拟列表、标签页、分割面板、菜单、弹出层 | +| 绘制与资源 | 画布、图片、帧反馈动画、托管图片生命周期 | | 系统服务 | 剪贴板读取/写入、打开文件/多个文件、保存文件、选择目录/多个目录 | -完整、由源码快照生成的签名参考见[言界 REFERENCE](https://github.com/yanxulang/yanxu-ui/blob/v0.1.1/docs/REFERENCE.md),叙事 API 见[言界 API](https://github.com/yanxulang/yanxu-ui/blob/v0.1.1/docs/API.md)。 +1.0 冻结 30 个声明、23 个类、7 个包级函数、125 个域和 375 个方法。完整、由源码快照 +生成的签名参考见[言界 REFERENCE](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/REFERENCE.md), +叙事 API 见[言界 API](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/API.md),稳定范围 +见[支持政策](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/SUPPORT.md)。 ## 言台原语 -普通应用只依赖言界。自定义框架、后端调试和协议工具可查阅[言台平台 API](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/PLATFORM_API.md)与[生成签名](https://github.com/yanxulang/yanxu-platform/blob/v0.1.0/docs/API.md)。 +普通应用只依赖言界。自定义框架、后端调试和协议工具可查阅[言台平台 API](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/PLATFORM_API.md)与[生成签名](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/API.md)。 -言台公开应用、窗口、显示器、事件批次、输入法、光标、计时器、字体、文字整形/测量/命中、图片、完整帧提交、剪贴板、文件对话框、协议查询、能力查询和统一错误;不公开任何高级控件或系统句柄。 +言台公开应用、窗口、显示器、事件批次、输入法、光标、计时器、字体、文字整形/测量/命中、 +图片、完整帧与呈现反馈、无障碍语义树、资源配额、剪贴板、文件对话框、协议/能力查询和 +统一错误;不公开任何高级控件或系统句柄。 diff --git a/content/docs/ecosystem/desktop/controls.mdx b/content/docs/ecosystem/desktop/controls.mdx index 2039602..f504677 100644 --- a/content/docs/ecosystem/desktop/controls.mdx +++ b/content/docs/ecosystem/desktop/controls.mdx @@ -1,6 +1,6 @@ --- title: 控件 -description: 使用言界 0.1.1 的基础、输入、导航和绘制控件。 +description: 使用言界 1.0 的表单、数据视图、导航、叠层和绘制控件。 --- 所有高级控件都由言序实现,并共享显示、启用、焦点、尺寸、边距、样式、事件和无障碍接口: @@ -9,23 +9,33 @@ description: 使用言界 0.1.1 的基础、输入、导航和绘制控件。 控件.显示(真); 控件.启用(真); 控件.可聚焦(真); +控件.只读(假); +控件.必填(假); +控件.无效(假); 控件.尺寸(320,44); 控件.外边距(【4,8,4,8】); 控件.可访问名称(「保存文档」); ``` -| 创建方法 | 首版能力 | +| 创建方法 | 1.0 能力 | | --- | --- | | `文字(内容)` | 显示及修改文字 | | `按钮(内容)` | 悬停、按下、焦点、Enter/空格激活和点击 | +| `复选框(内容)` | 二态/混合态、检查语义和变化事件 | +| `单选框(内容,组)` | 同组互斥、方向键循环和选择语义 | +| `切换(内容)` | 鼠标、空格、回车和辅助技术激活 | +| `下拉选择(文字列)` | 有界选项、锚定弹框、键盘导航和设置值 | +| `滑块(配置)` | 横纵拖动、键盘步进、范围夹取和辅助调整 | +| `进度条(配置)` | 确定值或不定忙碌状态 | | `输入框(配置)` | Unicode 单行编辑、选择、剪贴板、撤销与 IME | -| `多行输入框(配置)` | 多行导航、选区与滚动 | -| `滚动(配置)` | 视口、偏移与滚轮 | -| `列表(文字列)` | 虚拟行绘制、选择与变化事件 | -| `标签页(标签列)` | 标签导航和`页(名称)`页面 | -| `分割面板(配置)` | 两个面板及可拖动分隔条 | -| `菜单(项目列)` | 展开、选择与弹出菜单 | -| `弹出层(配置)` | 打开/关闭覆盖层 | +| `多行输入框(配置)` | Unicode 按行选区、可见行绘制和滚动 | +| `滚动(配置)` | 范围夹取、滚轮和无障碍滚动 | +| `列表(文字列)` | 可见行绘制、逐项语义、选择和滚动到 | +| `虚拟列表(数据源,配置)` | 增量加载、缓存、失败状态和自定义行渲染 | +| `标签页(标签列)` | 标签语义、键盘导航和程序选择页 | +| `分割面板(配置)` | 拖动、键盘、程序和辅助技术共用比例路径 | +| `菜单(项目列)` | 子菜单、指针/键盘导航、模态焦点和语义动作 | +| `弹出层(配置)` | 锚定翻转、视口夹取、外部点击和 Escape 关闭 | | `画布(配置)` | 追加言台结构化绘制命令 | | `图片(资源)` | 测量并绘制已加载图片 | @@ -42,4 +52,9 @@ description: 使用言界 0.1.1 的基础、输入、导航和绘制控件。 保存.点击(保存点击); ``` -首版没有表格、树、富文本或代码编辑器成品控件;可先由现有容器和画布组合,或向言界贡献可复用的言序控件。 +下拉选择最多 4096 项,每项最多 65536 UTF-8 字节;普通列表与虚拟列表每次最多生成 256 个 +当前可见语义项目。菜单限制单层 1024 项、总量 4096 项和 16 层深度。所有指针、键盘、 +程序和辅助技术改值路径共用同一状态校验与变化事件。 + +1.0 没有表格、树、富文本或代码编辑器成品控件;可先由现有容器、虚拟列表和画布组合, +或向言界贡献可复用的言序控件。 diff --git a/content/docs/ecosystem/desktop/ui-architecture.mdx b/content/docs/ecosystem/desktop/ui-architecture.mdx index ba3398c..b970b9b 100644 --- a/content/docs/ecosystem/desktop/ui-architecture.mdx +++ b/content/docs/ecosystem/desktop/ui-architecture.mdx @@ -1,22 +1,25 @@ --- title: 言界架构 -description: 言界 0.1.1 的保留模式控件树、布局、事件、文本与渲染管线。 +description: 言界 1.0 的保留模式控件树、数据视图、无障碍、动画与资源生命周期。 --- -言界除调用言台的边界模块外全部使用言序编写。一个窗口拥有一棵长期存在的控件树;属性变化标记布局或绘制脏区,下一帧只重新计算受影响的子树,再把渲染树编码为一个`YXDR`帧提交。 +言界除调用言台的边界模块外全部使用言序编写。一个窗口拥有一棵长期存在的控件树;属性 +变化标记布局、语义或绘制脏区,下一帧只重新计算受影响的子树,再把无障碍语义树和渲染 +树分别作为完整快照提交。 ```text -状态/数据绑定 +状态/数据绑定/增量数据源 ↓ -控件树与组件生命周期 +控件树/叠层栈/组件生命周期 ↓ 约束测量 → 行列/堆叠/网格/滚动布局 ↓ 命中测试 → 捕获 → 目标 → 冒泡 → 焦点/快捷键 + ├─ 稳定控件编号 → 言台无障碍语义树 ↓ 渲染树 + 脏区合并 ↓ -版本化二进制绘制帧 → 言台 +版本化二进制绘制帧 → 帧反馈 → 有界动画 ``` ## 核心子系统 @@ -25,11 +28,18 @@ description: 言界 0.1.1 的保留模式控件树、布局、事件、文本与 - **事件**:命中测试、指针捕获、捕获/目标/冒泡阶段、Tab 焦点顺序和应用快捷键。 - **文本**:Unicode 文档、光标与选区、插入删除、剪切复制粘贴、撤销重做、上下/Home/End、鼠标定位、IME 组合和多行滚动。 - **样式**:浅色、深色和自定义主题;状态样式沿控件树继承;言据优先、JSON 兼容。 -- **渲染**:保留渲染节点、脏区合并、单调时间动画值、图片资源和自定义画布命令。 -- **语义**:控件角色、名称、描述、状态和焦点关系组成可序列化无障碍语义树。 +- **叠层**:锚定、四方向自动翻转、视口夹取、逆序命中、嵌套模态焦点范围和子菜单。 +- **数据**:批次最多 256 项的增量数据源、缓存淘汰、失败状态和只创建可见行的虚拟列表。 +- **渲染与动画**:保留渲染节点、脏区合并、单槽帧背压、呈现反馈驱动动画、图片资源和画布命令。 +- **语义**:稳定控件编号、角色、状态和动作组成有界无障碍树,并接收系统焦点/动作请求。 +- **生命周期**:言台配额协商、托管计时器和图片、单向窗口/应用关闭及结构化关闭报告。 按钮等高级控件完整处理悬停、按下、键盘激活和绘制;言台没有“创建按钮”操作。言界源码也不包含 Win32、AppKit、Wayland、X11 或平台指针分支。 -0.1.1 会按样式名与悬停、按下、焦点、禁用状态位缓存主题解析结果,并缓存基础样式与控件种类样式的合并,避免每个控件在每帧重复深合并。缓存只改变渲染开销,不改变主题字段、继承或状态优先级。 +1.0 会按样式名与悬停、按下、焦点、禁用状态位缓存主题解析结果;主题更新原子清空缓存并 +使窗口重新布局。应用与窗口诊断只汇总编号、数量、状态、帧、动画和生命周期计数,不复制 +窗口标题、控件内容、密码值、回调、无障碍文字树或原生句柄。 -实现细节见[言界架构](https://github.com/yanxulang/yanxu-ui/blob/v0.1.1/docs/ARCHITECTURE.md)与[API 文档](https://github.com/yanxulang/yanxu-ui/blob/v0.1.1/docs/API.md)。 +实现细节见[言界 1.0 架构](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/ARCHITECTURE.md)、 +[API 文档](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/API.md)与 +[生产验收](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/PRODUCTION_VALIDATION.md)。 From 35508283ddeccc2ea124c82064fa47267176890c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:27:53 +0800 Subject: [PATCH 05/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=8F=90?= =?UTF-8?q?=E4=BE=9B1.0=E5=85=BC=E5=AE=B9=E8=BF=81=E7=A7=BB=E4=B8=8E?= =?UTF-8?q?=E6=8E=92=E9=9A=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/ecosystem/desktop/compatibility.mdx | 45 +++++++++++-------- content/docs/ecosystem/desktop/migration.mdx | 33 +++++++++++--- .../ecosystem/desktop/troubleshooting.mdx | 25 ++++++++++- 3 files changed, 76 insertions(+), 27 deletions(-) diff --git a/content/docs/ecosystem/desktop/compatibility.mdx b/content/docs/ecosystem/desktop/compatibility.mdx index 9b89704..26a8f5d 100644 --- a/content/docs/ecosystem/desktop/compatibility.mdx +++ b/content/docs/ecosystem/desktop/compatibility.mdx @@ -1,6 +1,6 @@ --- title: 版本兼容政策 -description: 言界、言台、言序、言包、言据和言窗之间的兼容基线与已知限制。 +description: 言界 1.0、言台 1.0、工具链、协议和言窗之间的稳定兼容边界。 --- ## 言窗 1.0 稳定线 @@ -15,37 +15,44 @@ description: 言界、言台、言序、言包、言据和言窗之间的兼容 言窗 Git 标签保存源码和清单模板;完整六目标包以 1.0.0 Release 归档发布。Linux GNU 制品需要 glibc 2.39,macOS 公开制品仅做临时签名。精确限制见[言窗 1.0](/ecosystem/desktop/gui/)。 -## 言界与言台 0.1 基线 +## 言界与言台 1.0 稳定线 | 组件 | 兼容范围 | 已验证版本 | | --- | --- | --- | -| 言序 | 清单声明`>=1.1.9`;当前可复现基线固定 1.1.9 | 1.1.9 | -| 言包 | 格式 2 清单与锁文件 | 0.5.0 | -| 言台 | `^0.1`,ABI v2 | 0.1.0 | -| 言界 | `^0.1` | 0.1.1 | +| 言序 | 言界源码`>=1.1.9`;正式 YXB 使用当前稳定工具链 | 1.1.9、1.1.20 | +| 言包 | 格式 2 清单、按目标生成的锁文件 | 0.6.1 | +| 言台 | `^1.0`,言序`>=1.1.7, <2.0.0`,ABI v2 | 1.0.0 | +| 言界 | `^1.0` | 1.0.0 | | 言据 | `^1.1` | 1.1.2 | | 言窗 | 独立并行路线 | 1.0.0 | -言界 0.1.1 要求言序 1.1.9,以获得 Windows VM 所有者线程栈修复和按宿主事件隔离的执行步数预算;本站 CI 固定复现该发布基线。言台本身仍兼容`>=1.1.7`,言界的锁定发布继续使用言据 1.1.2。 +言界 1.0 同时验证最低言序 1.1.9 的源码/API 兼容和言序 1.1.20 的正式构建与回放。应用 +通常使用当前稳定工具链;最低版本是兼容下限,不是新项目的推荐降级目标。言界固定消费 +言台 1.0 标签与言据 1.1.2 已审核提交,应用只直接声明言界即可。 -言界清单虽声明`>=1.1.9`,但 0.1.1 源码目前不能通过言序 1.1.20 的静态检查;同时言包 0.6.1 最低要求核心 1.1.17。因此不存在“言序 1.1.20 + 言包 0.6.1 + 言界 0.1.1”的受支持组合。当前稳定工具链使用言窗 1.0;言界等待后续版本修复并重新发布。新路线不会替换、废弃或强制迁移`yanxu-gui`。 +言台 1.0 冻结 ABI v2、平台 1.7、事件 1.3、无障碍 1.0、绘制 1.1 和 70 个稳定错误码。 +言界 1.0 冻结 30 个声明、23 个类、7 个包级函数、125 个域和 375 个方法,并用机器门禁 +证明从`v0.1.0`到`v0.9.0`的已发布 API 仍可调用。两条 GUI 路线互不替换或强制迁移。 ## 版本政策 -- `0.1.x`修订版修复实现和文档,不改变已发布协议字段含义; -- `0.x`次版本可增加方法、控件、能力、事件、绘制操作码或可选字段; -- 删除/重命名公开 API、改变单位/所有权或二进制布局,必须提升相应协议主版本并提供迁移窗口; -- 新增替代接口后,旧接口至少在同一 0.x 次版本线保留并明确标为弃用; -- 言据是首选可读格式,JSON 兼容入口在 0.1 系列不移除。 +- `1.0.x`只接受向后兼容的实现、安全、文档和生产门禁修复; +- 后续`1.x`可以增加可选控件、方法、能力、事件或协议字段,但不能让旧调用新增必需条件; +- 删除/重命名公开 API、收窄参数、扩大旧调用方必须处理的返回类型、改变单位、所有权或 + 二进制布局,必须进入新的包、协议或 ABI 主版本; +- 新增替代接口后,旧接口在整个 1.x 中继续可用并明确标为弃用; +- 言据主题与等价 JSON 入口、事件名称、布局单位和控件创建方法属于 1.x 兼容承诺。 ## 已知限制 -- 跨行选区背景使用保守矩形,文本和 IME 提交语义不受影响; -- 无障碍语义树已生成,但尚未接入三套系统的原生无障碍桥; -- 菜单和弹出层尚无子菜单、完整模态焦点陷阱与屏幕边缘翻转; -- 列表没有公开异步数据源; - 当前使用统一 CPU 二维后端,没有 GPU 后端、隔离离屏图层或任意旋转文字保证; +- 言界 1.0 没有表格、树、富文本或代码编辑器成品控件; +- 数据源不创建线程、网络请求或隐式异步调度;加载器的执行与取消由应用负责; - 系统字体会导致跨系统文字像素差异,像素金图需携带固定字体; -- 文件对话框、剪贴板和真实 IME 候选窗依赖用户桌面会话。 +- 文件对话框、剪贴板、真实 IME 候选窗和屏幕阅读器最终播报依赖用户桌面会话; +- 不支持移动端、Web、musl、32 位目标、全局快捷键、系统托盘或打印。 -升级前检查两个项目的 CHANGELOG、Release notes、协议主/次版本和目标锁文件;不要只修改包版本而保留旧原生摘要。 +升级前检查两个项目的 CHANGELOG、Release notes、协议主/次版本和目标锁文件;不要只修改 +包版本而保留旧原生摘要。言台的支持周期见其 +[兼容政策](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/COMPATIBILITY.md),言界的 +1.x 修复边界见[支持政策](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/SUPPORT.md)。 diff --git a/content/docs/ecosystem/desktop/migration.mdx b/content/docs/ecosystem/desktop/migration.mdx index c9258fb..9c2540e 100644 --- a/content/docs/ecosystem/desktop/migration.mdx +++ b/content/docs/ecosystem/desktop/migration.mdx @@ -1,11 +1,30 @@ --- -title: 从言窗迁移 -description: 保持现有言窗应用可用,并按独立页面或新项目渐进采用言界。 +title: 升级与路线迁移 +description: 将言界和言台 0.x 升级到 1.0,或从言窗渐进采用保留模式路线。 --- -迁移不是升级前置条件。`yanxu-gui`已有独立的 1.0 稳定线,新增言台和言界不会替换它。 -现有言窗应用应先按[言窗 1.0](/ecosystem/desktop/gui/)升级并锁定公开 Release 制品,再决定 -是否评估另一条编程模型。 +## 从言界 0.x 升级到 1.0 + +1.0 保留从`v0.1.0`到`v0.9.0`的全部已发布源码 API。多数应用只需: + +1. 提交当前源码和各目标锁,保留可回滚点; +2. 把言界依赖改为`v1.0.0`与`^1.0`;直接使用言台的应用也改为其`v1.0.0`与`^1.0`; +3. 在每个目标系统与架构重新生成锁,不能复制另一目标的锁或手工替换动态库; +4. 只保留实际使用的图形、原生扩展、剪贴板和文件对话框权限; +5. 重建并验收窗口、IME、DPI、主题、屏幕阅读器、系统服务和关闭路径。 + +从 0.9 升级不需要源码修改。更早版本还应复核:0.4 起的帧反馈、0.5–0.6 的语义树和原生 +无障碍桥、0.7 的资源配额与单向退出,以及言界 0.7 的托管计时器/图片和结构化关闭报告。 +列表集合的无障碍值从 0.8 起只使用标量;选择和滚动动作属于当前可见的`列表项`或`标签` +节点,应用不能缓存旧树修订中的派生编号。 + +完整逐版本清单见言界的[迁移证明](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/MIGRATION_0_X_TO_1_0.md) +和言台的[迁移指南](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/MIGRATION_0_X_TO_1_0.md)。 + +## 从言窗评估言界 + +路线迁移不是升级前置条件。`yanxu-gui`已有独立的 1.0 稳定线,言台和言界不会替换它。 +现有言窗应用应先锁定公开 Release 制品,再决定是否评估另一种编程模型。 ## 概念映射 @@ -26,4 +45,6 @@ description: 保持现有言窗应用可用,并按独立页面或新项目渐 5. 为中文 IME、焦点顺序、快捷键、主题和 DPI 补充验收。 6. 只有当新页面满足需求时,才决定是否继续迁移其他独立窗口。 -首版不支持在同一个原生窗口中混用言窗和言界控件树。两条路线可存在于不同应用中;不要尝试把 egui 原生对象或平台句柄传入言台。 +1.0 不支持在同一个原生窗口中混用言窗和言界控件树。两条路线可存在于不同应用中;不要 +尝试把 egui 原生对象或平台句柄传入言台。若验收失败,应一起恢复旧清单和同一目标的旧锁 +再重新构建,不能只替换原生库或继续复用新版本 YXB。 diff --git a/content/docs/ecosystem/desktop/troubleshooting.mdx b/content/docs/ecosystem/desktop/troubleshooting.mdx index 15a3808..97d8450 100644 --- a/content/docs/ecosystem/desktop/troubleshooting.mdx +++ b/content/docs/ecosystem/desktop/troubleshooting.mdx @@ -5,7 +5,9 @@ description: 定位依赖锁、权限、显示会话、ABI、绘制、资源和 ## 包无法解析或原生库不匹配 -确认言界依赖使用存在的`v0.1.1`标签、言台由锁图解析到兼容的`v0.1.0`,删除手工复制的动态库,再在目标平台运行`yanbao 装`。检查`言序.lock`中的目标、ABI、SHA-256 和大小;不要复用另一架构的锁。 +确认言界依赖使用`v1.0.0`与`^1.0`,锁图中的言台解析到`v1.0.0`。删除手工复制的动态库, +再在目标平台运行`yanbao 装`。检查`言序.lock`中的系统、架构、ABI、SHA-256、大小和精确 +提交;不要复用另一架构的锁。升级依赖后必须重新构建 YXB 与 Bundle。 ## 权限错误 @@ -31,4 +33,23 @@ description: 定位依赖锁、权限、显示会话、ABI、绘制、资源和 `PLATFORM_RESOURCE_CLOSED`表示句柄代际已失效;重新获取资源,不能缓存旧编号。`PLATFORM_WRONG_THREAD`表示从非所有者事件循环使用资源;把操作投递回应用事件泵。 -报告问题时附上系统、架构、言序/言包/言界/言台版本、协议查询、能力查询和最小可复现源码,不要附带私密路径或剪贴板内容。 +## 配额耗尽或应用不能再次运行 + +`PLATFORM_QUOTA_*`表示资源数量、图片/字体持有字节、帧或无障碍树达到应用配额。读取 +`应用.资源配额()`和诊断快照,关闭不用的资源;只能在首个子资源或首次运行前下调配额, +冻结后不能提高或重新配置。应用退出后生命周期只会继续到已关闭,不能再次调用`运行()`。 + +## 动画停止或出现帧替换 + +动画依赖匹配的`帧呈现`反馈。窗口隐藏、最小化或表面尺寸为零时反馈可暂停;恢复后由新的 +重绘继续。检查窗口诊断中的待呈现身份、提交、替换、忽略和失败计数。被替换帧不会再产生 +呈现事件,应用不能围绕旧帧编号持续等待。 + +## 屏幕阅读器没有读出控件 + +先确认`能力查询()`中的`原生无障碍桥`为真,后端为 UIA、NSAccessibility 或 AT-SPI。 +自定义控件必须保留稳定正编号、逻辑边界、标量值和实际实现的动作;处理焦点/动作请求时 +核对当前树修订。无头 CI 只能证明适配器与树同步,最终播报需在启用辅助技术的桌面会话验证。 + +报告问题时附上系统、架构、言序/言包/言界/言台版本、协议查询、能力查询、内容安全的 +诊断快照、结构化关闭报告和最小可复现源码,不要附带私密路径、输入内容或剪贴板内容。 From a0c2126aa1025bd5faa84963dc20d5a293e42f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:29:38 +0800 Subject: [PATCH 06/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E8=A1=A5?= =?UTF-8?q?=E9=BD=901.0=E6=A1=8C=E9=9D=A2=E7=94=9F=E4=BA=A7=E9=AA=8C?= =?UTF-8?q?=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/backend-guide.mdx | 2 +- content/docs/ecosystem/desktop/clipboard.mdx | 10 ++++++++-- content/docs/ecosystem/desktop/drawing.mdx | 2 +- content/docs/ecosystem/desktop/linux-support.mdx | 5 ++++- content/docs/ecosystem/desktop/macos-support.mdx | 5 ++++- content/docs/ecosystem/desktop/pointer.mdx | 2 +- content/docs/ecosystem/desktop/windows-support.mdx | 5 ++++- content/docs/ecosystem/desktop/windows.mdx | 8 ++++++-- 8 files changed, 29 insertions(+), 10 deletions(-) diff --git a/content/docs/ecosystem/desktop/backend-guide.mdx b/content/docs/ecosystem/desktop/backend-guide.mdx index f092a33..e6386f0 100644 --- a/content/docs/ecosystem/desktop/backend-guide.mdx +++ b/content/docs/ecosystem/desktop/backend-guide.mdx @@ -3,7 +3,7 @@ title: 贡献新的平台后端 description: 在不泄漏系统句柄或下沉高级控件的前提下扩展言台。 --- -首版 Windows、macOS、Wayland 和 X11 共享 winit/softbuffer 后端。新增集成应先扩展公共路径;只有上游确实无法表达所需平台原语时,才增加小型目标适配器。 +1.0 的 Windows、macOS、Wayland 和 X11 共享 winit/softbuffer 后端。新增集成应先扩展公共路径;只有上游确实无法表达所需平台原语时,才增加小型目标适配器。 ## 边界 diff --git a/content/docs/ecosystem/desktop/clipboard.mdx b/content/docs/ecosystem/desktop/clipboard.mdx index 1795230..3ce18f4 100644 --- a/content/docs/ecosystem/desktop/clipboard.mdx +++ b/content/docs/ecosystem/desktop/clipboard.mdx @@ -1,6 +1,6 @@ --- title: 剪贴板 -description: 在独立权限下读取和写入系统 UTF-8 文本剪贴板。 +description: 在独立权限下使用言界文本剪贴板与言台 RGBA8 图片剪贴板。 --- 剪贴板能力与图形窗口权限分离。应用需要在`言序.toml`显式声明: @@ -19,6 +19,12 @@ description: 在独立权限下读取和写入系统 UTF-8 文本剪贴板。 定 内容 为 界面.剪贴板读取(); ``` -读取没有文本时返回空。首版只处理 UTF-8 文本,不提供图片、自定义 MIME 或富文本剪贴板。单行和多行输入控件的复制、剪切与粘贴会调用同一服务,并尊重当前选区和只读状态。 +读取没有文本时返回空。文字读写上限为 16 MiB;单行和多行输入控件的复制、剪切与粘贴 +会调用同一服务,并尊重当前选区和只读状态。 + +言界 1.0 的包级函数只公开文字。直接构建框架或平台工具时,言台 1.0 另提供 RGBA8 图片 +读写;宽高必须为 1..16384,内容严格等于`宽 × 高 × 4`且不超过 256 MiB。调用前读取 +`能力查询()`中的格式和上限,不把这些值当成其他后端的默认值。自定义 MIME 与富文本 +仍不在 1.0 接口内。 缺少权限时返回`PLATFORM_PERMISSION_CLIPBOARD`一类稳定错误;不会因为应用已经能创建窗口而隐式放行。测试不应覆盖用户真实剪贴板,可在隔离桌面会话或经显式确认后运行原生冒烟。 diff --git a/content/docs/ecosystem/desktop/drawing.mdx b/content/docs/ecosystem/desktop/drawing.mdx index f53201b..09bfbdc 100644 --- a/content/docs/ecosystem/desktop/drawing.mdx +++ b/content/docs/ecosystem/desktop/drawing.mdx @@ -29,4 +29,4 @@ description: 从言界渲染树生成一次提交的 YXDR 1.1 二进制完整帧 协议覆盖清空、保存/恢复、裁剪、仿射变换、图层透明度、填充/描边矩形、圆角、直线、圆、路径、阴影、文字、字形序列和图片。整帧上限 16 MiB、命令数上限 65536、状态栈上限 256;损坏或超限帧会返回`PLATFORM_DRAW_*`错误。 -首版图层透明度不是隔离离屏组,任意旋转文字也不保证矢量轮廓级一致。固定自定义字体时,六个目标共享同一 CPU 算法;否则系统字体差异仍会影响像素。 +1.0 的图层透明度不是隔离离屏组,任意旋转文字也不保证矢量轮廓级一致。固定自定义字体时,六个目标共享同一 CPU 算法;否则系统字体差异仍会影响像素。 diff --git a/content/docs/ecosystem/desktop/linux-support.mdx b/content/docs/ecosystem/desktop/linux-support.mdx index 6a1b1f6..64ee13c 100644 --- a/content/docs/ecosystem/desktop/linux-support.mdx +++ b/content/docs/ecosystem/desktop/linux-support.mdx @@ -3,7 +3,9 @@ title: Linux、Wayland 与 X11 description: 在 Linux x86-64 与 ARM64 的 Wayland 或 X11 桌面运行言界。 --- -首版正式支持`x86_64-unknown-linux-gnu`与`aarch64-unknown-linux-gnu`。同一言台制品保留 Wayland 与 X11 特性,winit 会依据桌面会话选择后端;应用代码和言界字节码不按显示协议分支。 +1.0 正式支持`x86_64-unknown-linux-gnu`与`aarch64-unknown-linux-gnu`。同一言台制品保留 +Wayland 与 X11 特性,winit 会依据桌面会话选择后端;应用代码和言界字节码不按显示协议 +分支,原生无障碍桥使用 AT-SPI。 运行需要可用的 Wayland 或 X11 会话,以及系统字体、剪贴板、文件对话框和输入法服务。CI 在两个架构编译全部路径,并用 Xvfb 验证 X11 真实窗口自动退出;无头 CI 没有用户输入法会话,所以不能声称验证了实际候选窗。 @@ -12,6 +14,7 @@ description: 在 Linux x86-64 与 ARM64 的 Wayland 或 X11 桌面运行言界 - Wayland 会话:确认窗口、缩放、指针、滚轮、拖放和文件对话框; - X11 会话:确认相同场景以及 X11 回退; - 使用 IBus 或 Fcitx5 的中文输入法检查预编辑、提交、取消和候选区位置; +- 使用 Orca 或目标辅助技术检查焦点、名称、表单状态、列表项与动作; - 安装合适的中文字体,或随应用携带许可字体; - 在分数缩放和多显示器下检查逻辑像素一致性; - 分别在 x86-64 与 ARM64 原生机器或执行器生成锁和 AppDir。 diff --git a/content/docs/ecosystem/desktop/macos-support.mdx b/content/docs/ecosystem/desktop/macos-support.mdx index f9caeb3..8821d88 100644 --- a/content/docs/ecosystem/desktop/macos-support.mdx +++ b/content/docs/ecosystem/desktop/macos-support.mdx @@ -3,7 +3,9 @@ title: macOS 支持 description: 在 Intel 与 Apple Silicon macOS 构建、验证和发布原生应用。 --- -首版正式支持`x86_64-apple-darwin`与`aarch64-apple-darwin`。两个目标都在对应 macOS 执行器完成原生 Release 构建、言序集成、示例构建与真实窗口冒烟。 +1.0 正式支持`x86_64-apple-darwin`与`aarch64-apple-darwin`。两个目标都在对应 macOS +执行器完成原生 Release 构建、ABI 导出、言序集成、言界全部公开示例、真实窗口与 +NSAccessibility 语义树自动退出验收。 言台通过 winit 的 AppKit 后端接收窗口、键盘、指针、触控板手势、拖放和输入法事件。`主`修饰键对应 Command。公开 API 不返回`NSWindow`、Cocoa 对象或原始指针;应用也不需要 Objective-C 分支。 @@ -12,6 +14,7 @@ description: 在 Intel 与 Apple Silicon macOS 构建、验证和发布原生应 - 分别生成 Intel 与 Apple Silicon 锁文件和`.app` Bundle; - 在系统中文输入法中检查组合、候选窗与中英文/Emoji 混排; - 检查 Retina 与外接非 Retina 显示器之间移动; +- 使用 VoiceOver 检查焦点、名称、表单状态、列表项与动作; - 确认应用名称、标识、版本、图标和资源进入 Bundle; - 如需要对外分发,在产物验证后另行执行 Apple 签名与公证流程。 diff --git a/content/docs/ecosystem/desktop/pointer.mdx b/content/docs/ecosystem/desktop/pointer.mdx index f8cd40e..841af6f 100644 --- a/content/docs/ecosystem/desktop/pointer.mdx +++ b/content/docs/ecosystem/desktop/pointer.mdx @@ -17,4 +17,4 @@ description: 统一处理鼠标、触摸、触控笔、滚轮、手势与指针 滚轮提供横向、纵向增量、单位和阶段。相邻滚轮事件会在一个批次内累积;指针移动只保留最新状态,离散按下/释放事件则从不丢失。滚动容器优先消费其可滚动方向,未消费部分可以继续冒泡给父滚动容器。 -手势事件可表达缩放、旋转、平移和压力,但首版言界的常用控件主要消费指针与滚轮;自定义画布可监听原始手势构建缩放或旋转交互。 +手势事件可表达缩放、旋转、平移和压力,但言界 1.0 的常用控件主要消费指针与滚轮;自定义画布可监听原始手势构建缩放或旋转交互。 diff --git a/content/docs/ecosystem/desktop/windows-support.mdx b/content/docs/ecosystem/desktop/windows-support.mdx index e9e8eb4..61f140c 100644 --- a/content/docs/ecosystem/desktop/windows-support.mdx +++ b/content/docs/ecosystem/desktop/windows-support.mdx @@ -3,7 +3,9 @@ title: Windows 支持 description: 在 Windows x86-64 与 ARM64 构建、测试和发布言界应用。 --- -首版正式支持`x86_64-pc-windows-msvc`与`aarch64-pc-windows-msvc`。两个目标都在对应 GitHub Actions Windows 执行器上构建言台动态库、言序工具链、言界包入口和全部公开示例,并运行自动退出的真实窗口冒烟。 +1.0 正式支持`x86_64-pc-windows-msvc`与`aarch64-pc-windows-msvc`。两个目标都在对应 +Windows 执行器构建言台动态库、核对 ABI 导出、运行言序集成、言界全部公开示例、真实 +窗口和 UIA 语义树自动退出验收。 窗口、键盘、鼠标、触摸、触控笔、显示器、拖放和 IME 由 winit 的 Windows 后端接入;CPU 表面由 softbuffer 呈现。`主`修饰键对应 Control。窗口尺寸和事件坐标使用逻辑像素,系统缩放变化会产生`DPI变化`。 @@ -14,6 +16,7 @@ description: 在 Windows x86-64 与 ARM64 构建、测试和发布言界应用 - 在系统拼音或其他目标输入法中检查组合更新、提交、取消与候选窗位置; - 检查 100%、150%、200% 缩放及跨显示器移动; - 测试文件对话框、剪贴板和包含中文/Emoji 的路径; +- 使用 Narrator 或目标屏幕阅读器检查焦点、名称、表单状态、列表项与动作; - 用 GUI Bundle 入口启动,确认不会额外打开控制台窗口。 Windows ARM64 是正式矩阵目标,不以 x86-64 模拟结果代替。系统字体集合与 x86-64 可能不同,品牌界面应携带同一许可字体。 diff --git a/content/docs/ecosystem/desktop/windows.mdx b/content/docs/ecosystem/desktop/windows.mdx index c1f02b8..70be6e3 100644 --- a/content/docs/ecosystem/desktop/windows.mdx +++ b/content/docs/ecosystem/desktop/windows.mdx @@ -25,7 +25,9 @@ description: 创建、显示、调整和关闭言界原生窗口。 窗口.显示(); ``` -尺寸使用逻辑像素。言台还统一实现位置、最小/最大尺寸、最大化、最小化、全屏、无边框、透明、始终置顶、请求重绘、客户区尺寸、比例因子和当前显示器;言界首版公开常用窗口方法,其余能力可通过贡献通用包装逐步开放,不能在应用中绕过言台读取平台句柄。 +尺寸使用逻辑像素。言台还统一实现位置、最小/最大尺寸、最大化、最小化、全屏、无边框、 +透明、始终置顶、请求重绘、客户区尺寸、比例因子和当前显示器;言界 1.0 公开常用窗口方法, +其余能力应通过通用包装扩展,不能在应用中绕过言台读取平台句柄。 窗口关闭包含“请求”和“完成”两个阶段。用`关闭时`拦截用户关闭按钮: @@ -36,4 +38,6 @@ description: 创建、显示、调整和关闭言界原生窗口。 窗口.关闭时(关闭主窗); ``` -`窗口.关闭()`可由程序主动关闭资源;重复调用安全。关闭会先释放子控件和回调,再释放绘制表面和原生窗口,旧代际句柄随后失效。 +`窗口.关闭()`可由程序主动关闭资源;重复调用安全,并返回同一份结构化关闭报告。关闭 +会按叠层、帧调度、控件树、无障碍、原生窗口和应用登记继续最佳努力清理;单个步骤失败 +不会跳过后续步骤。旧代际句柄随后失效。 From 73c0a635a0f27207a84d9bb881cae051846d5684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:31:07 +0800 Subject: [PATCH 07/23] =?UTF-8?q?=E7=A4=BA=E4=BE=8B=EF=BC=9A=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E8=A8=80=E7=95=8C1.0=E7=BB=BC=E5=90=88=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ecosystem/desktop/complete-example.mdx | 21 +++++++++++++++---- ...47\344\273\266\345\261\225\347\244\272.yx" | 12 +++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/content/docs/ecosystem/desktop/complete-example.mdx b/content/docs/ecosystem/desktop/complete-example.mdx index d539069..40d4534 100644 --- a/content/docs/ecosystem/desktop/complete-example.mdx +++ b/content/docs/ecosystem/desktop/complete-example.mdx @@ -3,20 +3,30 @@ title: 完整示例 description: 一个包含菜单、列表、分割面板、标签页、文本和画布的可运行言界应用。 --- -以下源码与文档仓库`examples/desktop/综合控件展示.yx`完全一致,并由 CI 使用言界 0.1.1 已验证的言序`1.1.9`执行类型检查和 Release YXB 构建。当前核心用户应先阅读[版本兼容政策](/ecosystem/desktop/compatibility/)中的兼容缺口。 +以下源码与文档仓库`examples/desktop/综合控件展示.yx`完全一致。CI 使用言序 1.1.9 与 +1.1.20 两套工具链解析言界 1.0,在真实 Linux 窗口环境执行类型检查、Release YXB 构建和 +自动退出冒烟。 ```yanxu 引「包:言界」为 界面; 定 应用 为 界面.应用(「言界综合控件展示」); -定 窗口 为 应用.窗口({「标题」:「言界 0.1.1」,「宽」:960,「高」:700,「最小宽」:720,「最小高」:520}); +定 窗口 为 应用.窗口({「标题」:「言界综合控件展示」,「宽」:960,「高」:700,「最小宽」:720,「最小高」:520}); 定 主列 为 窗口.列({「内边距」:18,「间距」:10}); 定 菜单行 为 主列.行({「间距」:8}); -菜单行.菜单(【{「标题」:「新建」},{「标题」:「打开」},{「标题」:「退出」}】); +令 菜单选择次数 为 0; + +法 记录菜单选择(所事件) 则 + 置 菜单选择次数 为 (菜单选择次数 加 1); +终 + +定 主菜单 为 菜单行.菜单(【{「标题」:「文件」,「快捷键」:「⌘N」,「子菜单」:【{「标题」:「新建」},{「标题」:「打开」,「快捷键」:「⌘O」}】},{「标题」:「编辑」,「子菜单」:【{「标题」:「撤销」,「快捷键」:「⌘Z」},{「标题」:「重做」,「快捷键」:「⇧⌘Z」}】},{「标题」:「退出」}】); + +主菜单.监听(「选择」,记录菜单选择); 菜单行.文字(「保留模式控件全部由言序实现」); @@ -59,4 +69,7 @@ description: 一个包含菜单、列表、分割面板、标签页、文本和 应用.运行(); ``` -项目清单使用[快速开始](/ecosystem/desktop/quick-start/)中的言界`v0.1.1`依赖和四项权限。先运行`yanbao 装`,再用`yanbao 查`检查;开发桌面运行应用,发布时执行`yanbao 构 --release --bundle`。 +项目清单使用[快速开始](/ecosystem/desktop/quick-start/)中的言界`v1.0.0`依赖和四项权限。 +先运行`yanbao 装`,再用`yanbao 查`检查;开发桌面运行应用,发布时执行 +`yanbao 构 --release --bundle`。窗口边缘、键盘导航、中文 IME、DPI、屏幕阅读器和关闭 +路径仍应在目标桌面会话完成上线冒烟。 diff --git "a/examples/desktop/\347\273\274\345\220\210\346\216\247\344\273\266\345\261\225\347\244\272.yx" "b/examples/desktop/\347\273\274\345\220\210\346\216\247\344\273\266\345\261\225\347\244\272.yx" index 300950e..4936cde 100644 --- "a/examples/desktop/\347\273\274\345\220\210\346\216\247\344\273\266\345\261\225\347\244\272.yx" +++ "b/examples/desktop/\347\273\274\345\220\210\346\216\247\344\273\266\345\261\225\347\244\272.yx" @@ -2,13 +2,21 @@ 定 应用 为 界面.应用(「言界综合控件展示」); -定 窗口 为 应用.窗口({「标题」:「言界 1.0」,「宽」:960,「高」:700,「最小宽」:720,「最小高」:520}); +定 窗口 为 应用.窗口({「标题」:「言界综合控件展示」,「宽」:960,「高」:700,「最小宽」:720,「最小高」:520}); 定 主列 为 窗口.列({「内边距」:18,「间距」:10}); 定 菜单行 为 主列.行({「间距」:8}); -菜单行.菜单(【{「标题」:「新建」},{「标题」:「打开」},{「标题」:「退出」}】); +令 菜单选择次数 为 0; + +法 记录菜单选择(所事件) 则 + 置 菜单选择次数 为 (菜单选择次数 加 1); +终 + +定 主菜单 为 菜单行.菜单(【{「标题」:「文件」,「快捷键」:「⌘N」,「子菜单」:【{「标题」:「新建」},{「标题」:「打开」,「快捷键」:「⌘O」}】},{「标题」:「编辑」,「子菜单」:【{「标题」:「撤销」,「快捷键」:「⌘Z」},{「标题」:「重做」,「快捷键」:「⇧⌘Z」}】},{「标题」:「退出」}】); + +主菜单.监听(「选择」,记录菜单选择); 菜单行.文字(「保留模式控件全部由言序实现」); From ea842dc895513bb61c60e3d503904b0b58e94811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:34:05 +0800 Subject: [PATCH 08/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E8=AF=B4?= =?UTF-8?q?=E6=98=8E1.0=E8=BF=90=E8=A1=8C=E6=97=B6=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E4=B8=8E=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/app-loop.mdx | 22 +++++++++++++++++---- content/docs/ecosystem/desktop/events.mdx | 11 +++++++++-- content/docs/ecosystem/desktop/themes.mdx | 4 ++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/content/docs/ecosystem/desktop/app-loop.mdx b/content/docs/ecosystem/desktop/app-loop.mdx index eb8f7f8..61a5dad 100644 --- a/content/docs/ecosystem/desktop/app-loop.mdx +++ b/content/docs/ecosystem/desktop/app-loop.mdx @@ -3,7 +3,9 @@ title: 应用和事件循环 description: 创建应用、监听生命周期、使用计时器并安全退出事件循环。 --- -每个进程通常创建一个`应用`,由它持有窗口、字体、图片、计时器和事件队列。`运行`必须在 VM 所有者线程调用,且同一应用不能并发运行两次。 +每个进程通常创建一个`应用`,由它持有窗口、托管图片、托管计时任务、监听和事件队列。 +`运行`必须在 VM 所有者线程调用,且同一应用不能并发运行两次。生命周期只沿`就绪`、 +`运行中`、`退出请求`、`已退出`和`已关闭`前进;已经退出的应用不能再次运行。 ```yanxu 引「包:言界」为 界面; @@ -24,10 +26,22 @@ description: 创建应用、监听生命周期、使用计时器并安全退出 窗口.关闭时(关闭); 窗口.显示(); 应用.运行(); +定 关闭报告 为 应用.关闭(); ``` -`定时器(毫秒,重复,回调)`最小间隔为 10 毫秒。回调不是操作系统线程回调,而是和窗口事件一样进入有界宿主队列,再由事件泵在言序线程执行。周期动画应使用单调时间计算当前值,不要假设每次回调间隔完全相等。 +`定时器(毫秒,重复,回调)`最小间隔为 10 毫秒,并返回托管任务。任务可查询状态、触发 +次数和结构化错误,也可幂等取消/关闭;一次任务回调完成后自动归还平台配额,回调失败只 +使该任务进入失败。回调不是操作系统线程回调,而是和窗口事件一样进入有界宿主队列,再由 +事件泵在言序线程执行。 -应用级`监听(事件类型,回调)`可处理启动、激活、失活、退出请求、系统主题和显示器变化。窗口未处理的退出请求会结束循环;显式调用`退出`只请求停止,`运行`返回后再由`关闭`释放应用根资源。 +周期动画不要使用计时器猜测显示节奏。调用`窗口.动画(配置,更新回调)`后,言界以匹配的 +`帧呈现`事件和进程内单调时间推进任务;每窗只保留一个待呈现帧,被替换帧不会继续驱动动画。 -事件队列最多保留 4096 项。指针移动、窗口缩放和重绘会保留最新状态,滚轮在同一批次累积,因此繁忙时不会因每个物理事件都跨 ABI 而无限增长。 +应用级`监听(事件类型,回调)`可处理启动、激活、失活、退出请求、系统主题和显示器变化。 +窗口未处理的退出请求会结束循环;显式调用`退出`只请求停止,`运行`返回后再由`关闭`按 +计时器、窗口、图片、监听和原生应用继续最佳努力清理。关闭报告可 JSON 序列化,生产应用 +应记录其中的失败步骤;重复关闭返回同一结果,不再次释放资源。 + +事件队列最多保留 4096 项。指针移动、窗口缩放和重绘会保留最新状态,滚轮在同一批次累积, +因此繁忙时不会因每个物理事件都跨 ABI 而无限增长;离散事件满时会以稳定错误停止循环, +而不是静默丢失。应用可读取内容安全的诊断快照观察队列水位、资源、帧、配额和生命周期。 diff --git a/content/docs/ecosystem/desktop/events.mdx b/content/docs/ecosystem/desktop/events.mdx index 581449e..5e8d599 100644 --- a/content/docs/ecosystem/desktop/events.mdx +++ b/content/docs/ecosystem/desktop/events.mdx @@ -3,7 +3,8 @@ title: 事件系统 description: 理解事件批次、命中测试、捕获、目标、冒泡与指针捕获。 --- -言台先把系统事件规范化并批量送入言界。言界在窗口控件树上命中测试,然后依次执行三个阶段: +言台先把系统事件规范化并批量送入言界。窗口级叠层栈先从最上层处理菜单/弹层命中、外部 +点击与模态阻断;普通事件再在控件树依次执行三个阶段: ```text 根 → 父容器 → 目标控件 捕获阶段 @@ -30,4 +31,10 @@ description: 理解事件批次、命中测试、捕获、目标、冒泡与指 拖动分隔条或选区时,目标控件会请求指针捕获;即使指针离开原矩形,移动和释放仍发送给该控件。释放、取消、失焦或控件关闭都会清除捕获,避免“卡住按下”状态。 -事件批次保留顺序,但会合并连续指针移动、窗口尺寸和重绘请求,并累积滚轮增量。未知可选事件由兼容层忽略;未知主协议或损坏批次会返回统一错误。 +言台发出的`无障碍焦点请求`与`无障碍动作请求`不直接修改控件。窗口先同步当前语义变化, +再核对树修订、稳定控件编号、可见/启用状态和动作参数;有效请求才进入控件已有的点击、 +设置值、选择、滚动或展开路径。过期或畸形请求不会降级成普通事件。 + +事件批次保留顺序,但会合并连续指针移动、窗口尺寸和重绘请求,并累积滚轮增量。未知可选 +事件由兼容层忽略;未知主协议或损坏批次会返回统一错误。`帧呈现`是离散反馈,携带帧序号 +和单调呈现时间,用来推进有界动画而不是表达业务计时。 diff --git a/content/docs/ecosystem/desktop/themes.mdx b/content/docs/ecosystem/desktop/themes.mdx index 4e43011..07e2096 100644 --- a/content/docs/ecosystem/desktop/themes.mdx +++ b/content/docs/ecosystem/desktop/themes.mdx @@ -24,3 +24,7 @@ description: 使用内置浅深主题、控件状态样式和可继承自定义 颜色使用`【红,绿,蓝,透明度】`的 0–255 整数列;几何度量使用逻辑像素。应用级设计系统应写成[言据配置](/ecosystem/desktop/yanju-config/),再调用`应用.主题配置(配置.规范主题(数据))`。JSON 可作为外部工具兼容输入,但不是唯一格式。 系统主题变化会成为应用事件。是否自动跟随由应用决定;切换主题后,言界标记受影响控件的绘制脏区并生成新帧。 + +运行时局部更新使用`应用.更新主题(覆盖典)`。更新会先完整解析和校验,再原子替换主题、 +清空样式缓存并返回单调修订;失败不会留下半更新状态。窗口会重新布局并重建绘制与语义 +快照,应用不需要逐个控件手工失效。 From bc623b2cfbd8a20449bbab02038728d09f7fbc51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:34:49 +0800 Subject: [PATCH 09/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8E=9F=E7=94=9F=E6=97=A0=E9=9A=9C=E7=A2=8D=E6=8C=87?= =?UTF-8?q?=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/ecosystem/desktop/accessibility.mdx | 66 +++++++++++++++++++ content/docs/ecosystem/desktop/meta.json | 1 + 2 files changed, 67 insertions(+) create mode 100644 content/docs/ecosystem/desktop/accessibility.mdx diff --git a/content/docs/ecosystem/desktop/accessibility.mdx b/content/docs/ecosystem/desktop/accessibility.mdx new file mode 100644 index 0000000..099b860 --- /dev/null +++ b/content/docs/ecosystem/desktop/accessibility.mdx @@ -0,0 +1,66 @@ +--- +title: 原生无障碍 +description: 用同一棵言界控件树接入 Windows UIA、macOS NSAccessibility 与 Linux AT-SPI。 +--- + +言界 1.0 把控件树转换为言台无障碍协议 1.0 的纯言序语义树。言台再把同一模型注册到 +Windows UIA、macOS NSAccessibility 或 Linux AT-SPI;应用不接触系统对象、原始指针或 +平台条件分支。 + +## 内置控件语义 + +每个控件存活期间拥有稳定正整数编号,并公开角色、逻辑像素边界、名称、描述、状态、值、 +动作和子节点。应用应为没有充分可见文字的控件设置名称: + +```yanxu +定 姓名 为 表单.输入框({「占位」:「姓名」}); +姓名.可访问名称(「账户姓名」); +姓名.必填(真); + +定 保存 为 表单.按钮(「保存」); +保存.可访问描述(「保存当前账户设置」); +``` + +`显示`、`启用`、`可聚焦`、`只读`、`必填`、`无效`、焦点、选择和忙碌状态会按角色映射。 +值只允许空、逻辑值、有限数或有界文字;集合数量、加载错误和其他诊断不应塞进值字段。 + +## 焦点与动作 + +内置控件把辅助技术请求复用到已有交互路径: + +| 控件 | 主要动作 | +| --- | --- | +| 按钮、复选框、单选框、切换 | 点击、选择 | +| 下拉选择、滑块、输入框 | 设置值;按控件支持展开、折叠、增加、减少或选择 | +| 滚动、列表项 | 滚动、选择、滚动到 | +| 标签、分割面板 | 选择或调整比例 | +| 菜单、菜单项、弹出层 | 点击、展开、折叠 | + +请求携带窗口、当前树修订和节点编号。言界先同步尚未提交的语义变化,再重新查找当前控件, +核对可见、启用、可聚焦状态和参数;旧修订、离开可见范围的列表项、已关闭控件或未声明动作 +都会被拒绝,不会转成普通事件。 + +## 同步与检查 + +通常由窗口在显示、布局、重绘和状态变化时自动同步。测试和诊断可以显式读取: + +```yanxu +定 摘要 为 窗口.同步无障碍(); +定 快照 为 窗口.无障碍快照(); +``` + +快照包含修订、节点数、文字字节、焦点和规范化树。单窗口最多 16384 个节点、深度 64、 +总文字 4 MiB;普通列表和虚拟列表只为当前可见范围生成最多 256 个`列表项`节点。密码框 +不把值或文字运行交给系统桥,内容安全诊断也不复制语义文字树。 + +自定义控件覆写语义时应保留父实现的编号、边界和通用状态,只声明已经实现的动作,并在 +执行动作时再次校验当前状态和参数。完整角色、状态、动作组合与限制见 +[言台协议](https://github.com/yanxulang/yanxu-platform/blob/v1.0.0/docs/ACCESSIBILITY_PROTOCOL.md)和 +[言界接入指南](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/ACCESSIBILITY.md)。 + +## 上线验收 + +六目标 CI 验证适配器创建、树同步、焦点/动作回传和关闭收敛,但不能替代实际辅助技术的 +播报。发布前应分别使用 Windows Narrator、macOS VoiceOver 和 Linux Orca 检查名称、焦点 +顺序、必填/无效状态、表单改值、菜单层级、列表项和窗口关闭。运行时还应确认言台能力 +查询报告`原生无障碍桥 = 真`及预期的 UIA、NSAccessibility 或 AT-SPI 后端。 diff --git a/content/docs/ecosystem/desktop/meta.json b/content/docs/ecosystem/desktop/meta.json index 4eb4393..53aac2c 100644 --- a/content/docs/ecosystem/desktop/meta.json +++ b/content/docs/ecosystem/desktop/meta.json @@ -19,6 +19,7 @@ "controls", "themes", "events", + "accessibility", "keyboard", "pointer", "text-ime", From 2c5f367f5a6c359aa5ca0aa7c363b467e54b432e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:35:40 +0800 Subject: [PATCH 10/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=B5=84=E6=BA=90=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F?= =?UTF-8?q?=E4=B8=8E=E8=AF=8A=E6=96=AD=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desktop/lifecycle-diagnostics.mdx | 72 +++++++++++++++++++ content/docs/ecosystem/desktop/meta.json | 1 + 2 files changed, 73 insertions(+) create mode 100644 content/docs/ecosystem/desktop/lifecycle-diagnostics.mdx diff --git a/content/docs/ecosystem/desktop/lifecycle-diagnostics.mdx b/content/docs/ecosystem/desktop/lifecycle-diagnostics.mdx new file mode 100644 index 0000000..8270549 --- /dev/null +++ b/content/docs/ecosystem/desktop/lifecycle-diagnostics.mdx @@ -0,0 +1,72 @@ +--- +title: 资源生命周期与诊断 +description: 配置应用配额,管理计时器和图片,并用结构化关闭报告与内容安全快照定位问题。 +--- + +言界 1.0 在创建应用时协商言台 1.0 的配额、拒绝统计、退出幂等、生命周期统计和关闭资源 +归零能力。缺少任一必需能力会在创建首个窗口前停止,不退回无界资源管理。 + +## 在首次使用前下调配额 + +配额必须在创建首个窗口、计时器、图片或首次运行前配置: + +```yanxu +定 应用 为 界面.应用(「有界应用」); + +定 能力 为 应用.资源能力(); +定 生效配额 为 应用.配置资源配额({ + 「资源总数」:64, + 「窗口数」:4, + 「计时器数」:16, + 「图片数」:16, + 「字体数」:8, + 「图片字节」:67108864, + 「字体字节」:33554432, + 「帧字节」:33554432, + 「无障碍节点」:16384, + 「无障碍文字字节」:4194304 +}); +``` + +省略字段沿用当前值。配置只能下调,未知字段、非整数、超过言台硬上限或冻结后再次配置 +都会以`PLATFORM_QUOTA_*`稳定错误拒绝。资源关闭后会归还当前用量,但不会解冻或提高上限。 +使用`应用.资源配额()`读取当前复制值,不要修改返回典来尝试改变内部状态。 + +## 托管资源 + +`应用.定时器(毫秒,重复,回调)`返回托管任务。一次任务正常回调后自动进入完成并归还 +配额;重复任务保持运行。任务公开编号、状态、运行中、查询/快照、取消和关闭,回调错误 +只使当前任务失败,迟到事件不会重新激活已经结束的任务。 + +`应用.加载图片(字节)`返回托管图片资源。查询保留宽、高和字节数,关闭后归还图片数量 +与解码后 RGBA 字节配额,并把公开句柄置空。图片控件默认不取得调用者资源的所有权;只有 +配置`拥有资源`时,控件关闭才调用同一幂等关闭路径。 + +## 单向关闭报告 + +窗口和应用都只沿`可用 → 关闭中 → 已关闭`前进。`关闭()`返回可 JSON 序列化的报告, +包含状态、成功步骤和全部结构化错误。某一步失败不会阻止后续清理;重复关闭返回原报告, +不再次释放资源或调用回调。 + +```yanxu +窗口.关闭(); +定 应用关闭报告 为 应用.关闭(); +``` + +生产应用应在`运行()`返回后调用一次应用关闭,记录全部失败步骤。不要围绕同一个已关闭 +对象无限重试;言台根资源已经作为最后兜底尝试回收所有子资源。 + +## 内容安全诊断 + +`窗口.诊断快照()`和`应用.诊断快照()`返回版本化纯言序值。窗口快照包含布局/语义 +脏状态、焦点、捕获、叠层、无障碍摘要、待呈现帧、动画和生命周期;应用快照包含言台事件 +队列、资源、帧、无障碍桥、配额、窗口、计时器、图片、主题和监听摘要。 + +快照不会复制窗口标题、显示器名称、输入框内容、密码值、回调、无障碍文字树或原生句柄, +适合写入结构化日志。计数是进程内累计量,不是持久化格式;监控系统应按时间采样计算差值。 +应用关闭后诊断不会再次访问已释放句柄,而是明确报告平台不可用。 + +完整恢复策略与验收规模见 +[生命周期指南](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/LIFECYCLE_AND_RECOVERY.md)。 +六目标发布门禁执行 1024 轮窗口、计时器和图片资源归零;应用仍需对自己的并发规模、图片 +负载、退出保存和目标桌面服务做上线压力测试。 diff --git a/content/docs/ecosystem/desktop/meta.json b/content/docs/ecosystem/desktop/meta.json index 53aac2c..3e13684 100644 --- a/content/docs/ecosystem/desktop/meta.json +++ b/content/docs/ecosystem/desktop/meta.json @@ -14,6 +14,7 @@ "ui-architecture", "---应用与控件---", "app-loop", + "lifecycle-diagnostics", "windows", "layout", "controls", From 9577ebc882c9799a84e9aa69486d920c371e6842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:36:38 +0800 Subject: [PATCH 11/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=A8=80=E7=95=8C1.0=E8=A1=A8=E5=8D=95=E6=8C=87?= =?UTF-8?q?=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/forms.mdx | 65 ++++++++++++++++++++++++ content/docs/ecosystem/desktop/meta.json | 1 + 2 files changed, 66 insertions(+) create mode 100644 content/docs/ecosystem/desktop/forms.mdx diff --git a/content/docs/ecosystem/desktop/forms.mdx b/content/docs/ecosystem/desktop/forms.mdx new file mode 100644 index 0000000..40cc6d6 --- /dev/null +++ b/content/docs/ecosystem/desktop/forms.mdx @@ -0,0 +1,65 @@ +--- +title: 表单控件 +description: 使用复选框、单选框、切换、下拉选择、滑块和进度条构建有界可访问表单。 +--- + +言界 1.0 的表单控件共享保留模式控件树、事件路由、主题状态和言台无障碍协议。应用负责 +业务校验与提交;控件负责有界状态、输入交互、绘制和语义同步。 + +## 组合表单 + +```yanxu +定 姓名 为 表单.输入框({「占位」:「姓名」,「可访问名称」:「姓名」}); +姓名.必填(真); + +定 接受 为 表单.复选框(「接受服务条款」); +接受.必填(真); + +定 地区 为 表单.下拉选择(【「中国大陆」,「中国香港」,「新加坡」,「其他」】); +地区.可访问名称(「地区」); + +定 音量 为 表单.滑块({ + 「最小」:0,「最大」:100,「步长」:5,「值」:50, + 「可访问名称」:「通知音量」 +}); + +定 完成度 为 表单.进度条({ + 「最小」:0,「最大」:100,「值」:50, + 「可访问名称」:「表单完成度」 +}); +``` + +## 通用状态 + +| 状态 | 行为 | +| --- | --- | +| `启用(假)` | 不进入焦点序列,拒绝指针、键盘和辅助技术动作 | +| `只读(真)` | 仍可聚焦和读取;拒绝交互改值,程序方法仍可更新 | +| `必填(真)` | 向允许的表单角色公开必填语义;业务是否满足仍由应用判断 | +| `无效(真)` | 公开无效语义并使用危险状态样式 | + +输入框切到只读会取消正在进行的 IME 组合;下拉选择会折叠弹框,滑块会释放指针捕获。 +进度条是不可聚焦、无动作的输出角色,协议不允许它声明只读、必填或无效。 + +## 交互边界 + +- 复选框支持未选、已检查和混合三态;单选框同组互斥,方向键循环并跳过不可修改项; +- 切换支持指针、空格和回车,状态变化统一触发`变化时`; +- 下拉选择最多 4096 项,每项不超过 65536 UTF-8 字节,支持首字导航、Home/End、 + Escape、锚定翻转和辅助技术设置值; +- 滑块要求有限的最小、最大、步长和值;指针、方向键、PageUp/PageDown、Home/End 和 + 辅助动作都经过同一范围夹取与步长吸附; +- 进度条可公开确定值,或用`不定(真)`公开空值和忙碌状态。 + +程序调用仍可以更新只读控件。用户或辅助技术实际改变值时才触发变化事件;拒绝输入不会 +部分改写原状态。应用在提交回调中调用`无效(真)`表达业务校验结果,不应从样式颜色反推 +数据是否有效。 + +## 验收 + +键盘验收至少覆盖 Tab/Shift+Tab、空格、回车、方向键、Home/End 和 Escape;中文表单还要 +覆盖 IME 组合、只读切换与粘贴。屏幕阅读器应能读出名称、必填/无效、检查状态、当前值、 +范围和忙碌状态,并通过与指针/键盘相同的动作路径改值。 + +完整行为和可运行示例见 +[言界 1.0 表单指南](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/FORMS.md)。 diff --git a/content/docs/ecosystem/desktop/meta.json b/content/docs/ecosystem/desktop/meta.json index 3e13684..3690ed2 100644 --- a/content/docs/ecosystem/desktop/meta.json +++ b/content/docs/ecosystem/desktop/meta.json @@ -18,6 +18,7 @@ "windows", "layout", "controls", + "forms", "themes", "events", "accessibility", From f0e254c29c85bafd4f80f591016707564c27bbc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:37:28 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8F=A0=E5=B1=82=E4=B8=8E=E8=8F=9C=E5=8D=95=E6=8C=87?= =?UTF-8?q?=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/meta.json | 1 + .../docs/ecosystem/desktop/overlays-menus.mdx | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 content/docs/ecosystem/desktop/overlays-menus.mdx diff --git a/content/docs/ecosystem/desktop/meta.json b/content/docs/ecosystem/desktop/meta.json index 3690ed2..dd1d1cf 100644 --- a/content/docs/ecosystem/desktop/meta.json +++ b/content/docs/ecosystem/desktop/meta.json @@ -19,6 +19,7 @@ "layout", "controls", "forms", + "overlays-menus", "themes", "events", "accessibility", diff --git a/content/docs/ecosystem/desktop/overlays-menus.mdx b/content/docs/ecosystem/desktop/overlays-menus.mdx new file mode 100644 index 0000000..e24d441 --- /dev/null +++ b/content/docs/ecosystem/desktop/overlays-menus.mdx @@ -0,0 +1,53 @@ +--- +title: 叠层与菜单 +description: 使用窗口级叠层栈构建可翻转弹层、嵌套模态焦点和完整键盘菜单。 +--- + +言界 1.0 的菜单、下拉选择和弹出层共享窗口级叠层栈。叠层只存在于当前窗口的控件树、 +事件和绘制路径中,不创建额外原生窗口;窗口关闭时会逆序清理全部叠层。 + +## 嵌套菜单 + +```yanxu +定 文件菜单 为 工具栏.菜单(【 + {「标题」:「文件」,「快捷键」:「⌘N」,「子菜单」:【 + {「标题」:「新建」}, + {「标题」:「打开」,「快捷键」:「⌘O」} + 】}, + {「标题」:「退出」,「禁用」:假} +】); +文件菜单.监听(「选择」,处理选择); +``` + +项目可以是文字或典。典支持`标题`、`子菜单`、`快捷键`、`禁用`、`分隔`、`动作`和 +`保持打开`。快捷键字段只负责显示;应用级快捷键仍应调用`窗口.快捷`注册,菜单不会注册 +系统全局快捷键。 + +输入在创建时完整校验:单层最多 1024 项、全部层最多 4096 项、深度最多 16,单个标题 +最多 65536 个字符。无效输入以`UI_MENU_*`错误原子拒绝,不留下部分菜单。 + +## 放置、命中和焦点 + +弹层可选择上、下、左、右方向;首选方向空间不足时自动翻转,再按窗口视口夹取。窗口缩放 +或根布局变化会重新计算位置。指针命中从最上层倒序进行,模态叠层会阻止事件落入背景树; +点击外部或按 Escape 可以关闭允许关闭的最上层。 + +嵌套模态叠层为每层建立焦点范围。Tab/Shift+Tab 只在当前范围循环,关闭后恢复到有效的 +原焦点或下一个可聚焦控件。下拉选择、菜单和通用弹出层共用这一套边界,不应在应用中维护 +第二套外部点击或焦点陷阱状态。 + +菜单键盘导航:Up/Down 在当前层循环,Home/End 跳到边界,Right 打开子菜单,Left 返回 +父层,Enter/空格激活,Escape 关闭当前层或整个根菜单。禁用和分隔项目不会进入选择序列。 + +## 选择与无障碍 + +叶项目的`选择`事件包含当前序号、层级、规范化项目和从根到叶的索引路径。项目`动作`先于 +选择事件执行;动作失败不会留下半激活层。 + +展开菜单以`菜单`、`菜单项`和`分隔符`角色生成语义子树,并声明点击、展开、折叠和聚焦 +动作。辅助技术请求仍需携带当前树修订;言界会重新验证层级、可见、启用和项目身份。窗口 +诊断只保存叠层数量、层级和边界摘要,不复制菜单文字或回调。 + +完整行为见 +[言界 1.0 叠层与菜单指南](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/MENUS.md), +可运行代码见[综合控件示例](/ecosystem/desktop/complete-example/)。 From bfa689ac3c7bd35b0e5265094268e600d5821f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:38:16 +0800 Subject: [PATCH 13/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=95=B0=E6=8D=AE=E6=BA=90=E4=B8=8E=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/data-views.mdx | 57 +++++++++++++++++++ content/docs/ecosystem/desktop/meta.json | 1 + 2 files changed, 58 insertions(+) create mode 100644 content/docs/ecosystem/desktop/data-views.mdx diff --git a/content/docs/ecosystem/desktop/data-views.mdx b/content/docs/ecosystem/desktop/data-views.mdx new file mode 100644 index 0000000..041e25f --- /dev/null +++ b/content/docs/ecosystem/desktop/data-views.mdx @@ -0,0 +1,57 @@ +--- +title: 数据源与虚拟列表 +description: 用有界增量数据源、缓存和只创建可见行的虚拟列表呈现大型集合。 +--- + +普通`列表`适合已经在内存中的文字列。数据量很大或需要按范围取得时,言界 1.0 提供独立 +`数据源`模块和`虚拟列表`;它们不创建线程、网络连接或隐式异步调度,加载器何时执行由 +应用控制。 + +## 创建增量数据源 + +```yanxu +引「包:言界/数据源」为 数据; + +法 加载项目(起点,数量) 则 + 令 结果:列 为 【】; + 逐 偏移 于 范围(0,数量)则 + 追加(结果,「项目」); + 终 + 归 结果; +终 + +定 源 为 数据.数据源(100000,加载项目); +定 视图 为 窗口.列({}).虚拟列表(源,{「首选高」:320}); +``` + +一次范围加载最多 256 项,默认缓存最多 1024 项;`最大缓存(上限)`可在 1–4096 之间调整。 +加载器必须返回恰好请求数量的列。抛错、返回错误类型或数量不符时,状态原子进入失败,错误 +文本保存在`错误()`,已缓存数据不会被部分覆盖。 + +## 更新与订阅 + +| 操作 | 作用 | +| --- | --- | +| `提供(起点,项目列)` | 原子写入一段已取得的数据并发送`数据更新` | +| `失效(起点,数量)` | 丢弃一段缓存并发送`数据失效` | +| `设置总数(新总数)` | 更新总数并发送`数量变化` | +| `加载(起点,数量)` | 调用加载器,校验后原子写入缓存 | +| `刷新数据()` | 清空缓存并允许重新请求 | +| `快照()` | 返回总数、缓存、水位、状态、错误和版本摘要 | + +`监听(事件名,回调)`返回单调递增的监听编号。解除时把同一事件名和编号传给`取消监听`; +不要比较绑定方法对象。视图切换数据源时会按编号解除旧源订阅,旧源更新不会污染新视图。 + +## 虚拟化与无障碍 + +虚拟列表只请求视口附近的范围,并公开`刷新数据`、`数据状态`、`数据错误`、`数据数量`和 +`设置行渲染器`。不可用数据显示等待状态,加载期间显示加载状态,失败时显示有界错误文字。 +选择、焦点和滚动位置不会因为邻近缓存更新而重建。 + +普通列表和虚拟列表都只为当前可见范围生成最多 256 个`列表项`语义节点。每项公开文字、 +边界、选中状态以及选择/滚动到动作;离开当前树或来自旧修订的节点编号会被拒绝。集合值 +只保存当前选中文字,数量、索引、首可见行和错误通过查询 API 读取。 + +数据项是文字时直接显示;其他类型默认使用有界占位。调用`设置行渲染器(回调)`可以按 +数据值和行索引生成显示文字。完整 API 与失败恢复见 +[言界 1.0 数据视图指南](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/DATA_VIEWS.md)。 diff --git a/content/docs/ecosystem/desktop/meta.json b/content/docs/ecosystem/desktop/meta.json index dd1d1cf..ad7d15e 100644 --- a/content/docs/ecosystem/desktop/meta.json +++ b/content/docs/ecosystem/desktop/meta.json @@ -20,6 +20,7 @@ "controls", "forms", "overlays-menus", + "data-views", "themes", "events", "accessibility", From e6dee56ddc9c3f3c862f81b42082f19746c4c881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:38:55 +0800 Subject: [PATCH 14/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=A8=E7=94=BB=E4=B8=8E=E5=B8=A7=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/animation.mdx | 67 ++++++++++++++++++++ content/docs/ecosystem/desktop/meta.json | 1 + 2 files changed, 68 insertions(+) create mode 100644 content/docs/ecosystem/desktop/animation.mdx diff --git a/content/docs/ecosystem/desktop/animation.mdx b/content/docs/ecosystem/desktop/animation.mdx new file mode 100644 index 0000000..55452c7 --- /dev/null +++ b/content/docs/ecosystem/desktop/animation.mdx @@ -0,0 +1,67 @@ +--- +title: 动画与帧反馈 +description: 用言台呈现反馈驱动有界动画,并通过单槽背压避免无界帧队列。 +--- + +言界 1.0 动画使用言台 1.0 的帧提交回执和`帧呈现`事件,不用固定间隔计时器猜测窗口何时 +完成绘制。每个窗口只保存一个待呈现帧;应用持续更新时,新帧有界替换旧帧,不形成无界 +渲染队列。 + +## 创建动画 + +`窗口.动画(配置,更新回调)`返回动画任务: + +| 字段 | 默认值 | 边界 | +| --- | --- | --- | +| `起值` | `0` | 有限数,起终跨度也必须有限 | +| `终值` | `1` | 有限数,起终跨度也必须有限 | +| `时长毫秒` | `140` | 1–3600000 | +| `缓动` | `线性` | `线性`、`缓入`、`缓出`、`缓入缓出` | +| `完成` | 空 | 可选回调,只在正常到达终点后调用一次 | + +```yanxu +法 更新(值) 则 + 进度.值(值); +终 + +法 完成() 则 + 提示.内容(「完成」); +终 + +定 任务 为 窗口.动画({ + 「起值」:0, + 「终值」:100, + 「时长毫秒」:600, + 「缓动」:「缓入缓出」, + 「完成」:完成 +},更新); +``` + +任务公开编号、状态、运行中、取消和快照。状态为运行中、完成、已取消或失败;更新/完成 +回调抛错只终止当前任务,其他动画和事件循环继续。每窗最多 1024 个活动动画,底层队列 +硬上限为 4096。窗口关闭会取消活动任务,不再访问已释放平台资源。 + +## 呈现反馈链 + +1. 注册任务时立即写入起值并请求首帧; +2. `需要重绘`生成完整帧,并取得提交帧序号; +3. 匹配的`帧呈现`携带进程内单调呈现时间; +4. 言界用该时间推进活动任务并请求下一帧; +5. 到达终值后提交静态终帧,终帧呈现后停止调度。 + +提交回执中的`被替换帧`会替换唯一待呈现身份,旧帧此后不会驱动动画。窗口隐藏、最小化 +或表面尺寸为零时反馈可以暂停;恢复后的重绘按当前单调时间追赶,不积累计时器或帧任务。 +`帧呈现`表示软件缓冲已交给原生表面,不等同于显示器垂直同步时间戳。 + +## 诊断与性能 + +窗口诊断提供待呈现身份、提交、替换、呈现、忽略、失败、最后延迟,以及动画活动数、高 +水位、完成、取消和失败总数。诊断不保存更新回调或控件内容。提交失败会恢复全量脏区, +便于调用方处理错误后重试。 + +言界 Release 在固定 Linux x86-64 环境测量动画任务生命周期、帧反馈、64 个活动任务诊断 +以及 32 控件布局/帧编码;报告使用预热、长样本、中位数和 MAD 门禁。性能预算用于发现 +持续回归,不承诺任意机器的显示延迟,也不替代六目标真实窗口测试。 + +完整契约见 +[动画、帧反馈与运行诊断](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/ANIMATION_AND_DIAGNOSTICS.md)。 diff --git a/content/docs/ecosystem/desktop/meta.json b/content/docs/ecosystem/desktop/meta.json index ad7d15e..dfcb37c 100644 --- a/content/docs/ecosystem/desktop/meta.json +++ b/content/docs/ecosystem/desktop/meta.json @@ -29,6 +29,7 @@ "text-ime", "fonts", "drawing", + "animation", "images-resources", "clipboard", "dialogs", From 188c23614d71b31ac6b86144fff0c9e6c069ebc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:41:37 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=BC=BA?= =?UTF-8?q?=E5=8C=961.0=E6=89=93=E5=8C=85=E4=B8=8E=E6=9D=A5=E6=BA=90?= =?UTF-8?q?=E6=A0=B8=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/packaging.mdx | 29 ++++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/content/docs/ecosystem/desktop/packaging.mdx b/content/docs/ecosystem/desktop/packaging.mdx index 38f4803..a3d70ed 100644 --- a/content/docs/ecosystem/desktop/packaging.mdx +++ b/content/docs/ecosystem/desktop/packaging.mdx @@ -5,6 +5,7 @@ description: 锁定目标原生制品并生成 macOS、Windows 或 Linux 图形 ## 锁定依赖 +言界 1.0.0 固定言台`v1.0.0`和言据 1.1.2 的已审核提交。应用清单固定言界标签后, 首次构建或切换目标平台后,在应用根目录运行: ```sh @@ -12,7 +13,9 @@ yanbao 装 yanbao 查 ``` -提交生成的`言序.lock`。它记录当前目标、依赖精确提交、包内容摘要,以及所选言台动态库的 ABI、SHA-256 和大小。一个目标的锁文件不能冒充另一个架构的锁文件。 +提交生成的`言序.lock`。它记录当前目标、依赖精确提交、包内容摘要,以及所选言台动态库的 +ABI、SHA-256 和大小。一个目标的锁文件不能冒充另一个架构的锁文件;升级言界、言台或宿主 +后也必须重新生成锁和 YXB,不能只替换动态库。 ## 图形应用清单 @@ -36,8 +39,28 @@ yanbao 查 yanbao 构 --release --bundle ``` -言包会把 YXB、当前目标的锁定言台动态库、权限元数据、资源、图标、许可和摘要装入 macOS`.app`、Windows GUI 应用目录或 Linux AppDir。应用不得复制或硬编码 DLL、dylib 或 so 路径。 +言包会把 YXB、当前目标的锁定言台动态库、权限元数据、资源、图标、许可和摘要装入 macOS +`.app`、Windows GUI 应用目录或 Linux AppDir。生产 YXB 和 Bundle 使用言序 1.1.20 或更新 +的兼容稳定版构建;言序 1.1.9 是源码/API 兼容下限,不是生产降级要求。应用不得复制或硬编码 +DLL、dylib 或 so 路径,不使用的剪贴板或文件对话框权限应从清单删除。 ## 六目标发布 -每个目标都应在对应原生执行器重新生成锁、检查、测试、构建示例并运行自动退出窗口。汇总作业只有在六项全部成功后才能创建源码归档、目标锁目录和 SHA-256 文件。平台签名、公证或商店上传属于产物验收后的分发步骤。 +每个目标都应在对应原生执行器重新生成锁、检查、测试、构建应用并运行自动退出窗口。上线 +候选还应在实际桌面会话验证 IME、DPI、字体、屏幕阅读器、剪贴板、文件对话框和关闭报告。 +平台签名、公证或商店上传属于产物验收后的分发步骤。 + +## 核对上游来源 + +言界 1.0 Release 公开六目标归档、独立 SHA-256、包清单和冻结 API。其 Release 工作流不会 +重新编译,只复用同一标签提交的成功标签 CI 候选,并核对候选报告中的来源提交和归档摘要。 +应用的供应链记录至少应保存: + +- 言界与言台标签、精确提交和 Release 链接; +- 下载附件的 SHA-256,以及应用各目标锁中的包/原生制品摘要; +- 构建使用的言序、言包、系统和架构; +- 应用测试、真实桌面冒烟、签名/公证和回滚结果。 + +若需要回滚,恢复同一目标一起保存的旧清单和锁,再重新构建 Bundle;不要把旧 YXB 与新 +动态库或新锁混装。言界自身的候选来源门禁见 +[生产验收](https://github.com/yanxulang/yanxu-ui/blob/v1.0.0/docs/PRODUCTION_VALIDATION.md)。 From 15b5dae0995f45a89931f858b3e650a4d35fc222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:43:07 +0800 Subject: [PATCH 16/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E8=AF=B4?= =?UTF-8?q?=E6=98=8E1.0=E6=89=98=E7=AE=A1=E5=9B=BE=E7=89=87=E8=B5=84?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ecosystem/desktop/images-resources.mdx | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/content/docs/ecosystem/desktop/images-resources.mdx b/content/docs/ecosystem/desktop/images-resources.mdx index 6e1ef43..43054e1 100644 --- a/content/docs/ecosystem/desktop/images-resources.mdx +++ b/content/docs/ecosystem/desktop/images-resources.mdx @@ -1,9 +1,10 @@ --- title: 图片和资源 -description: 加载图片、在控件或画布中使用资源,并理解代际句柄生命周期。 +description: 使用言界 1.0 托管图片、显式所有权、应用配额和幂等关闭。 --- -应用从 PNG 或 JPEG 字节加载图片,格式和像素上限由言台验证,单边最大 16384 像素: +应用从 PNG 或 JPEG 字节加载图片,格式和像素上限由言台验证,单边最大 16384 像素。 +`加载图片`返回言界托管资源: ```yanxu 定 图片资源 为 应用.加载图片(图片字节); @@ -11,10 +12,20 @@ description: 加载图片、在控件或画布中使用资源,并理解代际 图片控件.尺寸(320,180); ``` -画布图片命令引用同一资源句柄,而不是把像素重复写入每个绘制帧。后端呈现时解析句柄;资源关闭后,后续帧不能继续访问它。 +托管资源公开编号、状态、可用、查询、快照和关闭;查询包含宽、高和解码后字节数。画布 +图片命令引用内部同一资源句柄,而不是把像素重复写入每个绘制帧。后端呈现时才解析句柄; +资源关闭后公开句柄置空,后续帧不会继续访问它。 -言台的应用是资源树根,窗口拥有表面和窗口级回调,字体和图片由应用持有。句柄由槽位和代际组成:释放资源后,即使槽位被新资源复用,旧句柄也会返回`PLATFORM_RESOURCE_CLOSED`,不能误操作新对象。 +图片控件默认不取得调用者传入资源的所有权。需要让控件关闭时同步释放图片,可在配置中 +设置`拥有资源`;不要同时让调用者和控件假设自己是唯一所有者。两条路径最终进入同一幂等 +关闭状态机。 -关闭是幂等的,并按子到父顺序释放。应让窗口和控件不再引用图片后再关闭图片,最后关闭应用。`调试快照`可以在测试中核对窗口、计时器、图片、字体和回调数量是否归零,但它不是持久化格式。 +言台句柄由槽位和代际组成:释放资源后,即使槽位被新资源复用,旧句柄也只会返回 +`PLATFORM_RESOURCE_CLOSED`,不能误操作新对象。加载前会检查图片数量与应用剩余图片字节 +配额,元数据或创建失败会回滚平台资源,不产生半初始化托管对象。关闭会归还当前用量, +但不会解冻应用配额。 + +应用关闭会统一清理仍活动的图片并生成结构化报告。诊断快照可核对活动图片、持有字节、 +创建/关闭量和资源归零,但不会包含像素、路径或原生句柄,也不是持久化格式。 发布应用时把图片和字体放入项目资源目录,让言包 Bundle 携带并记录摘要;不要在启动热路径依赖网络下载核心界面资源。 From 663de60509231a40ab412e74d75225718ec14d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:45:04 +0800 Subject: [PATCH 17/23] =?UTF-8?q?=E6=9E=84=E5=BB=BA=EF=BC=9A=E8=B0=83?= =?UTF-8?q?=E6=95=B41.0=E6=96=87=E6=A1=A3=E6=90=9C=E7=B4=A2=E5=AE=B9?= =?UTF-8?q?=E9=87=8F=E9=A2=84=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/check-site.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/check-site.mjs b/scripts/check-site.mjs index d833348..5a896ae 100644 --- a/scripts/check-site.mjs +++ b/scripts/check-site.mjs @@ -77,7 +77,8 @@ for (const required of [ const searchIndex = fs.readFileSync(path.join(output, 'api/search')); const searchIndexBytes = searchIndex.byteLength; const compressedSearchIndexBytes = gzipSync(searchIndex, { level: 9 }).byteLength; -if (searchIndexBytes > 8_000_000) failures.push(`中文搜索索引超过 8 MB:${searchIndexBytes} B`); +// 1.0 桌面指南增加索引内容;实际传输体积继续由下方 2 MB gzip 门禁约束。 +if (searchIndexBytes > 8_250_000) failures.push(`中文搜索索引超过 8.25 MB:${searchIndexBytes} B`); if (compressedSearchIndexBytes > 2_000_000) { failures.push(`中文搜索索引 gzip 后超过 2 MB:${compressedSearchIndexBytes} B`); } From de5a33f3637786b27b500fc0aa78064a355c82df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:47:46 +0800 Subject: [PATCH 18/23] =?UTF-8?q?CI=EF=BC=9A=E9=AA=8C=E8=AF=81=E6=A1=8C?= =?UTF-8?q?=E9=9D=A2=E6=96=87=E6=A1=A3=E5=8F=8C=E5=B7=A5=E5=85=B7=E9=93=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a5438b..27cc0cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,8 +61,12 @@ jobs: test "$("$core" examples/language/问候项目.yx)" = $'你好,言序\n你好,开发者' desktop-examples: - name: 桌面生态示例 + name: 桌面生态示例(言序 ${{ matrix.yanxu }}) runs-on: ubuntu-24.04 + strategy: + fail-fast: false + matrix: + yanxu: ['1.1.9', '1.1.20'] steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - name: 安装原生窗口运行依赖 @@ -71,14 +75,15 @@ jobs: sudo apt-get -o Acquire::Retries=5 install -y \ libfontconfig1 libwayland-client0 libxkbcommon0 libxkbcommon-x11-0 \ libx11-6 xvfb - - name: 检出言序 1.1.9(言界已验证基线) + - name: 检出言序 ${{ matrix.yanxu }} uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 with: repository: YanXuLang/yanxu - ref: v1.1.9 + ref: v${{ matrix.yanxu }} path: target/yanxu-core - - name: 构建言序并锁定言界 + - name: 构建言序并锁定言界 1.0 run: | + grep -Fx '言界 = { 包 = "yanxu-ui", git = "https://github.com/yanxulang/yanxu-ui.git", 修订 = "v1.0.0", 版 = "^1.0" }' examples/desktop/言序.toml cargo build --manifest-path target/yanxu-core/Cargo.toml --locked --bin yanxu target/yanxu-core/target/debug/yanxu 包 更新 examples/desktop - name: 核对文档源码、格式与静态类型 From 0aee0f3b551b40deac45ac2c1fb8b35e6184c551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:48:37 +0800 Subject: [PATCH 19/23] =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=9A=E5=86=BB?= =?UTF-8?q?=E7=BB=93=E6=A1=8C=E9=9D=A21.0=E6=96=87=E6=A1=A3=E5=A5=91?= =?UTF-8?q?=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/check-content.mjs | 50 +++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/scripts/check-content.mjs b/scripts/check-content.mjs index 76c0205..51d8525 100644 --- a/scripts/check-content.mjs +++ b/scripts/check-content.mjs @@ -96,7 +96,8 @@ assert.match(read('app/layout.tsx'), /metadataBase:\s*new URL\('https:\/\/docs\. const docsCi = read('.github/workflows/ci.yml'); assert.match(docsCi, /name: 入门语言示例[\s\S]*?ref: v1\.1\.20/, '语言示例 CI 未固定言序 1.1.20'); -assert.match(docsCi, /name: 桌面生态示例[\s\S]*?ref: v1\.1\.9/, '言界示例 CI 未固定已验证的言序 1.1.9'); +assert.match(docsCi, /yanxu: \['1\.1\.9', '1\.1\.20'\]/, '言界示例 CI 未覆盖最低与当前工具链'); +assert.match(docsCi, /ref: v\$\{\{ matrix\.yanxu \}\}/, '言界示例 CI 未按矩阵固定工具链标签'); assert.match(read('content/docs/language/binary-data.mdx'), /单值硬上限为 16 MiB/); assert.match(read('content/docs/reference/project-format.mdx'), /\| 字节码块 \| 2 \| 2 \|/); assert.match(read('content/docs/reference/permissions.mdx'), /15 项宿主能力/); @@ -115,16 +116,55 @@ for (const requirement of [ } const desktopManifest = read('examples/desktop/言序.toml'); assert.match(desktopManifest, /言序 = ">=1\.1\.9"/); -assert.match(desktopManifest, /修订 = "v0\.1\.1"/); +assert.match(desktopManifest, /版本 = "1\.0\.0"/); +assert.match(desktopManifest, /修订 = "v1\.0\.0"/); +assert.match(desktopManifest, /版 = "\^1\.0"/); +for (const permission of ['图形界面', '原生扩展', '剪贴板', '文件对话框']) { + assert.match(desktopManifest, new RegExp(`^${permission} = true$`, 'm'), `桌面示例缺少 ${permission} 权限`); +} const desktopLock = read('examples/desktop/言序.lock'); assert.match(desktopLock, /generator = "1\.1\.9"/); -assert.match(desktopLock, /yanxu-ui@0\.1\.1/); +assert.match(desktopLock, /target = "aarch64-apple-darwin"/); +assert.match(desktopLock, /yanxu-ui@1\.0\.0/); +assert.match(desktopLock, /yanxu-platform@1\.0\.0/); assert.match(desktopLock, /minimum_yanxu = ">=1\.1\.9"/); +assert.match(desktopLock, /\[package\.native\][\s\S]*?abi = 2/); const desktopCompatibility = read('content/docs/ecosystem/desktop/compatibility.mdx'); -for (const requirement of ['1.1.9', '1.1.20', '0.5.0', '0.6.1', '0.1.1', '1.1.2']) { +for (const requirement of [ + '1.1.9', '1.1.20', '0.6.1', '1.0.0', '1.1.2', + '平台 1.7', '事件 1.3', '无障碍 1.0', '绘制 1.1', '70 个稳定错误码', +]) { assert.ok(desktopCompatibility.includes(requirement), `桌面兼容矩阵缺少 ${requirement}`); } -assert.match(desktopCompatibility, /不存在“言序 1\.1\.20 \+ 言包 0\.6\.1 \+ 言界 0\.1\.1”/); +const desktopMeta = JSON.parse(read('content/docs/ecosystem/desktop/meta.json')); +for (const page of [ + 'accessibility', 'lifecycle-diagnostics', 'forms', 'overlays-menus', 'data-views', 'animation', +]) { + assert.ok(desktopMeta.pages.includes(page), `桌面 1.0 导航缺少 ${page}`); +} +assert.equal( + firstCodeBlock(read('content/docs/ecosystem/desktop/complete-example.mdx'), 'yanxu'), + read('examples/desktop/综合控件展示.yx'), + '言界完整示例与可运行源码不一致', +); +const desktopPages = desktopMeta.pages + .filter((page) => !page.startsWith('---')) + .map((page) => read(`content/docs/ecosystem/desktop/${page}.mdx`)) + .join('\n'); +assert.doesNotMatch(desktopPages, /yanxu-(?:ui|platform)\/blob\/v0\./, '桌面 1.0 文档仍链接 0.x 上游文档'); +assert.doesNotMatch(desktopPages, /言界 0\.1\.1|言台 0\.1\.0/, '桌面 1.0 文档仍把旧预览版写成当前版本'); +for (const requirement of [ + '30 个声明', '23 个类', '7 个包级函数', '125 个域', '375 个方法', +]) { + assert.ok(read('content/docs/ecosystem/desktop/api-reference.mdx').includes(requirement), + `言界 1.0 API 参考缺少 ${requirement}`); +} +for (const requirement of [ + '平台协议为`1.7`', '事件协议为`1.3`', '无障碍协议为`1.0`', 'YXDR 1.1', +]) { + assert.ok(read('content/docs/ecosystem/desktop/platform-architecture.mdx').includes(requirement), + `言台 1.0 架构缺少 ${requirement}`); +} const stableLibraries = [ ['yanju', '1.2.0', '1.1.6', 'content/docs/ecosystem/yanju/index.mdx', '/ecosystem/yanju/'], From 4ca254c157c01a95e8f82c57a5c5372c0a0fbae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Wed, 22 Jul 2026 23:54:24 +0800 Subject: [PATCH 20/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A01.0=E7=94=9F=E4=BA=A7=E6=8C=87=E5=8D=97=E5=85=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/desktop/index.mdx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/content/docs/ecosystem/desktop/index.mdx b/content/docs/ecosystem/desktop/index.mdx index c6a6553..72a551c 100644 --- a/content/docs/ecosystem/desktop/index.mdx +++ b/content/docs/ecosystem/desktop/index.mdx @@ -32,6 +32,17 @@ winit,适合立即模式开发和 egui 控件生态;**言界 1.0 + 言台 1. 言界 1.0 已冻结公开 API、言台 1.0 协议组合和六目标发布契约。选型应依据编程模型、控件需求和部署验证,不再需要因工具链兼容缺口回退到言窗。 +## 言界 1.0 生产指南 + + + + + + + + + + ## 两条路线的边界 言窗公开应用、窗口、布局、控件、事件、图片、画布、剪贴板和文件对话框对象,控件由 From 0488b4b7033d5dba96431a2fe4048d80b63c7117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Thu, 23 Jul 2026 00:26:57 +0800 Subject: [PATCH 21/23] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=94=9F=E6=80=81=E6=A1=8C=E9=9D=A2=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/docs/ecosystem/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/ecosystem/index.mdx b/content/docs/ecosystem/index.mdx index b1cf53c..07e6397 100644 --- a/content/docs/ecosystem/index.mdx +++ b/content/docs/ecosystem/index.mdx @@ -9,7 +9,7 @@ description: 了解在语言核心之外独立版本化、独立发布的官方 - + 选择生态包前先核对其 Release、最低核心版本、锁定来源、权限和测试范围。核心版本号不能 From d7a007f53f19a9b665a3d8c7908875aab52aaf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Thu, 23 Jul 2026 05:46:52 +0800 Subject: [PATCH 22/23] =?UTF-8?q?=E7=A4=BA=E4=BE=8B=EF=BC=9A=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E6=A1=8C=E9=9D=A21.0=E5=8F=91=E5=B8=83=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desktop/\350\250\200\345\272\217.lock" | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git "a/examples/desktop/\350\250\200\345\272\217.lock" "b/examples/desktop/\350\250\200\345\272\217.lock" index 51791b0..ef5b10c 100644 --- "a/examples/desktop/\350\250\200\345\272\217.lock" +++ "b/examples/desktop/\350\250\200\345\272\217.lock" @@ -1,23 +1,23 @@ lock_version = 2 -manifest_checksum = "9287fbf4340310fae1aeef66c4eb2aafca93c0c74a6d31b13eac3bbabe5ac5a8" +manifest_checksum = "6c55aec4be9991dabc748e93b85c2b82a8c066bfd9ef5e8809a9ed317d596789" target = "aarch64-apple-darwin" -generator = "1.1.9" +generator = "1.1.20" [root_dependencies] -"言界" = "yanxu-ui@0.1.1#44f9b5e8534a-193ba75d1d46bdf0" +"言界" = "yanxu-ui@1.0.0#44f9b5e8534a-cfb7de23c2dcbb76" [root_dev_dependencies] [[package]] -id = "yanxu-platform@0.1.0#d95caa6bf952-93c96bdb2e39ad2a" +id = "yanxu-platform@1.0.0#d95caa6bf952-c0ebb9773aa5a4d9" name = "yanxu-platform" -version = "0.1.0" +version = "1.0.0" source = "git:https://github.com/yanxulang/yanxu-platform.git" -revision = "c9aac937942cf81bfdfb285f6b50afcb56a49a86" -checksum = "93c96bdb2e39ad2a8bf740dc24bb71082a232dc44885e5a9f07c05dea38b5e24" +revision = "9b6bce794a2e23fba04340f762e3d8f49a2724ff" +checksum = "c0ebb9773aa5a4d9e889213ef085d9f75f5959f7cc5b63aa7c60f4e83f5df0ad" entry = "src/主.yx" target = "aarch64-apple-darwin" -minimum_yanxu = ">=1.1.7" +minimum_yanxu = ">=1.1.7, <2.0.0" [package.dependencies] @@ -28,26 +28,28 @@ minimum_yanxu = ">=1.1.7" abi = 2 target = "aarch64-apple-darwin" path = "dist/aarch64-apple-darwin/libyanxu_platform_native.dylib" -checksum = "ad91b0a85a9f39926dc2b2127a648b29eaff2e4b3521be893f7c11ec7ffc3c9c" -size = 4670368 +checksum = "4ba2a55db0828178d67c555500844bc2e03856bef79aeddae96bf0d3bfec6fdb" +size = 6129760 [[package]] -id = "yanxu-ui@0.1.1#44f9b5e8534a-193ba75d1d46bdf0" +id = "yanxu-ui@1.0.0#44f9b5e8534a-cfb7de23c2dcbb76" name = "yanxu-ui" -version = "0.1.1" +version = "1.0.0" source = "git:https://github.com/yanxulang/yanxu-ui.git" -revision = "fb7776baa05ba4ec950696eb9a4cc1f11f290638" -checksum = "193ba75d1d46bdf0489fc5c7efd667f4f1c3dad0ee578d2461c84e2bc44494c9" +revision = "5818a5aa76790f85480c90b3ce80be73df3f11b9" +checksum = "cfb7de23c2dcbb76a4eafc265217fcb33ef19d065b36cf12c22c3902ee34eae1" entry = "src/主.yx" target = "aarch64-apple-darwin" minimum_yanxu = ">=1.1.9" [package.dependencies] -"言台" = "yanxu-platform@0.1.0#d95caa6bf952-93c96bdb2e39ad2a" +"言台" = "yanxu-platform@1.0.0#d95caa6bf952-c0ebb9773aa5a4d9" "言据" = "言据@1.1.2#9f376cc5bbdb-224c315783494338" [package.exports] "几何" = "src/核心/几何.yx" +"叠层" = "src/叠层/公共.yx" +"数据源" = "src/数据/源.yx" "文本" = "src/文本/文档.yx" "脏区" = "src/核心/脏区.yx" "配置" = "src/样式/配置.yx" From 9e27c772c10e18525e196123a45e0cda310fc49e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A7=80?= Date: Thu, 23 Jul 2026 06:36:25 +0800 Subject: [PATCH 23/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E4=BF=9D?= =?UTF-8?q?=E6=8C=81=E6=96=87=E6=A1=A3=E7=A4=BA=E4=BE=8B=E6=9C=80=E4=BD=8E?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E9=93=BE=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "examples/desktop/\350\250\200\345\272\217.lock" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/examples/desktop/\350\250\200\345\272\217.lock" "b/examples/desktop/\350\250\200\345\272\217.lock" index ef5b10c..fdfc1cd 100644 --- "a/examples/desktop/\350\250\200\345\272\217.lock" +++ "b/examples/desktop/\350\250\200\345\272\217.lock" @@ -1,7 +1,7 @@ lock_version = 2 manifest_checksum = "6c55aec4be9991dabc748e93b85c2b82a8c066bfd9ef5e8809a9ed317d596789" target = "aarch64-apple-darwin" -generator = "1.1.20" +generator = "1.1.9" [root_dependencies] "言界" = "yanxu-ui@1.0.0#44f9b5e8534a-cfb7de23c2dcbb76"