agentcss 0.25.1 → 0.25.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/01-tokens/tokens.css +1 -1
  2. package/02-primitives/button/README.md +7 -0
  3. package/02-primitives/button/demo.html +52 -0
  4. package/02-primitives/card/README.md +6 -1
  5. package/02-primitives/card/demo.html +13 -0
  6. package/02-primitives/choice/choice.css +10 -0
  7. package/02-primitives/choice/demo.html +38 -0
  8. package/02-primitives/date-range/README.md +1 -1
  9. package/02-primitives/date-range/demo.html +41 -1
  10. package/02-primitives/input/README.md +3 -2
  11. package/02-primitives/input/demo.html +42 -0
  12. package/03-patterns/accordion/demo.html +113 -0
  13. package/03-patterns/content/demo.html +17 -0
  14. package/03-patterns/drawer/README.md +11 -1
  15. package/03-patterns/drawer/drawer.css +22 -6
  16. package/03-patterns/drawer/drawer.js +16 -1
  17. package/03-patterns/dropdown/README.md +10 -8
  18. package/03-patterns/dropdown/demo.html +5 -0
  19. package/03-patterns/dropdown/dropdown.js +8 -0
  20. package/03-patterns/form-validation/demo.html +20 -0
  21. package/03-patterns/list/demo.html +10 -0
  22. package/03-patterns/overlay/overlay.js +14 -1
  23. package/03-patterns/pagination/demo.html +23 -0
  24. package/03-patterns/states/demo.html +39 -1
  25. package/03-patterns/tabs/demo.html +34 -0
  26. package/03-patterns/tooltip/tooltip.js +8 -4
  27. package/04-recipes/app-shell/demo.html +27 -0
  28. package/04-recipes/table/demo.html +34 -0
  29. package/09-assets/bar/bar.js +8 -4
  30. package/09-assets/bar/demo.html +27 -0
  31. package/API.md +13 -5
  32. package/CHANGELOG.md +211 -1
  33. package/CONTRIBUTING.md +5 -5
  34. package/README.zh-CN.md +3 -3
  35. package/START-HERE.md +6 -6
  36. package/ai/components.json +6 -3
  37. package/ai/tokens.json +100 -99
  38. package/ai/tokens.schema.json +96 -50
  39. package/dist/02-primitives/choice/choice.css +1 -1
  40. package/dist/03-patterns/drawer/drawer.css +1 -1
  41. package/dist/03-patterns/drawer/drawer.js +10 -1
  42. package/dist/03-patterns/dropdown/dropdown.js +4 -0
  43. package/dist/03-patterns/overlay/overlay.js +7 -1
  44. package/dist/03-patterns/tooltip/tooltip.js +3 -3
  45. package/dist/09-assets/bar/bar.js +4 -3
  46. package/dist/COSTS.md +13 -13
  47. package/docs/ACCESSIBILITY.md +1 -1
  48. package/docs/GUIDANCE.md +82 -0
  49. package/docs/LESSONS.md +182 -0
  50. package/index.html +1 -1
  51. package/llms-full.txt +3 -3
  52. package/package.json +4 -2
package/CHANGELOG.md CHANGED
@@ -16,9 +16,219 @@
16
16
 
17
17
  (无)
18
18
 
