agentcss 0.24.0 → 0.24.1

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 (46) hide show
  1. package/01-tokens/focus-ring-demo.html +1 -1
  2. package/01-tokens/page.css +32 -0
  3. package/01-tokens/responsive-demo.html +1 -1
  4. package/01-tokens/scrollbar-demo.html +1 -1
  5. package/02-primitives/badge/demo.html +1 -1
  6. package/02-primitives/button/demo.html +1 -1
  7. package/02-primitives/card/demo.html +1 -1
  8. package/02-primitives/choice/demo.html +1 -1
  9. package/02-primitives/combobox/demo.html +1 -1
  10. package/02-primitives/date-range/demo.html +1 -1
  11. package/02-primitives/delta/demo.html +1 -1
  12. package/02-primitives/input/demo.html +1 -1
  13. package/02-primitives/metric/demo.html +1 -1
  14. package/02-primitives/popover/demo.html +1 -1
  15. package/02-primitives/progress/demo.html +1 -1
  16. package/02-primitives/select/demo.html +1 -1
  17. package/02-primitives/separator/demo.html +1 -1
  18. package/02-primitives/skeleton/demo.html +1 -1
  19. package/02-primitives/switch/demo.html +1 -1
  20. package/02-primitives/timeline/demo.html +1 -1
  21. package/03-patterns/accordion/demo.html +1 -1
  22. package/03-patterns/content/demo.html +1 -1
  23. package/03-patterns/drawer/demo.html +1 -1
  24. package/03-patterns/dropdown/demo.html +1 -1
  25. package/03-patterns/form-validation/demo.html +1 -1
  26. package/03-patterns/list/demo.html +1 -1
  27. package/03-patterns/nav/demo.html +1 -1
  28. package/03-patterns/overlay/demo.html +1 -1
  29. package/03-patterns/pagination/demo.html +1 -1
  30. package/03-patterns/states/demo.html +1 -1
  31. package/03-patterns/tabs/demo.html +1 -1
  32. package/03-patterns/tooltip/demo.html +1 -1
  33. package/03-patterns/tree/demo.html +1 -1
  34. package/04-recipes/app-shell/demo.html +6 -2
  35. package/09-assets/bar/demo.html +1 -1
  36. package/09-assets/echarts-adapter/demo.html +1 -1
  37. package/09-assets/model-viewer/demo.html +1 -1
  38. package/09-assets/sparkline/demo.html +1 -1
  39. package/CHANGELOG.md +59 -0
  40. package/ai/components.json +1 -1
  41. package/dist/01-tokens/page.css +1 -1
  42. package/dist/COSTS.md +1 -1
  43. package/docs/ACCESSIBILITY.md +1 -1
  44. package/index.html +1 -1
  45. package/llms-full.txt +1 -1
  46. package/package.json +1 -1
@@ -45,7 +45,7 @@ a { color: var(--accent); }
45
45
  .tip { font-size: var(--fs-xs); color: var(--text-tertiary); }
46
46
  </style>
47
47
  </head>
48
- <body class="page page">
48
+ <body class="page">
49
49
  <div class="wrap">
50
50
 
51
51
  <h1>焦点环</h1>
@@ -197,6 +197,38 @@
197
197
  border-radius: var(--r-xs);
198
198
  }
199
199
 
