4197 Commits

Author SHA1 Message Date
chinboy a135880834 release: prepare AtomUI 6.2.0 v6.2.0 2026-09-18 22:08:23 +08:00
chinboy c8f40d9a4c fix(Semantic): 修复弹层钉住、语义作用域、布局及资源生命周期 2026-09-18 14:21:06 +08:00
CHINBOY b17b6b229c fix(Dialog): 修复窗口宿主请求尺寸覆写 ClientSize 的黑带渲染并补齐原生标题栏下正文留白 2026-09-18 08:40:48 +08:00
chinboy b72256853e gallery(Community): 换用 Atom Innovation 双主题矢量字标并补资源与主题测试 2026-09-17 16:02:58 +08:00
chinboy 550cd34e91 fix(Segmented): 对齐 antd 选中滑块动效并由滑块独占承载选中背景 2026-09-17 15:07:00 +08:00
chinboy 838163b6ca Merge branch 'feature/semantic' into release/6.0 2026-09-17 11:49:21 +08:00
chinboy 64f666ecb8 fix(Semantic): 修复变基后溢出弹窗 Background 适配与本地化目录基线 2026-09-17 11:40:15 +08:00
chinboy b3d53f32a4 feat(Semantic): 增加 Splash 语义部件并对齐预览双进度态与示例 logo 尺寸 2026-09-17 11:13:22 +08:00
chinboy 1ec73c6015 feat(Semantic): 增加 ComboBox 语义部件并修复钉住遮罩与根边框定制 2026-09-17 11:13:22 +08:00
chinboy 8a227e61af feat(Semantic): 增加 ButtonSpinner 语义部件并修复输入族根边框定制失效
将 ButtonSpinner 纳入 Semantic Part 改造(原排除判定撤销),按全量改造设计 §2.1
第 4 条以产品职责直接对应建立映射。

准入依据:上游稳定版 InputNumberSemanticType 公开并实际消费 root / prefix /
suffix / input / actions 五个分区键,其中 actions 应用于包裹上、下步进按钮的容器,
对应 AtomUI 的 ButtonSpinnerHandle;原判定「InputNumber 的 handle 属内部区域」的
事实前提不再成立。边界如实记录:上游至今没有独立 spinner owner,本项准入依据的是
上游 actions 键叠加用户指令,而非原触发条件(新稳定版出现独立 spinner owner)自动
满足。

实现:
- 新增 ButtonSpinner.SemanticParts.cs 声明六个 Part,ButtonSpinner 声明为 partial:
  content / innerLeftContent / innerRightContent 位于帧模板,actions 位于 owner 模板
  内的手柄,increaseButton / decreaseButton 位于手柄模板;后五者声明
  CrossNestedOwners。含隐式 root 共七个 Part,均为 Single。
- 帧内容槽不复用 semantic-prefix / semantic-suffix:NumericUpDown 已发布的 prefix
  route 是宽松后代(/template/ .semantic-scope-spinner >> .semantic-prefix),而
  ButtonSpinner 的帧节点位于 NumericUpDownSpinner 子树内,复用会让该 route 命中两个
  节点并破坏其已发布的 Single 契约;改用与自身公开 API 同名的
  innerLeftContent / innerRightContent。
- 修复根边框定制失效:可见外框由共享帧绘制、其状态机拥有 BorderBrush,owner 的
  BorderBrush 此前完全落不到帧上(ButtonSpinner、Select、TreeSelect、Cascader、
  OtpLineEdit 均如此)。改为以 LocalValue 中继到帧,并带接管标记,避免嵌套 owner
  (NumericUpDown 的 spinner 即 ButtonSpinner)的中继被内层清除。
- 修复帧动效接线缺失:ButtonSpinner、NumericUpDown 两个模式、Select / TreeSelect /
  Cascader 的帧未接收 owner 的 IsMotionEnabled,回落到帧主题的共享默认值而使过渡
  常开;进行中的 SolidColorBrush 过渡优先级高于中继写入的 LocalValue,令运行中的根
  边框定制静默失效。模板应用前赋值不存在过渡基线,故早期测试无法暴露该缺陷。
- OtpLineEdit 保留 CellBorderBrush 的 cell 专用优先级,根 BorderBrush 作为其回落;
  Background 不参与中继,避免控件级透明背景覆盖 cell 主题填充。