19
+ ## [0.25.3] - 2026-11-03
20
+
21
+ **修订版:修掉四个「照着文档写会直接失败」的入口问题,并补上三层规范里缺失的那一层。
22
+ 不改组件行为、不改类名、不改任何令牌值。**
23
+
24
+ ### 修复:文档承诺的导入路径与实际不符(4 处)
25
+
26
+ | 症状 | 根因 | 影响 |
27
+ |---|---|---|
28
+ | `import 'agentcss/esm/accordion.mjs'` → 解析到 `accordion.mjs.mjs` | `"./esm/*": "./esm/*.mjs"` 把扩展名又拼了第二次 | 按 API.md 接入的打包项目直接构建失败 |
29
+ | `import { Select } from 'agentcss'` → `ERR_UNKNOWN_FILE_EXTENSION .html` | `exports["."]` 指向 `index.html` | 类型层承诺了根导入,运行时却把 HTML 当模块 |
30
+ | `import 'agentcss/ai/components.json'` → `ERR_PACKAGE_PATH_NOT_EXPORTED` | 没有 `./ai/*` 导出 | 想通过包名读契约的工具只能猜文件系统路径 |
31
+ | `import 'agentcss/01-tokens/tokens.css'`(README 教的"可读版") | 该入口不存在,可读版在 `agentcss/src/...` | 读者复制即失败 |
32
+
33
+ **修法**:`exports["."]` 改指 `./esm/index.mjs`;补 `./esm/*.mjs` 与 `./ai/*`;
34
+ README 的可读版入口改成 `agentcss/src/01-tokens/tokens.css`。
35
+
36
+ ### 新增门禁:文档里的 import 路径必须真能解析
37
+
38
+ `05-audit/doc-imports.js`,接进 `pack-smoke`。它把 6 份对外文档里出现的每个
39
+ `agentcss/...` 字面路径,拿到消费者环境里真解析一次(只解析、不执行)。
40
+
41
+ **为什么以前没抓到**:`entry-resolve` 判的是「**exports 声明的**入口」——
42
+ 它遍历 `package.json` 的 key、用包内文件套通配符;`pack-closure` 只判"文件在不在";
43
+ `node --check` 只判语法。三者的共同点是:**"读文档的那一方"从来没有被测过**。
44
+ 这道门禁上线当天就抓出了上表最后一行(报告里没有的第 4 处)。
45
+
46
+ ### 更正:聚合 ESM 入口不会摇树
47
+
48
+ 0.25.2 之前 API.md 写「Vite/Rollup 会按需摇树」,**这是错的**。
49
+ `esm/*.mjs` 的形式是「副作用导入 + 把全局对象 re-export」,模块体本身就有副作用,
50
+ 打包器无法判断哪个导出没被用到。`sideEffects` 里 `**/*.js` / `**/*.mjs`
51
+ 是**按事实写的、是对的** —— 错的是那句文档。
52
+
53
+ 实测(esbuild):`import { Select } from 'agentcss/esm'` 产物 **190 KB**,
54
+ `import { Select } from 'agentcss/esm/select'` 只有 **20.8 KB**(约 9 倍)。
55
+ 文档已改成「要体积就逐个 `agentcss/esm/<组件>`」。
56
+
57
+ ### 补齐:三层规范缺失的第三层
58
+
59
+ `docs/INVARIANT.md` 与 `docs/AI-CONTRACT.md` 一直把 `docs/GUIDANCE.md` 当作
60
+ "建议层"来引用,但那份文件在 0.11.4 被整份移进内部目录(含发布凭证类内容),
61
+ 公开面于是只剩两层。现在补一份**只含可公开部分**的 `docs/GUIDANCE.md`,
62
+ 并在文首写明边界:凭证、账号二次因子、内部排期一律不进公开面。
63
+
64
+ ### 新增:可公开的教训集
65
+
66
+ `docs/LESSONS.md` —— 从内部错误登记里挑出 10 条可复用规则
67
+ (判据的错法 / 删除与清理 / 发布语义),脱敏后公开。
68
+ README 里「想知道我们踩过哪些坑」的指向,从内部文件改到这里。
69
+
70
+ ### 修复:9 处指向不存在文件的引用
71
+
72
+ `ERRORS.md`(在内部目录,不入库)、`docs/ROADMAP.md`、`docs/GUIDANCE.md` 被
73
+ README / CONTRIBUTING / 05-audit/README 引用,但文件不存在。
74
+ 现在全部改指向真实文件,或去掉编号(内部条号对外部读者没有意义)。
75
+
76
+ ### 修复:AI 契约里的令牌描述**认错了令牌**(E294)
77
+
78
+ 这是本库最值钱的差异化(机器可读契约)里最难察觉的一类错。
79
+
80
+ `parse_block` 只有一个 `pending_note`:`--a: 1; /* A 的说明 */` 里的注释被
81
+ **下一个**声明吃掉。而 `tokens.css` 里有 **101 条尾注释** ⇒ 最多 100 个令牌的
82
+ 描述整体错位一位。生成的 JSON 里因此出现了:
83
+
84
+ | 令牌 | 原来的 `$description` | 那是谁的 |
85
+ |---|---|---|
86
+ | `--scrollbar-radius`(5px) | `hover 更深一档 · 4.06:1` | `--scrollbar-thumb-hov` 的 |
87
+ | `--scrollbar-thumb-hov` | `中性**冷**灰(非品牌色…)` | `--scrollbar-thumb` 的 |
88
+ | `--paper` | `-------- 基底`(分隔线) | 没有人,是分组标题 |
89
+ | `--text-on-solid` | `🔴 新增( H9 期间由暗色门禁逼出来):` | 半句话,正文在后面几行 |
90
+
91
+ **这比缺描述更糟**:机器读者拿到的是一段**真实存在、但属于别人**的话 ——
92
+ 缺失时它会去查,错挂时它会照做。
93
+
94
+ 修法(三条都是机械规则):
95
+ 1. 同一行 `;` 之后的注释归**前一个**声明(尾注释),换行之后的才是前导注释;
96
+ 2. 块首是分隔线 ⇒ 那是分组注释:紧随的一行是组名,丢掉;正文只有**提到本令牌名**
97
+ 才归本令牌,否则不算它的描述(`--text-primary` 的块讲的是"三档够用",不是它);
98
+ 3. 前导 + 尾注释都收,去重后拼接,超过 400 字按整句截断。
99
+
100
+ 顺带修掉暗色段的同类错:`@media` 里的 `:root…{` **选择器上方**挂着解释选择器的
101
+ 注释(「⚠️ `:not([data-theme="light"])` 让强制亮压过系统暗色」),旧实现解析整个
102
+ media 体 ⇒ 它成了块内第一个声明的描述(实测 `dark/--paper` 拿到的就是这句)。
103
+ 现在只解析 `:root` 内层块。
104
+
105
+ 结果:147 个令牌里 **99 个有准确描述**(原 95 个,其中 19 个是分隔线);
106
+ 其余 48 个确实没有注释,就**不写这个字段**,而不是塞一句别人的话。
107
+
108
+ ### 新增门禁:令牌描述必须认对令牌
109
+
110
+ `05-audit/ai-token-desc-gate.py`,五条判据:① 无分隔线 ② 不写空串
111
+ ③ 不以冒号结尾/不是纯符号 ④ ≤ 400 字 ⑤ **归属** ——
112
+ 每条描述必须能在**本令牌自己的相邻注释**里找到出处。
113
+
114
+ **为什么 `ai-contract --check` 抓不到**:它保证「JSON 与生成器一致」,
115
+ 生成器错了它也全绿。这正是 0.25.2 的实际状态。
116
+
117
+ **它自己的反向控制也翻过一次车**:第一版判据⑤ 在 0.25.2 的数据上**一条都抓不到**,
118
+ 因为"上一行的尾注释"被它当成"下一行的前导注释"—— 和它要抓的 bug 是同一种形状。
119
+ 修掉后同一份历史数据报出 **74 条**(19 分隔线 + 50 错位 + 5 半句话)。
120
+ 之后才加进 `check-all.sh`:判据必须先证明自己会红。
121
+
122
+ ### 修复:发布前门禁的动效采样在慢机器上误红(E295)
123
+
124
+ 0.25.3 第一次发版就栽在这里:`selftest-all` 判「基准不通过,自检无意义」,
125
+ 而 `motion-concurrency.js` 正是基准那一条 —— 于是**整条发布流程被挡下**,
126
+ npm 上什么都没发出去。
127
+
128
+ 根因不是判据错,是**采样方式**:过渡只有 180ms,旧实现「切状态 → 等 2 帧 →
129
+ `getAnimations()` 取一次快照」。2 核 runner 被 6 路门禁抢 CPU 时,两次 rAF
130
+ 之间就跨过了整个过渡 ⇒ 读到空数组 ⇒ 判「没有动画」。
131
+
132
+ 对照:0.25.2 那次 `selftest-all` **90 秒通过**;这次 **131 秒红**。差别只是机器更慢。
133
+
134
+ 修法(**不放宽任何阈值**):
135
+ - 改成**窗口内求并集**:挂 `transitionrun` / `animationstart` 监听 + 240ms 轮询,
136
+ 只要窗口里出现过动画就算数;
137
+ - 切换前 `void el.offsetWidth` 强制一次样式结算 —— 否则同一帧里的
138
+ `remove` + `set` 会被浏览器合并成"没变化",一条动画都不产生(这个坑是修的时候
139
+ 自己踩出来的,第一版把判据① 从"偶发红"改成了"稳定红")。
140
+
141
+ 反向控制仍是「注入 `*{transition:none}` ⇒ 判据① 必须红」,仍然通过。
142
+ 连跑 5 次稳定。
143
+
144
+ ### 修复:打印门禁量的是「iframe 起没起来」(E296)
145
+
146
+ 同一轮里 `print` 也红了一次:`guide-button/light` 报 `pages=4`(基线 8)、
147
+ `runs=1679`(基线 2321)—— 版面少了一半,但页面本身一个字节没改。
148
+
149
+ 根因:44 个 `guide/*.html` 每个都嵌了 `<iframe loading="lazy" src="…/demo.html">`,
150
+ **打印产物包含 iframe 的内容**。并发 6 路时那个 iframe 可能整页没开始加载,
151
+ 版面就腰斩了 —— 而 `loadStyled()` 当时的两个信号(CSS 请求失败、顶层 `<link>`
152
+ 全没挂上)**都看不见 iframe**:顶层文档的样式表好得很。
153
+
154
+ 加第三个信号:强制 `loading=eager`、触发未开始的加载,然后等每个 frame
155
+ `readyState==='complete'` **且挂上至少一张带 href 的样式表**。
156
+ 不是放宽判据 —— 真内容缺失时页数照样对不上,只是不再把"iframe 没起来"
157
+ 算成"库改坏了"。
158
+
159
+ 反向控制:正常 iframe → 不误伤(`bad=0`);404 的 iframe → 变红(`bad=1`)。
160
+ 稳定性:4 路 CPU 抢占下连跑仍是 8 页 / 2321 runs。
161
+
162
+ ---
163
+
164
+ ## [0.25.2] - 2026-11-03
165
+
166
+ **修订版:把覆盖率门禁里 41 个「只被 README 认领」的类全部变成真的渲染。
167
+ 量它们的过程本身成了一次体检 —— 查出 4 个静默缺陷(两个方位摆错、分隔线高度 0、
168
+ 说明落在标签右侧),外加 3 条判据在误报。不改类名、不改令牌、不改 API。**
169
+
170
+ ### 清零:41 个未渲染类 → 0
171
+
172
+ `css-coverage-baseline.json` 的棘轮从 41 条降到 **0**(`unrendered: []`)。
173
+ 三类分开处理,不是一把梭往 demo 里塞空 div:
174
+
175
+ | 类型 | 数量 | 做法 |
176
+ |---|---|---|
177
+ | JS 拼接生成、**其实一直在渲染** | 10 | `tooltip--top/bottom/inset-inline-*`、`drawer--left/right/top/bottom`、`toast--success/warning` |
178
+ | 纯 CSS、demo 里一次没用过 | 30 | 逐个补真实用例(徽标/卡片/表格/抽屉/提示…) |
179
+ | README 里的兼容别名 | 1 | `rep__lede`:加判据要求它与 `rep__standfirst` 计算样式**逐项相同** |
180
+
181
+ 第一类是判据自己的盲区:`'tooltip--' + CLS[pos]` 这种拼串在源码里 grep 不到
182
+ `tooltip--inset-inline-start`,于是"渲染了但没人认领"。修法不是放宽判据,
183
+ 而是**改成完整字面量映射**(`{ top: 'tooltip--top', … }`)——顺带把
184
+ `toast({variant:'warn'})`(拼出不存在的类 ⇒ 警示条渲染成白条)也收成了白名单,
185
+ `{place:'tp'}`(拼出 `drawer--tp` ⇒ 静默贴右)现在退回默认值。
186
+
187
+ ### 修复:四个「渲染出来才发现」的缺陷
188
+
189
+ | 缺陷 | 实测症状 | 修法 |
190
+ |---|---|---|
191
+ | 抽屉的左右/上下**根本不动** | 1280×800 下四个方位量矩形:`--left` 的 left=860(该 0)、`--bottom` 的 top=0(该 380)。两个方向摆错,控制台干净、契约全绿 | 容器只留主轴对齐,落位交给各方向的 `margin-inline-end:auto` / `align-self`。四个方位补了逐条判据 |
192
+ | 菜单分隔线**高度 0** | 只写 `data-dd-sep` 不写类名时,量到的高度是 0px,两组菜单项直接贴着,像漏了一条线 | 由 JS 补 `.dd__sep`(和它早就在做的 `dd__item` 同一个理由:组件级类名不该要求使用者手抄) |
193
+ | `.choice__hint` 落在标签**右侧** | README 写"标签下方",实际是第三个 flex item,被 `flex:1` 的 label 挤到最右边 | `.choice` 加 `flex-wrap`,hint 独占一行并缩进到与文字左对齐(20px 勾选框 + 8px gap) |
194
+ | `.drange--disabled` **只管一半** | 文档写"整体禁用",CSS 只把预设与清除置灰;日期输入照样能改 | 文档改成"视觉禁用",demo 补正确组合(类负责观感、原生 `disabled` 负责行为),并说明只做一半的后果 |
195
+
196
+ ### 修复:三条判据在**误报**(比漏报更伤信任)
197
+
198
+ - **form-validation「错误文案具体」**:原来扫的是"所有 `aria-describedby` 指向的文本",
199
+ 于是帮助文字与"校验中"提示也被当错误文案审;判据里还有一条
200
+ `t.length <= 最长含糊词长度 + 2`(=9)—— 等于"凡是 ≤9 字都算含糊",与内容无关。
201
+ 实测把一个 8 字的正常提示判成"太含糊"。现在只审 `.field__error` / `role=alert`
202
+ / `aria-invalid` 指向的文案,且只判"太短(<4 字)"与"只由含糊词构成(≤6 字)"。
203
+ 反向控制:把文案换成「输入有误」⇒ 立刻转红。
204
+ - **report「宽通道」**:参照物取成了 `.rep__sec`(列容器,544px),而行长只施加在
205
+ 内容块上(420px)⇒ "宽通道"永远看着没打开。改成探针式:同一篇正文里插一个块,
206
+ 先量(被行长压住)、加类再量(放开),两个值必须拉开。
207
+ 顺带记下:`--wide` 只在 **finance** 版有意义(magazine 的 42em 比列还宽)。
208
+ - **coverage-gate 的"未渲染"口径**:它不是"没渲染",是"文本里没提到"。
209
+ 文档里补了一句,免得后人把绿当成"视觉回归看得到它"。
210
+
211
+ ### 新增判据(10 条)
212
+
213
+ | 契约 | 新增 |
214
+ |---|---|
215
+ | `drawer-check` | 四个方位各量一次"矩形贴哪条边"(此前只测 `right`) |
216
+ | `tabs-contract` | 纵向变体:`flex-direction:column`、面板在右侧、`↓`/`↑` 真的切换(此前纵向只有 CSS,没有判据) |
217
+ | `report-check` | `rep__lede` 与主名计算样式逐项相同;宽通道探针(with/without 两次测量) |
218
+
219
+ ### 视觉基线
220
+
221
+ 16 页有变化(浅色 16 / 暗色 16 / RTL 8,都是新增区块),`--update` 重录后
222
+ **109 / 109 张逐字节一致**;Linux 基线同批在 CI 上重录(`release.yml` 的
223
+ `shoot_baseline`)。`size-baseline` 重录:drawer.css +34.5%(1.5 KB 全是注释 ——
224
+ 这段"两个方位摆错"的现场记录值得留着)、drawer.js +8.5%、choice.css +5.3%,
225
+ 其余 65 个文件不变。
226
+
227
+ ---
228
+
19
229
  ## [0.25.1] - 2026-11-03