200
+ /* ============================================================================
201
+ 4b. 代码块的兜底:任何 <pre> 自己横向滚,不许把页面撑宽
202
+ ----------------------------------------------------------------------------
203
+ 🔴 为什么需要(0.24.1 实测,不是推演)
204
+ 在 `.page` 环境里放一条 220 字符的长行:
205
+
206
+ 裸 <pre> doc=2048 / vw=375 ❌ 撑破
207
+ <pre class="code"> doc=2211 / vw=375 ❌ 撑破 (没有 guide.css 时)
208
+ <div class="prose"><pre> doc=2048 / vw=375 ❌ 撑破 (没有 content.css 时)
209
+
210
+ 三种都是 `overflow-x: visible`、`white-space: pre`
211
+ ⇒ 长行直接顶到页面上,整页横向滚。
212
+
213
+ 现有 84 个页面之所以没红,是因为每个 pre 恰好都另有来源:
214
+ `.prose > pre`(content.css)、`pre.code`(guide.css)。**但那是巧合,不是契约**
215
+ —— 使用者照 page.css 写一页文档、贴一段长代码,就会踩到。
216
+
217
+ 🔴 为什么用 `:where(.page)` 而不是 `.page`
218
+ 特异性压到 0,0,1(只算 `pre`)⇒ 任何带类的规则都能盖掉它:
219
+ `.prose > pre` (0,1,1) 赢
220
+ `pre.code` (0,1,1) 赢
221
+ 这条的定位是**兜底**,不是"给所有 pre 定样式"。写成 `.page pre`(0,1,1)
222
+ 会与上面两条**同权重**,胜负取决于加载顺序 —— 那就成了一个随时会翻的脸。
223
+
224
+ ⚠️ 只写 `overflow-x`,不写 padding / background / font:
225
+ 那些是"代码块长什么样",属于 content.css / guide.css 的决定。
226
+ 这里只管"它不许撑破页面"。加了别的属性就会改动已有页面的观感。
227
+ ========================================================================= */
228
+ :where(.page) pre {
229
+ overflow-x: auto;
230
+ }
231
+
200
232
  /* ============================================================================
201
233
  5. 演示块 `.box`
202
234
  ----------------------------------------------------------------------------
@@ -29,7 +29,7 @@ p { margin: 0 0 var(--sp-4); }
29
29
  .swatch { height: var(--sp-4); background: var(--accent); border-radius: 3px; }
30
30
  </style>
31
31
  </head>
32
- <body class="page page">
32
+ <body class="page">
33
33
 
34
34
  <div id="meter">
35
35
  <span>视口 <b id="m-w">—</b></span>
@@ -46,7 +46,7 @@ td.num { text-align: right; font-family: var(--mono); font-variant-numeric: tabu
46
46
  border: 1px solid var(--border-control); }
47
47
  </style>
48
48
  </head>
49
- <body class="page page">
49
+ <body class="page">
50
50
  <div class="wrap">
51
51
 
52
52
  <h1>滚动条</h1>
@@ -15,7 +15,7 @@
15
15
  padding: var(--sp-4) 0; }
16
16
  </style>
17
17
  </head>
18
- <body class="page page">
18
+ <body class="page">
19
19
  <main class="wrap">
20
20
  <h1>badge · 状态标记</h1>
21
21
  <p class="lede">
@@ -24,7 +24,7 @@
24
24
  .btn--naive:disabled { opacity: 0.5; }
25
25
  </style>
26
26
  </head>
27
- <body class="page page">
27
+ <body class="page">
28
28
  <main class="wrap">
29
29
 
30
30
  <h1>button · 七态矩阵</h1>
@@ -26,7 +26,7 @@ p.small { font-size: var(--fs-xs); color: var(--text-tertiary); line-height: 1.6
26
26
  var(--text-tertiary) 0 1px, transparent 1px 8px); opacity: .5; margin-bottom: var(--sp-2); }
27
27
  </style>
28
28
  </head>
29
- <body class="page page">
29
+ <body class="page">
30
30
  <main class="wrap">
31
31
 
32
32
  <h1>card · hover 无布局跳动</h1>
@@ -30,7 +30,7 @@ p.small { font-size: var(--fs-xs); color: var(--text-tertiary); line-height: 1.6
30
30
  .log { color: var(--text-tertiary); }
31
31
  </style>
32
32
  </head>
33
- <body class="page page">
33
+ <body class="page">
34
34
  <main class="wrap">
35
35
 
36
36
  <h1>checkbox / radio / select</h1>
@@ -30,7 +30,7 @@ label.f { display: block; margin-bottom: var(--sp-1); font-size: var(--fs-sm); }
30
30
  }
31
31
  </style>
32
32
  </head>
33
- <body class="page page">
33
+ <body class="page">
34
34
  <main class="wrap">
35
35
 
36
36
  <h1>combobox · 组合框 / 标签输入</h1>
@@ -22,7 +22,7 @@
22
22
  .dr-bad-field .drange__input { border-color: var(--danger); }
23
23
  </style>
24
24
  </head>
25
- <body class="page page">
25
+ <body class="page">
26
26
  <main class="wrap">
27
27
 
28
28
  <h1>date-range · 日期区间</h1>
@@ -30,7 +30,7 @@
30
30
  color: var(--text-secondary); }
31
31
  </style>
32
32
  </head>
33
- <body class="page page">
33
+ <body class="page">
34
34
  <main class="wrap">
35
35
  <h1>delta · 变化量</h1>
36
36
  <p class="lede">
@@ -29,7 +29,7 @@
29
29
  .bad-err { color: red; font-size: 13px; }
30
30
  </style>
31
31
  </head>
32
- <body class="page page">
32
+ <body class="page">
33
33
  <main class="wrap">
34
34
 
35
35
  <h1>input · 五态矩阵</h1>
@@ -17,7 +17,7 @@
17
17
  padding: var(--sp-5); background: var(--surface); }
18
18
  </style>
19
19
  </head>
20
- <body class="page page">
20
+ <body class="page">
21
21
  <main class="wrap">
22
22
  <h1>metric · 指标块</h1>
23
23
  <p class="lede">
@@ -44,7 +44,7 @@ th { font-weight: 600; }
44
44
  .pp-stage .popover__title { margin: 0; font-size: var(--fs-sm); font-weight: 500; }
45
45
  </style>
46
46
  </head>
47
- <body class="page page">
47
+ <body class="page">
48
48
  <main class="wrap">
49
49
  <!-- 🔴 0.8.9:axe 报 landmark-one-main(moderate)—— 本页原本没有任何 landmark 容器。
50
50
  加 <main> 是语义正确且不改布局的做法(<main> 默认不产生 box)。
@@ -27,7 +27,7 @@
27
27
  .pr-note { margin: var(--sp-2) 0 0; font-size: var(--fs-xs); color: var(--text-secondary); }
28
28
  </style>
29
29
  </head>
30
- <body class="page page">
30
+ <body class="page">
31
31
  <main class="wrap">
32
32
  <!-- 🔴 0.8.9:axe 报 landmark-one-main(moderate)—— 本页原本没有任何 landmark 容器。
33
33
  加 <main> 是语义正确且不改布局的做法(<main> 默认不产生 box)。
@@ -38,7 +38,7 @@ label.f { display: block; margin-bottom: var(--sp-1); font-size: var(--fs-sm); }
38
38
  }
39
39
  </style>
40
40
  </head>
41
- <body class="page page">
41
+ <body class="page">
42
42
  <main class="wrap">
43
43
 
44
44
  <h1>select · 下拉选择</h1>
@@ -13,7 +13,7 @@
13
13
  .row { padding: var(--sp-2) 0; }
14
14
  </style>
15
15
  </head>
16
- <body class="page page">
16
+ <body class="page">
17
17
  <main class="wrap">
18
18
  <h1>separator · 分隔线</h1>
19
19
  <p class="lede">
@@ -28,7 +28,7 @@
28
28
  .sk-box { display: flex; flex-direction: column; gap: var(--sp-2); }
29
29
  </style>
30
30
  </head>
31
- <body class="page page">
31
+ <body class="page">
32
32
  <main class="wrap">
33
33
  <!-- 🔴 0.8.9:axe 报 landmark-one-main(moderate)—— 本页原本没有任何 landmark 容器。
34
34
  加 <main> 是语义正确且不改布局的做法(<main> 默认不产生 box)。
@@ -16,7 +16,7 @@
16
16
  color: var(--text-secondary); }
17
17
  </style>
18
18
  </head>
19
- <body class="page page">
19
+ <body class="page">
20
20
  <main class="wrap">
21
21
  <h1>switch · 开关</h1>
22
22
  <p class="lede">
@@ -28,7 +28,7 @@
28
28
  }
29
29
  </style>
30
30
  </head>
31
- <body class="page page">
31
+ <body class="page">
32
32
  <main class="wrap">
33
33
  <h1>timeline · 时间轴</h1>
34
34
  <p class="lede">
@@ -13,7 +13,7 @@
13
13
  p { margin: 0 0 var(--sp-3); }
14
14
  </style>
15
15
  </head>
16
- <body class="page page">
16
+ <body class="page">
17
17
  <main class="wrap">
18
18
  <h1>accordion · 折叠面板</h1>
19
19
  <p class="lede">
@@ -20,7 +20,7 @@
20
20
  .ct-p { margin: 0; font-size: var(--fs-sm); }
21
21
  </style>
22
22
  </head>
23
- <body class="page page">
23
+ <body class="page">
24
24
 
25
25
  <main>
26
26
  <p class="demo-note">
@@ -38,7 +38,7 @@ ul.demo-list li { margin: var(--sp-1) 0; }
38
38
  }
39
39
  </style>
40
40
  </head>
41
- <body class="page page">
41
+ <body class="page">
42
42
  <main class="wrap">
43
43
 
44
44
  <h1>drawer · 抽屉</h1>
@@ -35,7 +35,7 @@
35
35
  }
36
36
  </style>
37
37
  </head>
38
- <body class="page page">
38
+ <body class="page">
39
39
  <main class="wrap">
40
40
 
41
41
  <h1>dropdown · 下拉菜单</h1>
@@ -40,7 +40,7 @@ p.small { font-size: var(--fs-xs); color: var(--text-tertiary); line-height: 1.6
40
40
  由 05-audit/css-imports.py 报出(它抓到过这个真问题) -->
41
41
  <link rel="stylesheet" href="../../02-primitives/button/button.css">
42
42
  </head>
43
- <body class="page page">
43
+ <body class="page">
44
44
  <main class="wrap">
45
45
 
46
46
  <h1>表单校验</h1>
@@ -30,7 +30,7 @@ p.small { font-size: var(--fs-xs); color: var(--text-tertiary); line-height: 1.6
30
30
  .cmp .ls-demo { max-width: 300px; }
31
31
  </style>
32
32
  </head>
33
- <body class="page page">
33
+ <body class="page">
34
34
  <main class="wrap">">
35
35
 
36
36
  <h1>删掉一行,其余行不该瞬移</h1>
@@ -38,7 +38,7 @@ p.small { font-size: var(--fs-xs); color: var(--text-tertiary); line-height: 1.7
38
38
  .toc-wrap { white-space: normal; }
39
39
  </style>
40
40
  </head>
41
- <body class="page page">
41
+ <body class="page">
42
42
 
43
43
  <a class="skip" href="#main">跳到主内容</a>
44
44
 
@@ -40,7 +40,7 @@ p.small { font-size: var(--fs-xs); color: var(--text-tertiary); line-height: 1.6
40
40
  }
41
41
  </style>
42
42
  </head>
43
- <body class="page page">
43
+ <body class="page">
44
44
  <main class="wrap">
45
45
 
46
46
  <h1>Toast vs Dialog</h1>
@@ -33,7 +33,7 @@ th { font-size: var(--fs-xs); color: var(--text-secondary); font-weight: 500; }
33
33
  .pagination__list { flex-wrap: wrap; }
34
34
  </style>
35
35
  </head>
36
- <body class="page page">
36
+ <body class="page">
37
37
  <main class="wrap">
38
38
 
39
39
  <h1>分页</h1>
@@ -58,7 +58,7 @@ p.lead { color: var(--text-secondary); }
58
58
  margin-bottom: var(--sp-2); display: block; }
59
59
  </style>
60
60
  </head>
61
- <body class="page page">
61
+ <body class="page">
62
62
  <main class="wrap">
63
63
 
64
64
  <h1>加载中和没有数据,是两件事</h1>
@@ -15,7 +15,7 @@
15
15
  color: var(--text-secondary); min-height: 1.5em; }
16
16
  </style>
17
17
  </head>
18
- <body class="page page">
18
+ <body class="page">
19
19
  <main class="wrap">
20
20
  <h1>tabs · 标签页</h1>
21
21
  <p class="lede">
@@ -21,7 +21,7 @@
21
21
  .tt-hint { margin: var(--sp-2) 0 0; font-size: var(--fs-xs); color: var(--text-tertiary); }
22
22
  </style>
23
23
  </head>
24
- <body class="page page">
24
+ <body class="page">
25
25
  <main class="wrap">
26
26
 
27
27
  <h1>tooltip · 文字提示</h1>
@@ -30,7 +30,7 @@
30
30
  color: var(--text-tertiary); text-align: center; }
31
31
  </style>
32
32
  </head>
33
- <body class="page page">
33
+ <body class="page">
34
34
  <main class="wrap">
35
35
 
36
36
  <h1>tree · 树形视图</h1>
@@ -151,8 +151,12 @@
151
151
  </header>
152
152
  <nav class="shell__side" aria-label="主导航(图标)">
153
153
  <!-- 品牌在 72px 里放不下名字 ⇒ 只留标记,名字视觉隐藏(不是删掉)。
154
- 标记与文字分成两段是**契约要求**,见 README「图标态的父级元素」。 -->
155
- <a class="shell__brand" href="#">
154
+ 标记与文字分成两段是**契约要求**,见 README「图标态的父级元素」。
155
+ ⚠️ `title` 在这里是**必要**的:rail 下只剩一个 20px 的图形,
156
+ 鼠标用户没有别的线索知道它是什么。它只负责悬停提示 ——
157
+ 名字仍然来自 `.shell__brand-text`(title 会兜出名字,
158
+ 但 H2 判的是"文字是否被 display:none 掉",不靠 title 兜)。 -->
159
+ <a class="shell__brand" href="#" title="金标准 · 财务台">
156
160
  <svg class="shell__brand-mark" viewBox="0 0 16 16" width="20" height="20" fill="none"
157
161
  stroke="currentColor" stroke-width="1.4" stroke-linejoin="round" aria-hidden="true"><path d="M8 1.6l5.4 3.1v6.6L8 14.4 2.6 11.3V4.7z"/></svg>
158
162
  <span class="shell__brand-text">金标准 · 财务台</span>
@@ -19,7 +19,7 @@
19
19
  }
20
20
  </style>
21
21
  </head>
22
- <body class="page page">
22
+ <body class="page">
23
23
  <main class="wrap">
24
24
 
25
25
  <h1>bar · 柱状图</h1>
@@ -33,7 +33,7 @@ td.num { text-align: right; font-family: var(--mono); font-variant-numeric: tabu
33
33
  vertical-align:middle; margin-right:4px; }
34
34
  </style>
35
35
  </head>
36
- <body class="page page">
36
+ <body class="page">
37
37
  <div class="wrap">
38
38
  <h1>图表规范</h1>
39
39
  <p class="lede">
@@ -28,7 +28,7 @@ td.num { text-align: right; font-family: var(--mono); font-variant-numeric: tabu
28
28
  .ok { color: var(--success); }
29
29
  </style>
30
30
  </head>
31
- <body class="page page">
31
+ <body class="page">
32
32
  <main class="wrap">
33
33
 
34
34
  <h1>3D 模型查看器</h1>
@@ -32,7 +32,7 @@
32
32
  /* 🔴 但别小于 40 */
