agentcss 0.25.4 → 0.25.6

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.
@@ -146,7 +146,14 @@ return true;
146
146
  }
147
147
 
148
148
  function paintSummary(s) {
149
- if (summary) summary.innerHTML = s ? ('区间 <b>' + s + '</b>') : '';
149
+
150
+ if (!summary) return;
151
+ summary.textContent = '';
152
+ if (!s) return;
153
+ summary.appendChild(document.createTextNode('区间 '));
154
+ var b = document.createElement('b');
155
+ b.textContent = s;
156
+ summary.appendChild(b);
150
157
  }
151
158
 
152
159
  function emit() {
@@ -186,6 +193,7 @@ presets = presets.filter(function (x) { return opt.presets.indexOf(x.key) >= 0;
186
193
  }
187
194
  var box = root.querySelector('[data-dr-presets]');
188
195
  if (!box) return;
196
+
189
197
  box.innerHTML = presets.map(function (p) {
190
198
  return '<button class="drange__preset" type="button" aria-pressed="false" ' +
191
199
  'data-dr-preset="'+ p.key + '">' + p.label + '</button>';
@@ -148,6 +148,7 @@ box.setAttribute('inert', '');
148
148
 
149
149
  box.setAttribute('role', 'dialog');
150
150
  box.setAttribute('aria-label', opts.label || '');
151
+
151
152
  box.innerHTML =
152
153
  '<span class="popover__arrow" aria-hidden="true"></span>'+
153
154
  '<div class="popover__body">'+ (opts.html || '') + '</div>';
@@ -210,6 +210,7 @@ head.appendChild(closeBtn);
210
210
 
211
211
  var body = document.createElement('div');
212
212
  body.className = 'drawer__body';
213
+
213
214
  if (typeof opt.content === 'string') body.innerHTML = opt.content;
214
215
  else if (opt.content) body.appendChild(opt.content);
215
216
 
@@ -75,6 +75,7 @@ btn.type = 'button';
75
75
  btn.className = 'shell__menu';
76
76
  btn.setAttribute('aria-label', o.label || ('打开' + title));
77
77
  btn.setAttribute('aria-haspopup', 'dialog');
78
+
78
79
  btn.innerHTML = ICON;
79
80
  btn.addEventListener('click', function () { self.open(); });
80
81
  topbar.insertBefore(btn, topbar.firstChild);
@@ -68,8 +68,14 @@ this.btn.addEventListener('click', function () { self.load(); });
68
68
  this.ui.appendChild(this.btn);
69
69
 
70
70
  this.hint = el('p', 'mv__hint');
71
- this.hint.innerHTML = '模型 <code>' + (this.src.split('/').pop() || '—') +
72
- '</code> 会<b>点击后才下载</b>,首屏不占流量。';
71
+
72
+ var fname = el('code', null, this.src.split('/').pop() || '—');
73
+ var strong = el('b', null, '点击后才下载');
74
+ this.hint.appendChild(document.createTextNode('模型 '));
75
+ this.hint.appendChild(fname);
76
+ this.hint.appendChild(document.createTextNode(' 会'));
77
+ this.hint.appendChild(strong);
78
+ this.hint.appendChild(document.createTextNode(',首屏不占流量。'));
73
79
  this.ui.appendChild(this.hint);
74
80
 
75
81
  if (!hasWebGL()) {
@@ -260,6 +266,7 @@ self.raf = requestAnimationFrame(loop);
260
266
  self.ui.innerHTML = '';
261
267
  var cap = el('p', 'mv__cap');
262
268
  var dt = Math.round(((window.performance && performance.now) ? performance.now() : Date.now()) - t0);
269
+
263
270
  cap.innerHTML = '模型 <b>' + fmtKB(bytes || self.lastBytes || 0) + '</b> · 引擎就绪耗时 <b>' + dt + 'ms</b>' +
264
271
  (controls ? ' · 拖动可旋转,滚轮/双指可缩放' : ' · 未加载控制器,无法拖动');
265
272
  self.node.appendChild(cap);
@@ -501,6 +501,7 @@ return String(s == null ? '' : s)
501
501
  legendHtml = '<ul class="splot__legend">' + items.join('') + '</ul>';
502
502
  }
503
503
 
504
+ /* @html-sink internal — svg 由本文件生成,图例名字已过 esc() */
504
505
  el.innerHTML = svg + legendHtml;
505
506
  return {
506
507
  svg: el.firstChild,
package/dist/COSTS.md CHANGED
@@ -22,12 +22,12 @@
22
22
  | primitive | `button` | 2.9 KB | 1.0 KB | — | **3.9 KB** | 28.3 KB | −24.4 KB |
23
23
  | primitive | `card` | 2.9 KB | 0.9 KB | — | **3.9 KB** | 26.0 KB | −22.1 KB |
24
24
  | primitive | `choice` | 2.9 KB | 1.1 KB | — | **4.1 KB** | 28.1 KB | −24.0 KB |
25
- | primitive | `combobox` | 2.9 KB | 1.0 KB | 5.4 KB | **9.3 KB** | 31.4 KB | −22.2 KB |
26
- | primitive | `date-range` | 2.9 KB | 0.8 KB | 2.5 KB | **6.3 KB** | 28.4 KB | −22.1 KB |
25
+ | primitive | `combobox` | 2.9 KB | 1.0 KB | 5.5 KB | **9.4 KB** | 31.5 KB | −22.1 KB |
26
+ | primitive | `date-range` | 2.9 KB | 0.8 KB | 2.6 KB | **6.3 KB** | 28.6 KB | −22.3 KB |
27
27
  | primitive | `delta` | 2.9 KB | 0.3 KB | — | **3.2 KB** | 24.7 KB | −21.5 KB |
28
28
  | primitive | `input` | 2.9 KB | 1.0 KB | — | **4.0 KB** | 25.8 KB | −21.9 KB |
29
29
  | primitive | `metric` | 2.9 KB | 0.5 KB | — | **3.4 KB** | 25.1 KB | −21.7 KB |
30
- | primitive | `popover` | 2.9 KB | 0.8 KB | 2.2 KB | **5.9 KB** | 29.2 KB | −23.3 KB |
30
+ | primitive | `popover` | 2.9 KB | 0.8 KB | 2.2 KB | **5.9 KB** | 29.3 KB | −23.4 KB |
31
31
  | primitive | `progress` | 2.9 KB | 0.8 KB | — | **3.7 KB** | 26.2 KB | −22.5 KB |
32
32
  | primitive | `select` | 2.9 KB | 0.8 KB | 4.1 KB | **7.9 KB** | 32.9 KB | −24.9 KB |
33
33
  | primitive | `separator` | 2.9 KB | 0.2 KB | — | **3.2 KB** | 23.2 KB | −20.0 KB |
@@ -37,7 +37,7 @@
37
37
  | primitive | `upload` | 2.9 KB | 1.4 KB | 4.2 KB | **8.5 KB** | 39.3 KB | −30.8 KB |
38
38
  | pattern | `accordion` | 2.9 KB | 1.3 KB | 1.8 KB | **6.0 KB** | 36.4 KB | −30.4 KB |
39
39
  | pattern | `content` | 2.9 KB | 1.0 KB | — | **4.0 KB** | 26.5 KB | −22.5 KB |
40
- | pattern | `drawer` | 2.9 KB | 0.8 KB | 2.6 KB | **6.3 KB** | 30.1 KB | −23.8 KB |
40
+ | pattern | `drawer` | 2.9 KB | 0.8 KB | 2.6 KB | **6.3 KB** | 30.2 KB | −23.9 KB |
41
41
  | pattern | `dropdown` | 2.9 KB | 0.8 KB | 3.5 KB | **7.2 KB** | 31.6 KB | −24.4 KB |
42
42
  | pattern | `form-validation` | 2.9 KB | 0.8 KB | — | **3.7 KB** | 26.8 KB | −23.1 KB |
43
43
  | pattern | `list` | 2.9 KB | 0.6 KB | — | **3.5 KB** | 24.3 KB | −20.8 KB |
@@ -52,8 +52,8 @@
52
52
 
53
53
  ## 三、全库
54
54
 
55
- - 全部组件都用上(min,含 tokens 一份):**70.4 KB**
56
- - 源码版(带注释)全库 gzip:358.8 KB
55
+ - 全部组件都用上(min,含 tokens 一份):**70.6 KB**
56
+ - 源码版(带注释)全库 gzip:380.1 KB
57
57
 
58
58
  > ⚠️ 源码版那个数字**不是**要付的钱:它包含我们的注释(全库 CSS 有 69% 是注释,字节口径)。
59
59
  > 它的用途只有一个 —— 让人看清"dist 到底省了多少"。
@@ -5,8 +5,8 @@
5
5
 
6
6
  | 项目 | 值 |
7
7
  |---|---|
8
- | 声明适用版本 | agentcss `0.25.4` |
9
- | 声明日期 | 2026-11-03 |
8
+ | 声明适用版本 | agentcss `0.25.6` |
9
+ | 声明日期 | 2026-11-04 |
10
10
  | 复核节奏 | 每次发版前重跑(`npm run gate` 内含全部证据) |
11
11
  | 范围 | 本库交付的 CSS / JS、全部 `demo.html`(组件页 + 图表页 + 组合页)、以及文档站生成的页面 |
12
12
  | 不在范围 | 使用者拿这些组件拼出来的业务页面(那是你的无障碍责任,不是库的) |
@@ -139,14 +139,26 @@
139
139
  所以"未分层"是当前唯一安全的选择。`cascade-layer-gate.py` 把这条变成可判状态:
140
140
  一旦出现第一条 `@layer`,就要求三条前提的实测记录已落档,否则红。
141
141
 
142
- `!important` 现有 10 处,**每一处都必须能被归类**:
142
+ `!important` **每一处都必须能被归类**,归不了类的 ⇒ 红。判据不是"清零" ——
143
+ 清零会逼人删掉无障碍兜底。
143
144
 
144
- | 类别 | 处数 | 为什么必须赢 |
145
- |---|---|---|
146
- | 无障碍偏好(`prefers-reduced-motion`) | 9 | 操作系统级偏好,组件无权推翻 |
147
- | 正确性(`[hidden] { display: none }`) | 1 | 不赢就会"藏不住" |
145
+ | 类别 | 为什么必须赢 |
146
+ |---|---|
147
+ | 无障碍偏好(`prefers-reduced-motion: reduce`) | 操作系统级偏好,组件无权推翻 |
148
+ | 正确性(`[hidden] { display: none }`) | 不赢就会"藏不住" |
149
+ | 打印媒体(`@media print` + `display: none`) | 纸张上没有交互,屏幕专属元素必须真的不出现 |
150
+
151
+ **这里刻意不写"现在有几处"**(I-7:同一个数字有第二个出处,就必然漂移)。
152
+ 要数字就跑门禁,它会把每一类的处数打出来:
153
+
154
+ ```bash
155
+ python 05-audit/cascade-layer-gate.py
156
+ ```
148
157
 
149
- 分不了类的 `!important` ⇒ 红。判据不是"清零"——清零会逼人删掉无障碍兜底。
158
+ > 曾经的教训:这份文档写"10 处(无障碍 9 + `[hidden]` 1)",而门禁当时实测
159
+ > **13 处**——多出来的 2 处是打印媒体,文档连这个类别都没列。
160
+ > 于是按文档去审计的人会把 2 处**判成"说不清"**,而那两处恰恰是正当的。
161
+ > 少写一个类别,比少写一个数字更坏。
150
162
 
151
163
  ## 八 · 对比度与触控的硬线
152
164
 
@@ -25,7 +25,7 @@
25
25
  > ⇒ 它支撑的结论是「我们在这 7 个环境里试过,结果如下」,
26
26
  > 不是「我们保证这 7 个环境一直能用」。
27
27
  > 逐项结果(7 行 × 15 项)、15 项全集与复核方法见
28
- > [`10-review/webview/RESULTS.md`](../10-review/webview/RESULTS.md)。
28
+ > [`10-review/webview/RESULTS.md`](https://github.com/owain323/frontend-lib/blob/master/10-review/webview/RESULTS.md)。
29
29
 
30
30
  ---
31
31
 
@@ -146,7 +146,7 @@ Android 上 Chrome ≠ 系统 WebView ≠ 各家 App 内置 WebView。**入口
146
146
  |---|---|
147
147
  | 数据怎么来的 | 在真实设备上打开 `10-review/webview/capability-probe.html`,把页面输出的结果贴进上表 |
148
148
  | 有没有原始记录 | 🔴 **没有入库**。当时探针把 JSON POST 回采集端,落的是本机文件,仓库里只留下转录进表格的结论 |
149
- | 逐项结果在哪看 | [`10-review/webview/RESULTS.md`](../10-review/webview/RESULTS.md) —— 7 行 × 15 项矩阵 |
149
+ | 逐项结果在哪看 | [`10-review/webview/RESULTS.md`](https://github.com/owain323/frontend-lib/blob/master/10-review/webview/RESULTS.md) —— 7 行 × 15 项矩阵 |
150
150
  | 别人怎么复核 | 同上文件「怎么自己复核一行」:取 UA → 在目标设备复跑探针 → 比对 `N / 15` 与缺失项 |
151
151
  | 日期锚点 | 表格「测试日期」列写的是「见采集所在提交(git log)」;用 `git blame` + 该行 UA 的唯一片段定位 |
152
152
  | 有没有自动化守着 | **没有**。人工一次性实测,浏览器升级不会触发任何门禁 |
package/index.html CHANGED
@@ -97,7 +97,7 @@ li a:active { background: var(--surface-sunken); }
97
97
  </p>
98
98
  </main>
99
99
  <footer class="wrap">
100
- <p class="note">0.25.4 · 零第三方运行时依赖</p>
100
+ <p class="note">0.25.6 · 零第三方运行时依赖</p>
101
101
  </footer>
102
102
  </body>
103
103
  </html>
package/llms-full.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # agentcss — full reference (one file)
2
2
 
3
- > Generated from `ai/components.json` + `ai/pitfalls*.json` + `ai/behaviors.json` at version **0.25.4**.
3
+ > Generated from `ai/components.json` + `ai/pitfalls*.json` + `ai/behaviors.json` at version **0.25.6**.
4
4
  > Do not edit by hand: run `python 05-audit/gen-llms.py` (freshness is gated).
5
5
  > Short version: `llms.txt`. Machine contract: `ai/*.json`.
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentcss",
3
- "version": "0.25.4",
3
+ "version": "0.25.6",
4
4
  "description": "移动 Web 组件库:CSS + 可选行为脚本,零第三方运行时依赖。样式用 bundler 引入,交互行为用 script 标签引入。",
5
5
  "keywords": [
6
6
  "css",
@@ -23,6 +23,8 @@
23
23
  "default": "./esm/index.mjs"
24
24
  },
25
25
  "./tokens.css": "./dist/01-tokens/tokens.css",
26
+ "./tokens.core.css": "./dist/01-tokens/tokens.core.css",
27
+ "./base.reset.css": "./dist/01-tokens/base.reset.css",
26
28
  "./typography.css": "./dist/01-tokens/typography.css",
27
29
  "./page.css": "./dist/01-tokens/page.css",
28
30
  "./esm": {
@@ -71,7 +73,17 @@
71
73
  "CODE_OF_CONDUCT.md",
72
74
  "CHANGELOG.md",
73
75
  "LICENSE",
74
- "index.html"
76
+ "index.html",
77
+ "!**/*.bak",
78
+ "!**/*.tmp",
79
+ "!**/*.orig",
80
+ "!**/*.rej",
81
+ "!**/*.old",
82
+ "!**/*.pyc",
83
+ "!**/*.log",
84
+ "!**/.DS_Store",
85
+ "!**/Thumbs.db",
86
+ "!**/__parity_probe.js"
75
87
  ],
76
88
  "sideEffects": [
77
89
  "**/*.css",
@@ -84,9 +96,9 @@
84
96
  "gate:fast": "bash 05-audit/check-all.sh --fast",
85
97
  "gate:timing": "bash 05-audit/check-all.sh --timing",
86
98
  "ci:observe": "python3 05-audit/nightly-observe.py",
87
- "ci:print-cost": "node 05-audit/print-pagination-cost.js",
88
- "ci:print-audit": "node 05-audit/print-content-audit.js --all",
89
- "ci:merge-exp": "node 05-audit/render-merge-experiment.js",
99
+ "ci:print-cost": "node 05-audit/print-pagination-cost.js",
100
+ "ci:print-audit": "node 05-audit/print-content-audit.js --all",
101
+ "ci:merge-exp": "node 05-audit/render-merge-experiment.js",
90
102
  "ci:zoom-merge": "node 05-audit/zoom-merge-experiment.js --all",
91
103
  "size:record": "python3 05-audit/size-baseline.py --record",
92
104
  "dist": "python3 05-audit/build-dist.py",