20
230
 
21
- **修订版:修 `agentcss pdf` 在**长文档**上的一处误判 —— 50 页的文档会被报
231
+ **修订版:修 `agentcss pdf` 在「长文档」上的一处误判 —— 50 页的文档会被报
22
232
  「无法判定预算」(退出码 4),哪怕预算够、文件也没坏。不改类名、不改令牌、不改 API。**
23
233
 
24
234
  ### 修复:长文档的页树根 `Count` 被读成了叶节点的数
package/CONTRIBUTING.md CHANGED
@@ -29,7 +29,7 @@ npm run gate # 全量:含浏览器类
29
29
  npm run gate:fast # 只跑静态层,不用装浏览器
30
30
  ```
31
31
 
32
- 全量是 **233 道门禁**(默认 `min(核数, 6)` 路并发,实测 583 秒 / 退出码 0;
32
+ 全量是 **234 道门禁**(默认 `min(核数, 6)` 路并发,实测 583 秒 / 退出码 0;
33
33
  单道耗时累加 1658 秒,并发效率约 2.8×。组件层要起浏览器,还要逐张比 **109 张**视觉截图 ——
34
34
  47 浅色 + 47 暗色 + 15 RTL,按平台分集,只比本平台那套)。
35
35
  只想确认没改坏静态契约的话用 `gate:fast`,几秒到几分钟。
@@ -150,7 +150,7 @@ RTL 视觉基线**故意不是全量**(纯文本页在 RTL 下与 LTR 是同
150
150
  - 改令牌 ⇒ `token-parse` / `token-tree` / `cascade-layer` 三道都会看
151
151
  - 改文档 ⇒ `doc-facts` 会核对里面的数字与仓库是否一致
152
152
  - **只跑相关的几道是不够的** —— 曾经有一批门禁在自己的调用方式下扫 0 个文件
153
- 仍判通过(`ERRORS.md` E41),所以现在每道门禁都有「零文件即失败」的守卫
153
+ 仍判通过(`docs/LESSONS.md`「零文件即通过」),所以现在每道门禁都有「零文件即失败」的守卫
154
154
 
155
155
  ## 提交信息怎么写
156
156
 
@@ -172,11 +172,11 @@ fix: <一句话说清改了什么、为什么>
172
172
 
173
173
  1. **一次性迁移脚本用完即删。** 别留在仓库里 ——
174
174
  本库曾有一个 `leak-fix-paths.py`,它的正则匹配任意引号字符串,
175
- 一次运行把 **80 个文件**的每个字符串字面量都改了(见 `ERRORS.md` E42)。
175
+ 一次运行把 **80 个文件**的每个字符串字面量都改了。
176
176
  2. **新增门禁必须带反向控制。** 一道不会红的门禁不算门禁。
177
177
  写法见 `05-audit/token-parse-gate.py` 的 `selftest()`。
178
178
  3. **同一个判定不要写两遍。** 判据分散在两个文件里必然漂移
179
- (`ERRORS.md` E31)。要复用就 import,不要复制。
179
+ (同一个判定写两遍必然漂移)。要复用就 import,不要复制。
180
180
  4. **修门禁前先证明它现在真的会红。** 用 `--dir <目录>` 与无参各跑一次,
181
181
  两者的差别就是问题的形状(这正是 E41 的发现方式)。
182
182
  5. **豁免要写清理由,并列举式。** 「这份代码的使用者控制不了它」是唯一的豁免理由;
@@ -220,7 +220,7 @@ fix: <一句话说清改了什么、为什么>
220
220
  - [ ] 改动涉及 UI ⇒ 在 `10-review/shots/` 里有截图对比
221
221
  - [ ] 改了行为 ⇒ `ai/components.json` 已重新生成(`npm run ai`)
222
222
  - [ ] 改了令牌或组件 ⇒ `npm run dist` 已重建,dist 与源码一致
223
- - [ ] 有踩坑 ⇒ 写进 `ERRORS.md`(症状 / 根因 / 规则三件套)
223
+ - [ ] 有踩坑 ⇒ 记进内部错误登记(症状 / 根因 / 规则三件套);可复用的规则同步进 `docs/LESSONS.md`
224
224
 
225
225
  ## 代码风格
226
226
 
package/README.zh-CN.md CHANGED
@@ -70,7 +70,7 @@ npm install https://github.com/owain323/frontend-lib/releases/download/v<版本>
70
70
  npm install github:owain323/frontend-lib
71
71
  ```