测试:
- 新增 ButtonSpinnerSemanticPartTests(9 例):descriptor 字段与顺序、六类 marker
  契约、生成样式各精确命中目标、状态切换后 marker 稳定、默认主题不消费 .semantic-*,
  并锁定帧槽位不复用 semantic-prefix / suffix 的回归护栏。
- 新增 ButtonSpinnerRootSurfaceTests(5 例)、NumericUpDownRootSurfaceTests 扩至 7 例、
  SelectRootSurfaceRelayTests(15 例)、OtpLineEditRootSurfaceRelayTests(4 例),覆盖
  定制压过 hover / focus 状态机、置空恢复状态机、模板前赋值、未定制保持 rest 状态、
  实时改边框立即生效、以及帧动效接线。
- NumericUpDownSemanticPartTests 作为共享帧回归护栏全绿,证明未破坏其已发布契约。

Gallery:
- ButtonSpinnerShowCase 迁移到 GalleryShowCaseHost,新增 Semantic Parts 页签与
  SemanticStyles 示例(含根边框定制),补齐 9 个资源键 × 4 语言。
- Semantic Parts 页签收敛为单个预览:初版误发两个预览(Floating handle 与
  Inline handle),但 IsButtonSpinnerFloatable 默认 False 且前者未显式设置,两者
  渲染同一个默认常驻手柄、七行部件说明完全重复;页面测试改为断言恰好一个预览。

文档:
- 新增 semantic-part.md,并重写 overview.md 中过期的 root/trigger/item/popup/motion
  语义表为真实契约;补齐 ButtonSpinner 与四个输入族控件的 changelog,并在
  semantic-part.md 标明「默认是常驻手柄」以免再现上述预览误判。
- 记录范围撤销:改造设计 §2.3 / §2.4、计划新增第六批任务;新增真机验收步骤文档。

验证:Desktop 4068/4068、Gallery 645/645、GalleryBase 185/185、Generator
SemanticPart 54/54、AtomUI.slnx 构建 0 warning / 0 error、LLMS verify 通过
(79 控件 / 161 文件)、git diff --check 干净。真机视觉验收待用户回传截图,未宣称通过。

(cherry-pick 自 feature/semantic-buttonspinner 的 6d693d13a,并按新基线适配)
- Since 统一由 6.0 改为 6.2.0:新基线的生成器新增 SemanticPartInvalidSince 校验,只接受
  major.minor.patch 三段式发布版本,原值在合并后会直接阻断生成。
- 合并当日两次范围纳入:GroupBox(无上游 owner,用户指令纳入)与本 ButtonSpinner 各自使
  准入家族 +1、排除控件 -1;合并后准入家族 65、排除控件 12(非任一分支单独记录的 64/13)。
- 本地化单元计数按新基线重算为 4749(原分支 4741 基于旧基线,已失效)。
2026-09-17 11:13:21 +08:00
chinboy 8743d2c321 docs(Semantic): 记录 GroupBox 语义部件真机视觉验收结果 2026-09-17 11:13:21 +08:00
chinboy 21903f7a30 fix(Generator): 统一语义部件 Since 为三段式发布版本并校验格式 2026-09-17 11:13:21 +08:00
chinboy 41c27a9ea3 feat(Semantic): 增加 GroupBox 语义部件并对齐边框定制入口与示例 2026-09-17 11:13:21 +08:00
chinboy a766af18c8 docs(Semantic): 追认 Menu 与 TabStrip 纳入范围并同步批次进度
经用户指令撤销 Menu 与 TabStrip 的原排除判定。二者当初都以「上游没有独立
public owner」为由拒绝映射(TabStrip 之于 Tabs、Menu 之于桌面命令菜单),但该
理由检验的是上游 owner 数量,而设计文档 §2.1 第 4 条要求的是产品职责直接对应。
实现此前已随 NavMenu(1e22ed1a3)与 TabControl 提交落地,本次为追认并补齐
范围记录,使文档与实现一致。

计数同步(校验 1 + 63 + 14 = 78,与 78 个正式控件文档叶子一致):
- 本轮待改造 61 → 63;不适用 16 → 14。
- §2.3 纳入映射 62 → 64 行;§2.4 排除映射 16 → 14 行。
- 批次分解:Batch 2 16+1 → 16+2;Batch 5 2 → 2+1;各批合计 16+18+15+11+3 = 63。

范围记录:
- 设计文档 §2.2 补正 tabs 条目;§2.3 新增 TabStrip 与 Menu 两行;§2.4 删除两行
  并新增日期化范围变更段,记录原判定、为何不成立、新批次。
