# Changelog 所有显著改动按 [SemVer](https://semver.org/) 记录于此。格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。 ## [Unreleased] ### Design system · 组件族参数化:79 个并列组件 → 48 个概念组件(S6-P21) - **问题**:79 个并列组件里有 44 个是同源变体,却各自手写了一遍。导航最典型——`topmenu` / `sidemenu` / `mixednavigation` 三份实现,差异只是"一级菜单横排还是竖排";规范契约自己就写着从属关系:`alertmodal` 与 `confirmmodal` 的 `doNotInvent` 原文是「弹窗尺寸档位(见 Modal 契约)」,`steps` 与 `steplist` 的 `semanticTypeCandidates` 完全相同(均为 `steps|wizard`)。并列表达让消费方看到 6 个表格组件,而它们实际是「一个 Table + 一个 feature 参数」。 - **新增族层(纯追加,不破坏任何既有承诺)**:新增 `.design_library/aurora-admin/families.json`;`data.json` 增顶层 `families` 与每组件 `family` / `familyRole` / `familyParams`;`site/details/.json` 同步三元组。**13 族 / 44 成员 / 35 个独立组件;`data.json` 仍完整输出 79 个组件,slug 集合逐一不变**(铁律 5)。 - **归族判据可核对,不按名字猜**:每族在 `tools/lib/family-model.mjs` 里必写 `mergeBasis`,依据是契约中四类可核对字段——`semanticTypeCandidates` 重叠、`anatomy` 为同一骨架的子集、变体维度同构、`doNotInvent` 的显式从属声明。 - **实现层合并(导航族端到端切片)**:`tools/gen-family-impl.mjs` 从 `tools/lib/family-impl/nav-menu/` 的 5 端模板生成 `TopMenu` / `SideMenu` / `MixedNavigation` 共 15 个文件,参数为 `direction=top|side|mixed`。三份 CSS 的 **md5 完全相同**——一份样式表服务三个组件;改模板 + 重跑即三端同步,不再存在"改了 topmenu 忘了 sidemenu"。 - **为什么是「生成」而不是「抽共享模块」**:`tools/pack-deploy.mjs`(薄壳 79 / 实现 395)、`tools/precompute.mjs`(79 / 395)、`tools/verify-cross-platform.mjs`、`tools/verify-package-import.mjs` 四处硬断言文件数与导出数。抽跨文件 import 会同时打破它们,并失去"单文件可拷贝"。生成把重复消除在源头,而不改动文件图。 - **生成器护栏**:目标文件有未提交改动、且不含生成物标记时拒绝覆盖(除非 `--force`)——防止把工作区里没提交的手工调整冲掉。 - **跨端口径(两个数必须分开说,免得把自己的改动说大成整体改善)**:已提交 HEAD 为 `identical 2 / differing 77 / high 44`;本任务改动前的工作区已是 `79/79`(既有未提交改动先清了跨端漂移);本任务改造后仍为 **`identical 79 / differing 0`,与工作区持平**。中途曾掉到 76/79:族模板最初把方向写成对象字面量 `{ direction: 'side' }`,Vue 端 class 提取器会把其中的字符串值收作变体记号、H5/JSX 端不会。探针实验确认成因后改用独立常量 `FAMILY_DIRECTION` 承载方向,四端回到 79/79——是改代码对齐既有约定,未放宽校验脚本。提取器本身的不对称仍未修,已登记 ROADMAP S6-P22。 - **顺带修掉一处既有 RTL 不一致**:`MixedNavigation.css` 原文件同时写 `border-inline-start` 与 `border-left-color`(逻辑属性与物理属性混用,RTL 下两侧指示条表现不一致);族模板统一为逻辑属性。 - **验收**:族层 `node tools/verify-families.mjs` → `OK: 族层端到端一致(13 族 / 44 成员 / 79 组件不变 / 395 文件不变)`,退出码 0;`node tools/gen-family-impl.mjs --only=nav-menu` 幂等(重跑 0 写入);回归 100%(79/79 页,1017/1017 断言,N/A 34)**连跑 8 次一致、0 超时**;零运行时依赖不变(`dependencies` 为空)。 ### Package · 发布到私有 npm 源(可直接 npm install) - **发布位置**:自建 Gitea 的 npm registry `https://gitea.mymoyu.top/api/packages/root/npm/`(Gitea 27.3.1),**匿名可读**——实测无凭据 `npm view` / `npm install` 均成功。 - **已发布 3 个可互换的包名**(内容一致:三端入口各 79 组件 + 令牌 + 组件样式): | 包名 | 用途 | |---|---| | `@root/ui` | **推荐**:scoped 名,项目 `.npmrc` 写一行 `@root:registry=…` 即可,其余依赖仍走公共源 | | `chunyu-ui` | 非 scoped 别名,需 `--registry=` 显式指定源 | | `aurora-admin-design` | 仓库原名,同上 | - **踩到的坑(已写进 README)**:非 scoped 包**不能**用 `@包名:registry=` 写法——该语法只对 scoped 名生效,实测报 404。故推荐 scoped 名 + 一行 `.npmrc`。 - **端到端验证**:建 Vite + Vue 3 工程,`.npmrc` 一行配置 + `npm install @root/ui`(公共依赖同时走公共源)→ `vite build` 通过(169 模块)→ 浏览器实测:`AaButton` 渲染、品牌色 `rgb(47, 84, 235)` 生效、`AaTag` 正常、点击计数交互正常、0 JS 报错。 - **未发布到公共 npm**:本机无 npm 凭据(`npm whoami` → `ENEEDAUTH`,无 `~/.npmrc`、无 token 环境变量),`npm publish` 到 registry.npmjs.org 被拒。公共 npm 上 `chunyu-ui` / `aurora-admin-design` 均未被占用(可用),是否发布待定。 - README 增补「从私有 npm 源安装」段(含正确的 `.npmrc` 写法与三端 import 示例)。 ### Docs site · 导航语言选择改为下拉(S5-P19) - **问题**:顶栏语言控件是「中 / EN」双段按钮——11px 圆角、28px 高、靠 2px 字号差和品牌色表示当前语言。两个语言标签同时高亮显示,当前语言靠粗细区分,一是看不出「点了会怎样」(无展开暗示),二是与旁边 34px 的框架选择器、搜索框不同高,三是纯鼠标控件:没有 `aria-haspopup`、没有键盘路径。 - **改为下拉选择**:触发器 = 地球图标 + 当前语言名(简体中文 / English)+ 箭头,34px 高与相邻控件齐平,展开时箭头旋转 180°、边框转品牌色并带聚焦环;菜单 186px 卡片,含「界面语言」标题分隔线、语言名 + `ZH`/`EN` 角标 + 选中对勾,8px 顶栏令牌阴影。 - **交互与无障碍**:`role="listbox"` + `aria-selected` + `aria-expanded`;点击展开/收起、点击外部关闭、`Esc` 关闭并回焦触发器、`↑`/`↓` 循环移动、`Home`/`End` 跳首尾、`Enter`/`Space` 选中、`Tab` 关闭且不抢焦点;选中后触发器重新获得焦点。语言名始终以该语言自身书写(简体中文 / English),不随界面语言翻译。 - **令牌与暗色**:颜色/圆角/阴影全部走 `--au-*` 令牌,未新增任何硬编码色值;暗色模式实测菜单底色 `rgb(28,31,38)`,选中项对比度 4.57、菜单标题 6.50、触发器 4.57(均 ≥ 4.5)。`prefers-reduced-motion: reduce` 下关闭菜单动画与箭头过渡。 - **窄屏**:≤1100px 收起语言名(触发器 56px,与旧控件同宽)。实测改动前顶栏在 1024px 溢出 13px、900px 溢出 9px(旧控件同样外露),现 ≥860px 全部为 0;≤820px 的溢出与语言控件无关,已登记为 ROADMAP S5-P20。 - **i18n**:新增 `界面语言` / `选择语言` 两条,移除随之作废的 `切换到简体中文` / `切换到英语`(原按钮的 aria-label),一进一出净增 0 条。 - **验收适配**(验收命令本身随控件形态更新,判据强度不变):`tools/verify-i18n.mjs` 的两条静态检查改指新 id/绑定,并新增「旧控件不得残留」检查;`tools/run-site-smoke.mjs` 的点击路径改为「开菜单 → 选项」,并补 8 条下拉行为断言(`aria-expanded`、Esc、方向键、焦点回位、选中态、触发器文案)。 - 回归 100%(79/79 页,1017/1017 断言,N/A 34),连跑 8 次一致;`smoke:site` 30/30;`verify:i18n` 16/16;`verify:theme`、`verify-dark`、`verify-site-routing` 全过;零运行时依赖不变。 ### Package · 三端可 import(组件库真正可用) - **问题**:`dist/` 只发 CSS 与演示 HTML,`package.json` 的 `main` 甚至指向一个 CSS 文件,**没有任何可 import 的组件**——`import { AaButton } from 'aurora-admin-design/vue3'` 这类标准用法不成立。S1-P2 的任务范围写的是「能拿到令牌 + 组件样式」,因此这是**范围缺口**而非实现错误(已按 AGENTS 第五节登记为 ROADMAP S5-P18)。 - **新增三端聚合入口**:`dist/react/index.js`、`dist/vue3/index.js`、`dist/vue2/index.js`(各导出 79 个 `Aa*` 组件)+ 单组件源码。组件以 `.vue` / `.jsx` 源码发布,由宿主构建链编译(无额外编译产物与源码不同步的风险,且保持零构建依赖)。 - **`package.json`**:补 `exports` 映射(`.` / `./tokens.css` / `./components/*` / `./react` / `./vue3` / `./vue2` / `./manifest.json`)与 `peerDependencies`(`react >=17`、`vue >=2.6`,均为 optional)。 - **修掉两个「组件无法编译」的真实缺陷**(此前从未被发现,因为从未真编译过): - `RangeQuickPicker` 的 `presetRange` 给 `const start` / `const end` 重新赋值 → **React 与 Vue 3 两端都无法编译**;已改为 `let` 并与 Vue 2 参照实现对齐(`start` 改为 `new Date(...)` 而非 `setMonth/setDate` 就地修改,行为一致)。 - `CodeInput.vue3.vue` 内 `function emit()` 遮蔽了 `const emit = defineEmits(...)` → 重复声明,编译失败;已重命名为 `emitChange()`。 - **样式随包发布**:56 个组件的 Vue 两端用 `