72
72
 
73
- > 历史说明:0.9.0 曾发布成功、两分钟后被误删(`ERRORS.md` E55);此后一段时间
73
+ > 历史说明:0.9.0 曾发布成功、两分钟后被误删;此后一段时间
74
74
  > registry 上没有可安装版本,靠 GitHub Release 附件分发(当时的分发路径记在
75
75
  > `CHANGELOG.md` 的 0.11.2 一节)。自 0.11.2 起这条通路已恢复。
76
76
 
@@ -291,7 +291,7 @@ dist/01-tokens/tokens.css ← 拷这个
291
291
  ```js
292
292
  import 'agentcss/dist/01-tokens/tokens.css'; // 压缩版
293
293
  import 'agentcss/dist/02-primitives/button/button.css';
294
- // 要可读版:import 'agentcss/01-tokens/tokens.css';
294
+ // 要可读版(源码,注释齐全):import 'agentcss/src/01-tokens/tokens.css';
295
295
  ```
296
296
 
297
297
  > ⚠️ **不再有 `*.min.css`**。此前 `dist/` 同时产出 `x.css`(去注释)与 `x.min.css`(压缩),
@@ -397,7 +397,7 @@ bash 05-audit/check-all.sh # 全量门禁约 130 项,本机约 8 分钟
397
397
  `node 05-audit/scientific-plot-check.js`。