- 总计划「不适用」清单删除两项、新增范围变更说明、批次进度补两条、
  合计待改造 61 → 63。

进度回填(此前长期落后于实际提交):
- 新增第二批任务 17(TabStrip)与第五批任务 3(Menu),逐项回填证据。
- 第二批 17 → 18 家族、第五批 2 → 3 家族;第四批任务 11(SplitButton)、
  第五批任务 1/2 的检查项按提交事实回填。
- 总计划收尾清单第 1 项(61 → 63)、第 3 项(16 → 14)。

其他更正:
- 修正契约文件名笔误 semantic-part-design.md → semantic-part.md。生成器只按
  semantic-part.md 发现语义契约(ControlInventory.cs 的 GetOptionalFilePath),
  按原名创建会被静默忽略、契约不生效;同时记录该文件为可选输入,缺失时生成器
  会回退到 overview.md 内联章节或默认占位。
- 澄清 DataGrid 条目中的措辞:Menu 被列为「被排除控件」指的是 owner 隔离
  (DataGrid 不因内部组合了 Menu 而对外声明 Menu 的语义区域),与 Menu 自身
  是否纳入无关。
- 补全 NativeAOT 发布命令的 PATH 前置说明,并记录报告应落在临时路径。

第 5 批性能与状态取证结果(本轮执行):
- 已取得 NavMenu 与 DataGrid 各 8 场景现状基线;DataGrid 状态验证通过
  (staleCommits=0、realizedMax=6、maxConcurrent 有界)。报告在工作树 tmp/。
- 改造前基线不可得:性能工具在 release/6.0 上编译失败(引用已不存在的
  StepsStyle / CalendarItemIndicator / CalendarButton / Avatar),该破损可追溯到
  两分支共同祖先 c4ac505ff;修复提交 628ca582d 只在 feature/semantic 上。
  且该修复晚于 NavMenu 与 DataGrid 的改造,二者的 before 数据已不可恢复。
- Gallery NativeAOT 发布在沙箱内无法产出产物(挂起 1 小时 6 分无 artifact),
  需非沙箱环境重跑。
- --verify-navmenu-states 的「Closed vertical NavMenu should not subscribe to
  global input manager」失败经 diff 判定为预存在问题(断言与实现在两分支逐字节
  一致,release/6.0 同样失败),本轮不改动,仅记录。

验证:LLMS verify 通过(79 控件 / 161 文件);Desktop Controls 4031/4031、
DataGrid 293/293、Generator 528/528、GalleryBase 185/185、Gallery 644/644;
git diff --check 干净。
2026-09-17 11:13:21 +08:00
chinboy e4ba7ee512 docs(Semantic): 修正 SearchEdit 语义契约占位表并补正 public surface 描述
overview.md 的 LLMS 语义区域表原为生成器默认占位(root / input / trigger /
popup / validation,"相关 API" 列写「见 API 与契约模型」),与实际 descriptor
完全不符,且被逐字投射进对外生成的 semantic-cn.md,等于公开传播错误契约。
按 SearchEdit.SemanticParts.cs 的真实声明替换为 prefix / input / suffix /
clear / button 五个 Selector 部件,并记录路由锚点
(semantic-scope-input-frame / -prefix / -suffix),说明 semantic-content 与
semantic-placeholder 是非 Part 的辅助 marker,不注册 descriptor、不生成
Style,不属于对外语义契约。

同时补正同一文档中两处与源码不符的 public surface 描述:
- SearchButtonText 实际类型为 object?,原文写 string。
- 内部前后缀入口只有 InnerLeftContentTemplate / InnerRightContentTemplate,
  LineEdit 基类上没有非 Template 版本(文档照搬了别处的命名)。

全量审计(116 个声明部件名 vs 全部目标家族生成文档)确认这是 63 个家族中
唯一的契约与代码不符项。

验证:
- LLMS generate + verify 通过(79 控件 / 161 文件),影响面精确覆盖
  search-edit/semantic-cn.md 与两个聚合文件。
- SearchEdit 24/24、Docs.LLMsGenerator.Tests 23/23、Gallery 644/644、
  Desktop Controls 4031/4031 全绿,git diff --check 干净。
2026-09-17 11:13:21 +08:00
chinboy 834cb7f655 docs(Semantic): 修正 Expander 提交记录中的 commit hash
计划文档原先记录的是 feature/semantic-expander 上的提交 `f1a61683e`,该提交经
cherry-pick 到本分支后 hash 变为 `be7b8dc71`。原分支将被删除,旧 hash 会成为
死引用,故把三处引用更新为本分支上的实际提交。