33
33
  </style>
34
34
  </head>
35
- <body class="page page">
35
+ <body class="page">
36
36
  <main class="wrap">
37
37
  <h1>sparkline · 迷你趋势图</h1>
38
38
  <p class="lede">
package/CHANGELOG.md CHANGED
@@ -16,6 +16,65 @@
16
16
 
17
17
  (无)
18
18
 
19
+ ## [0.24.1] - 2026-10-31
20
+
21
+ ### `page.css` 补上 `<pre>` 的兜底(实测出来的,不是推演)
22
+
23
+ 在 `.page` 环境里放一条 220 字符的长行,实测三种写法:
24
+
25
+ | 写法 | 结果 |
26
+ |---|---|
27
+ | 裸 `<pre>` | `doc=2048 / vw=375` ❌ 撑破 |
28
+ | `<pre class="code">`(没有 guide.css 时) | `doc=2211 / vw=375` ❌ 撑破 |
29
+ | `<div class="prose"><pre>`(没有 content.css 时) | `doc=2048 / vw=375` ❌ 撑破 |
30
+
31
+ 三种都是 `overflow-x: visible` + `white-space: pre` ⇒ 长行顶到页面上,整页横向滚。
32
+
33
+ 现有 84 个页面之所以没红,是因为每个 `<pre>` 恰好都另有来源
34
+ (`.prose > pre` 在 content.css、`pre.code` 在 guide.css)—— **那是巧合,不是契约**。
35
+ 使用者照 `page.css` 写一页文档、贴一段长代码就会踩到。
36
+
37
+ 修法只有两行,关键是选择器:
38
+
39
+ ```css
40
+ :where(.page) pre { overflow-x: auto; }
41
+ ```
42
+
43
+ `:where()` 把特异性压到 `0,0,1`(只算 `pre`),任何带类的规则都能盖掉它 ——
44
+ `.prose > pre` 与 `pre.code` 都是 `0,1,1`,稳赢。
45
+ 写成 `.page pre`(同权重)则会变成"胜负取决于加载顺序"的随时会翻的脸。
46
+
47
+ 只写 `overflow-x`,**不写** padding / background / font:那些是"代码块长什么样",
48
+ 属于 content.css / guide.css 的决定;这里只管"它不许撑破页面"。
49
+ 实测确认:`.prose > pre` 的 `padding 16.3px` / 灰底 / `3px` 竖条 / 12px mono 一点没变,
50
+ 裸 `<pre>` 也没有因此获得任何"代码块外观"。
51
+
52
+ ### 图标态的品牌补上悬停提示
53
+
54
+ rail 下品牌只剩一个 20px 图形,鼠标用户没有别的线索知道它是什么
55
+ ⇒ `demo` 的 `.shell__brand` 加 `title="金标准 · 财务台"`。
56
+
57
+ ⚠️ 它只负责悬停提示。名字仍然来自 `.shell__brand-text` —— `title` 会**兜出**名字,
58
+ 但 `H2` 判的是"文字是否被 `display: none` 掉",不靠 `title` 兜,所以这条改动
59
+ 不会掩盖"把 brand-text 改成 display:none"的破坏。
60
+
61
+ ### 工程卫生:38 个页面写成了 `<body class="page page">`
62
+
63
+ `class` 里同一个类写了两遍。浏览器匹配一次,渲染无差异,但它是手误的化石,
64
+ 而且会让人怀疑"是不是有两套 page 类"。
65
+
66
+ 全库排查:**没有任何生成器产生它**(`gen-docs.py` 里是 `class="page"`),
67
+ 也没有 CSS 选择器依赖双类(`.page.page` 零命中)、没有 JS 读 `className` 精确值
68
+ —— 是纯手写遗留。38 个文件各 1 处,已全部改回 `class="page"`。
69
+
70
+ ### 版本同步
71
+
72
+ 这一版三处改动都**不改渲染**(`overflow-x` 对已有页面本就是 `auto`;
73
+ `title` 不渲染;重复类名去掉后匹配结果不变),只改内容哈希。
74
+ 所以两平台视觉基线重录后应当逐字节不变 —— 变的只有 `_stamp.json` 里的指纹。
75
+
76
+ ---
77
+
19
78
  ## [0.24.0] - 2026-10-31