398
398
  - 想看每道门禁**自己有没有牙**:`bash 05-audit/behavior-reverse.sh`
399
399
  (对门禁做突变,验证它会红、且只红该红的那一条)。
400
- - 想知道**我们踩过哪些坑**:`ERRORS.md`。只记真的红过的门禁和真的做错过的事,
400
+ - 想知道**我们踩过哪些坑**:`docs/LESSONS.md`。只记真的红过的门禁和真的做错过的事,
401
401
  每条写清症状 → 根因 → 纠正规则,规则都能照着执行。
402
402
 
403
403
  ### 经过实际验证的
package/START-HERE.md CHANGED
@@ -38,7 +38,7 @@
38
38
  | 输入框 | `02-primitives/input/input.css` | 253 | — | 有表单就要 |
39
39
  | 标签 / 徽章 | `02-primitives/badge/badge.css` | 141 | — | 有状态标记就要("已披露""停牌") |
40
40
  | 卡片 | `02-primitives/card/card.css` | 283 | — | 有分组内容就要 |
41
- | 单选 / 多选 | `02-primitives/choice/choice.css` | 424 | — | 单选 / 多选就要 |
41
+ | 单选 / 多选 | `02-primitives/choice/choice.css` | 434 | — | 单选 / 多选就要 |
42
42
  | 下拉选择 | `02-primitives/select/select.css` | 151 | **必需 631** (`select.js`) | 原生 select 的外观或交互不够用就要 |