涉及:
- 第二批任务 16「强制停止」项
- 总计划批次清单「第二批追加 Expander」项
- 总计划第二批状态「追加(2026-09-15)」段落
2026-09-17 11:13:21 +08:00
chinboy 5b8599acee docs(Semantic): 同步 Expander 完成记录与批次 2 家族计数
- 第二批任务 16 勾选「强制停止」项,记录用户授权提交 f1a61683e。
- 总计划批次清单勾选「第二批追加 Expander」,批次 2 状态补充 16 → 17 个家族。
- 复核并更新批次 2 收尾检查备注:2026-08-27 记录的两类存量受阻问题
  (ImageLoaderDisposeTests headless 挂起、Gallery CustomizeTheme 断言)
  已不复现,Desktop 4030/4031 与 Gallery 644/644 通过。
2026-09-17 11:13:21 +08:00
chinboy 2e96cb6e0d feat(Semantic): 增加 Expander 语义部件并修复圆角裁剪失效
将 Expander 纳入 Semantic Part 改造(原排除判定撤销),对齐上游 Collapse
已公开的五个语义键 root / header / icon / title / body。

实现:
- 新增 Expander.SemanticParts.cs 声明五个 Part;ExpanderTheme.axaml 增加
  semantic-header / semantic-icon / semantic-title / semantic-body 四个静态 marker。
- body 声明 cardinality Optional:其承载节点位于 PART_ContentMotionActor 内,
  折叠稳定态下 actor IsVisible=False,ContentPresenter 不挂接视觉子级、节点从
  视觉树完全缺席,首次展开才物化;再次收起时节点保持存在(ContentPresenter
  转不可见不解除挂接)。header / icon / title 为常驻节点,声明 Single。
- 修复 PART_Frame 圆角被覆盖:该节点只做矩形裁剪,紧贴左上角且带不透明背景的
  header 会盖住圆弧。新增 ClipContentToCornerRadius="True",由根节点统一把整棵
  子树裁到圆角内框,与展开状态、方向、视觉模式无关。默认 HeaderBg alpha≈2% 使该
  缺陷几乎不可见,但 IsGhostStyle 与任何不透明 Part 背景都会暴露它。

测试:
- 新增 ExpanderSemanticPartTests(11 例):descriptor 字段与顺序、四个静态 marker
  契约、生成样式各精确命中一个节点、状态与视觉模式切换后数量不变、body 三阶段
  呈现语义,并证明 header 位于 PART_HeaderLayoutTransform 内仍由单一 /template/
  路由命中。
- ExpanderBehaviorTests 新增圆角裁剪回归(展开/收起 × Ghost × Borderless)。

Gallery:
- ExpanderShowCase 迁移到 GalleryShowCaseHost,新增 Semantic Parts 页签
  (1 个预览 + 5 张 Part 描述卡)与 SemanticStyles 示例,补齐 7 个资源键 × 4 语言。
- 同步页面测试、快照提取范围、目录顺序基线与单元计数。