20
79
 
21
80
  ### 图标态:把"文档说的"和"示例做的"合回一份
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "generatedBy": "05-audit/gen-ai-contract.py",
4
- "libraryVersion": "0.24.0",
4
+ "libraryVersion": "0.24.1",
5
5
  "$comment": "机器可读的组件契约。slots = BEM 元素名(在本库里元素名就是插槽名),states.enum = 组件会在 DOM 上写出的 data-* 取值,states.legacyClass = 仍未收敛到 data 属性的历史状态类(INVARIANT I-8 未达标)。",
6
6
  "maturityCriteria": {
7
7
  "alpha": "缺 demo.html 或缺 05-audit 下的专属门禁 ⇒ 还没被机器验证过,不要用",
@@ -1 +1 @@
1
- .page {margin:0;min-height:100vh;min-height:100dvh;background:var(--paper);color:var(--text-primary);font-family:var(--sans);font-size:var(--fs-base);line-height:var(--lh-base);-webkit-text-size-adjust:100%;padding-block:calc(env(safe-area-inset-top, 0px) + var(--sp-6)) calc(env(safe-area-inset-bottom, 0px) + var(--sp-6));padding-inline:max(env(safe-area-inset-right, 0px), var(--sp-4)) max(env(safe-area-inset-left, 0px), var(--sp-4));}.page *, .page *::before, .page *::after {box-sizing:border-box;}.page .wrap {margin-inline:auto;max-width:min(var(--measure-page), 100%);}.page .wrap--prose {max-width:min(var(--measure-prose), 100%);}.page h1 {font-family:var(--sans);font-size:var(--fs-2xl);font-weight:500;letter-spacing:var(--tracking-title);line-height:var(--lh-tight);margin:0 0 var(--sp-3);max-width:var(--measure-title);}.page h2 {font-size:var(--fs-lg);margin:var(--sp-7) 0 var(--sp-3);}.page .rule-top {border-top:1px solid var(--border-decor);padding-top:var(--sp-4);}.page .rule-bottom {border-bottom:1px solid var(--border-decor);padding-bottom:var(--sp-2);margin-bottom:var(--sp-4);}.page code {font-family:var(--mono);font-size:0.9em;background:var(--surface-sunken);padding:1px 4px;border-radius:var(--r-xs);}.page .box {background:var(--surface);border:1px solid var(--border-decor);border-radius:var(--r-md);padding:var(--sp-5);}.page .box.bad {background:var(--surface-sunken);}.page .cmp {display:grid;grid-template-columns:minmax(0, 1fr) minmax(0, 1fr);gap:var(--sp-4);}.page .cmp--wide-first {grid-template-columns:minmax(0, 1.55fr) minmax(0, 1fr);}@media (max-width:640px) {.page .cmp, .page .cmp--wide-first, .page .cmp--clip {grid-template-columns:minmax(0, 1fr);}}.page .cmp__pane {padding:var(--sp-4);border:1px solid var(--border-decor);border-radius:var(--r-md);background:var(--surface-sunken);min-width:0;}.page .cmp--clip .cmp__pane {overflow:hidden;}.page .cmp__pane > h3 {margin:0 0 var(--sp-3);font-size:var(--fs-sm);font-weight:500;}.page .cmp__bad > h3 {color:var(--danger);}.page .cmp__good > h3 {color:var(--success);}.page .cmp__why {margin:var(--sp-3) 0 0;font-size:var(--fs-xs);line-height:1.6;color:var(--text-secondary);}
1
+ .page {margin:0;min-height:100vh;min-height:100dvh;background:var(--paper);color:var(--text-primary);font-family:var(--sans);font-size:var(--fs-base);line-height:var(--lh-base);-webkit-text-size-adjust:100%;padding-block:calc(env(safe-area-inset-top, 0px) + var(--sp-6)) calc(env(safe-area-inset-bottom, 0px) + var(--sp-6));padding-inline:max(env(safe-area-inset-right, 0px), var(--sp-4)) max(env(safe-area-inset-left, 0px), var(--sp-4));}.page *, .page *::before, .page *::after {box-sizing:border-box;}.page .wrap {margin-inline:auto;max-width:min(var(--measure-page), 100%);}.page .wrap--prose {max-width:min(var(--measure-prose), 100%);}.page h1 {font-family:var(--sans);font-size:var(--fs-2xl);font-weight:500;letter-spacing:var(--tracking-title);line-height:var(--lh-tight);margin:0 0 var(--sp-3);max-width:var(--measure-title);}.page h2 {font-size:var(--fs-lg);margin:var(--sp-7) 0 var(--sp-3);}.page .rule-top {border-top:1px solid var(--border-decor);padding-top:var(--sp-4);}.page .rule-bottom {border-bottom:1px solid var(--border-decor);padding-bottom:var(--sp-2);margin-bottom:var(--sp-4);}.page code {font-family:var(--mono);font-size:0.9em;background:var(--surface-sunken);padding:1px 4px;border-radius:var(--r-xs);}:where(.page) pre {overflow-x:auto;}.page .box {background:var(--surface);border:1px solid var(--border-decor);border-radius:var(--r-md);padding:var(--sp-5);}.page .box.bad {background:var(--surface-sunken);}.page .cmp {display:grid;grid-template-columns:minmax(0, 1fr) minmax(0, 1fr);gap:var(--sp-4);}.page .cmp--wide-first {grid-template-columns:minmax(0, 1.55fr) minmax(0, 1fr);}@media (max-width:640px) {.page .cmp, .page .cmp--wide-first, .page .cmp--clip {grid-template-columns:minmax(0, 1fr);}}.page .cmp__pane {padding:var(--sp-4);border:1px solid var(--border-decor);border-radius:var(--r-md);background:var(--surface-sunken);min-width:0;}.page .cmp--clip .cmp__pane {overflow:hidden;}.page .cmp__pane > h3 {margin:0 0 var(--sp-3);font-size:var(--fs-sm);font-weight:500;}.page .cmp__bad > h3 {color:var(--danger);}.page .cmp__good > h3 {color:var(--success);}.page .cmp__why {margin:var(--sp-3) 0 0;font-size:var(--fs-xs);line-height:1.6;color:var(--text-secondary);}
package/dist/COSTS.md CHANGED
@@ -53,7 +53,7 @@
53
53
  ## 三、全库
54
54
 
55
55
  - 全部组件都用上(min,含 tokens 一份):**69.0 KB**
56
- - 源码版(带注释)全库 gzip:348.5 KB
56
+ - 源码版(带注释)全库 gzip:349.2 KB
57
57
 
58
58
  > ⚠️ 源码版那个数字**不是**要付的钱:它包含我们的注释(全库 CSS 有 68% 是注释,字节口径)。
59
59
  > 它的用途只有一个 —— 让人看清"dist 到底省了多少"。
@@ -5,7 +5,7 @@
5
5
 
6
6
  | 项目 | 值 |
7
7
  |---|---|
8
- | 声明适用版本 | agentcss `0.24.0` |
8
+ | 声明适用版本 | agentcss `0.24.1` |
9
9
  | 声明日期 | 2026-10-31 |
10
10
  | 复核节奏 | 每次发版前重跑(`npm run gate` 内含全部证据) |
11
11
  | 范围 | 本库交付的 CSS / JS、全部 `demo.html`(组件页 + 图表页 + 组合页)、以及文档站生成的页面 |
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.24.0 · 零第三方运行时依赖</p>
100
+ <p class="note">0.24.1 · 零第三方运行时依赖</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.24.0**.
3
+ > Generated from `ai/components.json` + `ai/pitfalls*.json` + `ai/behaviors.json` at version **0.24.1**.
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.24.0",
3
+ "version": "0.24.1",
4
4
  "description": "移动 Web 组件库:CSS + 可选行为脚本,零第三方运行时依赖。样式用 bundler 引入,交互行为用 script 标签引入。",
5
5
  "keywords": [
6
6
  "css",