43
43
  | 可搜索选择 | `02-primitives/combobox/combobox.css` | 223 | **必需 477** (`combobox.js`) | 选项多到要搜索,或要选多个并留成标签就要 |
44
44
  | 开关 | `02-primitives/switch/switch.css` | 429 | — | 有"立即生效的设置"就要 |
@@ -49,12 +49,12 @@
49
49
  | 日期区间 | `02-primitives/date-range/date-range.css` | 206 | **必需 301** (`date-range.js`) | 要选起止日期就要 |
50
50
  | 标签页 | `03-patterns/tabs/tabs.css` | 172 | **必需 316** (`tabs.js`) | 同层级内容切换就要 |
51
51
  | 折叠面板 | `03-patterns/accordion/accordion.css` | 453 | **必需 389** (`accordion.js`) | 长表单分段就要 |
52
- | 动作菜单 | `03-patterns/dropdown/dropdown.css` | 135 | **必需 547** (`dropdown.js`) | 要一组动作(新建 / 导出 / 删除)就要 |
53
- | 文字提示 | `03-patterns/tooltip/tooltip.css` | 89 | **必需 280** (`tooltip.js`) | 图标按钮或缩写需要一句话解释就要 |
52
+ | 动作菜单 | `03-patterns/dropdown/dropdown.css` | 135 | **必需 555** (`dropdown.js`) | 要一组动作(新建 / 导出 / 删除)就要 |
53
+ | 文字提示 | `03-patterns/tooltip/tooltip.css` | 89 | **必需 284** (`tooltip.js`) | 图标按钮或缩写需要一句话解释就要 |
54
54
  | 分页 | `03-patterns/pagination/pagination.css` | 195 | **必需 401** (`pagination.js`) | 数据多到要翻页就要 |