验证:Desktop 4030/4031(唯一失败为预存在抖动,隔离复跑全绿)、Generator 528/528、
GalleryBase 185/185、Gallery 644/644、LLMS generate + verify、git diff --check 均通过;
圆角裁剪已在真实 Skia 后端(Gallery 桌面宿主)完成视觉验收。
2026-09-17 11:13:20 +08:00
chinboy 4cd394fb25 fix(Badge): 修复指示器残留漂移、宿主拉伸错位与 standalone 空白渲染 2026-09-17 11:13:20 +08:00
chinboy ce813e0579 feat(Semantic): 增加 SplitButton 语义部件并修复弹层钉住与子菜单状态递归 2026-09-17 11:13:20 +08:00
chinboy 50abd88be7 feat(Masonry): 对齐 antd item 动效与 RTL 镜像并同步文档与示例文案 2026-09-17 11:13:20 +08:00
chinboy 955d77b792 fix(Feedback): 适配 Message 与 Notification 语义部件至堆叠架构并同步示例文档与本地化 2026-09-17 11:13:20 +08:00
chinboy 0aea564bb6 fix(Performance): 对齐 semantic 分支控件 API 并修复 headless 关停丢任务 2026-09-17 11:13:20 +08:00
chinboy 1b61a9df1f feat(Semantic): 增加 DataGrid 语义部件并对齐上游示例 2026-09-17 11:13:20 +08:00
chinboy 11f2d4f030 docs(Semantic): 重新生成 LLMS 聚合文件修复合并后的过期生成物 2026-09-17 11:13:04 +08:00
chinboy 557a212b12 feat(Semantic): 增加 NavMenu 与 Menu 语义部件并修复弹层钉住与子菜单状态递归 2026-09-17 11:13:04 +08:00
chinboy eb8270b7ad fix(Semantic): 修复 Window 宿主 Dialog 语义样式跨根级联失效并完善示例文案 2026-09-17 11:13:04 +08:00
chinboy 6ff2741a7a fix(Gallery): 修正 Modal 语义示例过时文案并对齐 MessageBox 2026-09-17 11:13:04 +08:00
chinboy 9ece51d74a feat(Semantic): 增加 Dialog/MessageBox 语义部件并引入 OverlayScope/IsPinnedOpen 2026-09-17 11:13:04 +08:00
chinboy 3eccb69165 feat(Semantic): 增加 Notification 语义部件、引入 Actions API 并对齐上游示例 2026-09-17 11:13:04 +08:00
chinboy 50bacabade docs(Semantic): 记录 PopupConfirm 真机视觉验收并同步批次状态 2026-09-17 11:13:04 +08:00
chinboy cbde97e099 feat(Semantic): 增加 PopupConfirm 语义部件并对齐上游示例 2026-09-17 11:13:04 +08:00
chinboy 3c88501bb5 fix(Semantic): 修复 Message 语义示例对齐并移除高亮白环 2026-09-17 11:13:04 +08:00
chinboy 0ca285cf7c feat(Semantic): 增加 Message 语义部件、对齐上游示例并统一 Semantic Part 示例标题 2026-09-17 11:13:03 +08:00
chinboy 02dca1c1f7 feat(Semantic): 更新 Popup、Overlay 和服务宿主控件家族的语义契约,增加 DropdownButton 控件并修正相关文档 2026-09-17 11:13:03 +08:00
chinboy 20e118107d docs(Semantic): 修复 LLMS 文档门禁并同步改造计划进度 2026-09-17 11:13:03 +08:00
chinboy 71a8e3f99c feat(Semantic): 增加 Tour 语义部件并对齐上游示例 2026-09-17 11:13:03 +08:00
chinboy e969f2b7ed feat(Semantic): 增加 Drawer 语义部件并修复作用域层跟踪错位与预览裁剪 2026-09-17 11:13:03 +08:00
chinboy babbbd4c72 feat(Semantic): 增加 DropdownButton 语义部件并对齐上游示例 2026-09-17 11:13:03 +08:00
chinboy 5cfb54ad46 feat(Semantic): 增强 ImagePreviewer 语义预览高亮并移除 popup.close 部件 2026-09-17 11:13:03 +08:00
chinboy 778982b875 feat(Semantic): 增加 ImagePreviewer 语义部件并支持封面图片圆角裁剪 2026-09-17 11:13:03 +08:00
chinboy 8964ef8386 fix(Semantic): 修正 SplitButton 和 DropdownButton 的语义 DOM API,确保独立 owner 的实际消费 2026-09-17 11:13:02 +08:00
chinboy 352e9f5517 test(NavMenu,Flyout): 修正过时及过宽的主题契约 2026-09-17 11:13:02 +08:00
chinboy 162e4f8730 feat(Semantic): 增加 Tooltip 语义部件并修复阴影圆角脱节与预览宽度问题 2026-09-17 11:13:02 +08:00
chinboy e019a0251c feat(Semantic): 增加 InfoFlyout 语义部件并对齐上游示例 2026-09-17 11:09:27 +08:00
chinboy e151cb05ad fix(Semantic): 限高钳制增加内容下限,修复短窗口预览页缺失垂直滚动条 2026-09-17 11:09:27 +08:00
chinboy 85fa746b41 feat(Semantic): 增加 TimePicker 语义部件并修复输入宽度跳变与钉住弹层遮挡 2026-09-17 11:09:27 +08:00
chinboy 9d551d68a1 feat(Semantic): 增加 DatePicker 语义部件并修复钉住弹层遮挡 2026-09-17 11:09:27 +08:00
chinboy 6b9be4c95b feat(Semantic): 增加 TreeSelect 语义部件并对齐上游示例 2026-09-17 11:09:27 +08:00
chinboy 5f02048707 feat(Semantic): 增加 Mentions 语义部件并修复多行候选弹层定位 2026-09-17 11:09:26 +08:00