55
55
  | 树形 | `03-patterns/tree/tree.css` | 122 | **必需 464** (`tree.js`) | 层级数据(文件 / 组织 / 分类)要展开就要 |
56
- | 侧边抽屉 | `03-patterns/drawer/drawer.css` | 129 | **必需 361** (`drawer.js`) | 要从侧边滑出面板就要 |
57
- | 弹窗 / 吐司 | `03-patterns/overlay/overlay.css` | 338 | **必需 684** (`overlay.js`) | 需要弹层(吐司 / 模态)就要 |
56
+ | 侧边抽屉 | `03-patterns/drawer/drawer.css` | 145 | **必需 376** (`drawer.js`) | 要从侧边滑出面板就要 |
57
+ | 弹窗 / 吐司 | `03-patterns/overlay/overlay.css` | 338 | **必需 697** (`overlay.js`) | 需要弹层(吐司 / 模态)就要 |
58
58
  | 状态(空 / 加载 / 错 / 成功) | `03-patterns/states/states.css` | 269 | — | **凡是会异步取数就要** |
59
59
  | 表单校验 | `03-patterns/form-validation/form-validation.css` | 274 | — | 提交前要校验就要 |
60
60
  | 列表增删 | `03-patterns/list/list.css` | 162 | 可选 201 (`flip.js`,FLIP 增删动画,纯增强) | 列表会动态增删就要 |
@@ -70,7 +70,7 @@
70
70
  | detail-page | `04-recipes/detail-page/detail-page.css` | 190 | — | |
71
71
  | report | `04-recipes/report/report.css` | 369 | — | |
72
72
  | table | `04-recipes/table/table.css` | 409 | — | |
73
- | bar | `09-assets/bar/bar.css` | 181 | **必需 320** (`bar.js`) | |
73
+ | bar | `09-assets/bar/bar.css` | 181 | **必需 324** (`bar.js`) | |
74
74
  | model-viewer | `09-assets/model-viewer/model-viewer.css` | 143 | **必需 423** (`model-viewer.js`) | |
75
75
  | scientific-plot | `09-assets/scientific-plot/scientific-plot.css` | 141 | **必需 603** (`scientific-plot.js`) | |
76
76
  | sparkline | `09-assets/sparkline/sparkline.css` | 158 | **必需 508** (`sparkline.js`) | |
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "generatedBy": "05-audit/gen-ai-contract.py",
4
- "libraryVersion": "0.25.1",
4
+ "libraryVersion": "0.25.3",
5
5
  "$comment": "机器可读的组件契约。slots = BEM 元素名(在本库里元素名就是插槽名),states.enum = 组件会在 DOM 上写出的 data-* 取值,states.legacyClass = 仍未收敛到 data 属性的历史状态类(INVARIANT I-8 未达标)。printPolicy = 这个组件在纸上会发生什么(空数组 = 原样保留);pagination = 内容是否被分页裁过(server 不许与 expand 同时出现,否则展开的只是当前一页)。",
6
6
  "maturityCriteria": {
7
7
  "alpha": "缺 demo.html 或缺 05-audit 下的专属门禁 ⇒ 还没被机器验证过,不要用",
@@ -645,7 +645,8 @@
645
645
  "list"
646
646
  ],
647
647
  "attrs": [
648
- "hidden"
648
+ "hidden",
649
+ "live"
649
650
  ]
650
651
  },
651
652
  "usesOtherNamespaces": [],
@@ -1272,7 +1273,9 @@
1272
1273
  "roles": [],
1273
1274
  "attrs": [
1274
1275
  "busy",
1275
- "disabled"
1276
+ "disabled",
1277
+ "hidden",
1278
+ "label"
1276
1279
  ]
1277
1280
  },
1278
1281
  "usesOtherNamespaces": [],