agentcss 0.24.0 → 0.24.2
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.
- package/01-tokens/focus-ring-demo.html +1 -1
- package/01-tokens/page.css +32 -0
- package/01-tokens/responsive-demo.html +1 -1
- package/01-tokens/scrollbar-demo.html +1 -1
- package/02-primitives/badge/demo.html +1 -1
- package/02-primitives/button/demo.html +1 -1
- package/02-primitives/card/demo.html +1 -1
- package/02-primitives/choice/demo.html +1 -1
- package/02-primitives/combobox/demo.html +1 -1
- package/02-primitives/date-range/demo.html +1 -1
- package/02-primitives/delta/demo.html +1 -1
- package/02-primitives/input/demo.html +1 -1
- package/02-primitives/metric/demo.html +1 -1
- package/02-primitives/popover/demo.html +1 -1
- package/02-primitives/progress/demo.html +1 -1
- package/02-primitives/select/demo.html +1 -1
- package/02-primitives/separator/demo.html +1 -1
- package/02-primitives/skeleton/demo.html +1 -1
- package/02-primitives/switch/demo.html +1 -1
- package/02-primitives/timeline/demo.html +1 -1
- package/03-patterns/accordion/demo.html +1 -1
- package/03-patterns/content/demo.html +1 -1
- package/03-patterns/drawer/demo.html +1 -1
- package/03-patterns/dropdown/demo.html +1 -1
- package/03-patterns/form-validation/demo.html +1 -1
- package/03-patterns/list/demo.html +1 -1
- package/03-patterns/nav/demo.html +1 -1
- package/03-patterns/overlay/demo.html +1 -1
- package/03-patterns/pagination/demo.html +1 -1
- package/03-patterns/states/demo.html +1 -1
- package/03-patterns/tabs/demo.html +1 -1
- package/03-patterns/tooltip/demo.html +1 -1
- package/03-patterns/tree/demo.html +1 -1
- package/04-recipes/app-shell/demo.html +6 -2
- package/09-assets/bar/demo.html +1 -1
- package/09-assets/echarts-adapter/demo.html +1 -1
- package/09-assets/model-viewer/demo.html +1 -1
- package/09-assets/sparkline/demo.html +1 -1
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +112 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +3 -0
- package/README.zh-CN.md +6 -3
- package/ai/components.json +1 -1
- package/dist/01-tokens/page.css +1 -1
- package/dist/COSTS.md +1 -1
- package/docs/ACCESSIBILITY.md +2 -2
- package/docs/FACTS.md +144 -0
- package/docs/RELEASE-PROCESS.md +211 -0
- package/docs/VERIFY-RELEASE.md +167 -0
- package/index.html +1 -1
- package/llms-full.txt +2 -2
- package/package.json +1 -1
package/01-tokens/page.css
CHANGED
|
@@ -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
|
----------------------------------------------------------------------------
|
|
@@ -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
|
|
29
|
+
<body class="page">
|
|
30
30
|
<main class="wrap">
|
|
31
31
|
|
|
32
32
|
<h1>card · hover 无布局跳动</h1>
|
|
@@ -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
|
|
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
|
|
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)。
|
|
@@ -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
|
|
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)。
|
|
@@ -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
|
|
43
|
+
<body class="page">
|
|
44
44
|
<main class="wrap">
|
|
45
45
|
|
|
46
46
|
<h1>表单校验</h1>
|
|
@@ -151,8 +151,12 @@
|
|
|
151
151
|
</header>
|
|
152
152
|
<nav class="shell__side" aria-label="主导航(图标)">
|
|
153
153
|
<!-- 品牌在 72px 里放不下名字 ⇒ 只留标记,名字视觉隐藏(不是删掉)。
|
|
154
|
-
标记与文字分成两段是**契约要求**,见 README「图标态的父级元素」。
|
|
155
|
-
|
|
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>
|
package/09-assets/bar/demo.html
CHANGED
package/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# agentcss — for coding agents
|
|
2
2
|
|
|
3
|
-
- **Contract (machine-readable):** `ai/components.json` —
|
|
3
|
+
- **Contract (machine-readable):** `ai/components.json` — 40 components with root class, slots, variants, states, ARIA and file paths. Query it; never guess class names.
|
|
4
4
|
- **Known failure modes:** `ai/pitfalls.json`, or `npx agentcss ai pitfalls --json --component=<id>`.
|
|
5
5
|
- **Query:** `npx agentcss ai components --json [--maturity=stable]` · `ai tokens --json [--set=dark]` · `ai tree --json`.
|
|
6
6
|
- **Validate:** `npx agentcss ai validate <file> --schema=components --json`. Every subcommand accepts `--json`; failures print `{"ok":false,…}` and exit non-zero.
|
package/CHANGELOG.md
CHANGED
|
@@ -16,6 +16,118 @@
|
|
|
16
16
|
|
|
17
17
|
(无)
|
|
18
18
|
|
|
19
|
+
## [0.24.2] - 2026-11-01
|
|
20
|
+
|
|
21
|
+
**纯修订版:没有 CSS / JS / 类名 / 令牌的变更,下游不需要改任何代码。**
|
|
22
|
+
改的是「发布出来的东西对不对」和「检查它们的手段对不对」。
|
|
23
|
+
|
|
24
|
+
### 修复:`0.24.1` 的 npm 包里残留了旧数字
|
|
25
|
+
|
|
26
|
+
`agentcss@0.24.1` 的 `llms-full.txt` 第 13 行写 `39 components`,
|
|
27
|
+
同一文件第 24 行写 `Components (40)`;而站点上同路径文件已是 40。
|
|
28
|
+
两个渠道同版本号、两份内容(sha256 不同)——
|
|
29
|
+
原因是修复只重建了站点用的生成物,没有重新发版。
|
|
30
|
+
|
|
31
|
+
这一版由当前源码重新生成后发布,两份内容一致。
|
|
32
|
+
**不追溯修改历史版本**:`0.24.1` 在 registry 上保持原样,
|
|
33
|
+
因为"已发布的版本不可变"比"历史看起来整齐"更重要。
|
|
34
|
+
|
|
35
|
+
### 修复:`dist-fresh` 看不见产物改动
|
|
36
|
+
|
|
37
|
+
`build-dist.py --check` 原先只比「源 sha 与 manifest 记录是否一致」。
|
|
38
|
+
实测:给 `dist/01-tokens/tokens.css` 加一段注释、再把 `--sp-4` 的值改掉,
|
|
39
|
+
`--check` 仍然打印 OK —— 而文档里写着「不要手改 dist,dist-fresh 会红」,
|
|
40
|
+
等于一道不存在的保护。
|
|
41
|
+
|
|
42
|
+
现在 `--check` 有两段判据:源 sha 一致 **且** 产物字节 == 生成器现算字节
|
|
43
|
+
(干跑一遍、逐文件比、不写盘)。手改产物会报出从第几个字节开始不一样。
|
|
44
|
+
发布路径同样受益:`npm run publish:check` 里就包含这道。
|
|
45
|
+
|
|
46
|
+
### 修复:`md-render --check` 的表格判据比措辞窄
|
|
47
|
+
|
|
48
|
+
文档写「表格必须是 `<table>`(不能是 div 模拟的)」,
|
|
49
|
+
实现只有一句 `<div ... class="...table`。
|
|
50
|
+
用 `class="grid"`、`role="table"`、或让 `<tr>` 跑出 `<table>` —— 三种都抓不到。
|
|
51
|
+
|
|
52
|
+
现在拆成三条可独立关闭的规则(表格子元素越界 / ARIA 角色模拟 / class 含独立词 table),
|
|
53
|
+
措辞同步收窄到"三种已知形态",并写明"这是不是表格本身不可判定"。
|
|
54
|
+
新增 `--selftest` 13 条,含三条元反向(关掉对应规则必须变绿)。
|
|
55
|
+
|
|
56
|
+
### 发布治理
|
|
57
|
+
|
|
58
|
+
- `docs/VERIFY-RELEASE.md`:怎么核验一个版本 —— npm `gitHead`、
|
|
59
|
+
attestation `subject` 与 registry `integrity` 的对应关系、Pages deployment 的 `sha`,
|
|
60
|
+
以及 L0–L3 证据分级(明确 L2「全量文件完整性」目前不存在)。
|
|
61
|
+
- `docs/RELEASE-PROCESS.md`:生成链八个生成器的顺序、冻结点覆盖范围、
|
|
62
|
+
npm 链与站点链两条独立状态机、六种失败组合的恢复动作。
|
|
63
|
+
- tag 从这一版起必须写成 `git tag -a vX.Y.Z -m "source-commit: <40 位>"`
|
|
64
|
+
——`release-gate` 会验证它等于 tag 实际指向的提交,且该提交被远端分支包含。
|
|
65
|
+
`0.24.1` 及更早的 tag 没有该字段,走兼容判据。
|
|
66
|
+
- 发布工作流先 `probe` 再发布:npm / GitHub Release 各自按已存在与否门控,
|
|
67
|
+
已存在的 npm 版本必须核 `provenance.gitCommit` 与 tag 指向一致,不一致判失败。
|
|
68
|
+
`dist` 的两道语义比对**无条件**执行,不与 npm 是否已存在共用跳过条件。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## [0.24.1] - 2026-10-31
|
|
73
|
+
|
|
74
|
+
### `page.css` 补上 `<pre>` 的兜底(实测出来的,不是推演)
|
|
75
|
+
|
|
76
|
+
在 `.page` 环境里放一条 220 字符的长行,实测三种写法:
|
|
77
|
+
|
|
78
|
+
| 写法 | 结果 |
|
|
79
|
+
|---|---|
|
|
80
|
+
| 裸 `<pre>` | `doc=2048 / vw=375` ❌ 撑破 |
|
|
81
|
+
| `<pre class="code">`(没有 guide.css 时) | `doc=2211 / vw=375` ❌ 撑破 |
|
|
82
|
+
| `<div class="prose"><pre>`(没有 content.css 时) | `doc=2048 / vw=375` ❌ 撑破 |
|
|
83
|
+
|
|
84
|
+
三种都是 `overflow-x: visible` + `white-space: pre` ⇒ 长行顶到页面上,整页横向滚。
|
|
85
|
+
|
|
86
|
+
现有 84 个页面之所以没红,是因为每个 `<pre>` 恰好都另有来源
|
|
87
|
+
(`.prose > pre` 在 content.css、`pre.code` 在 guide.css)—— **那是巧合,不是契约**。
|
|
88
|
+
使用者照 `page.css` 写一页文档、贴一段长代码就会踩到。
|
|
89
|
+
|
|
90
|
+
修法只有两行,关键是选择器:
|
|
91
|
+
|
|
92
|
+
```css
|
|
93
|
+
:where(.page) pre { overflow-x: auto; }
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`:where()` 把特异性压到 `0,0,1`(只算 `pre`),任何带类的规则都能盖掉它 ——
|
|
97
|
+
`.prose > pre` 与 `pre.code` 都是 `0,1,1`,稳赢。
|
|
98
|
+
写成 `.page pre`(同权重)则会变成"胜负取决于加载顺序"的随时会翻的脸。
|
|
99
|
+
|
|
100
|
+
只写 `overflow-x`,**不写** padding / background / font:那些是"代码块长什么样",
|
|
101
|
+
属于 content.css / guide.css 的决定;这里只管"它不许撑破页面"。
|
|
102
|
+
实测确认:`.prose > pre` 的 `padding 16.3px` / 灰底 / `3px` 竖条 / 12px mono 一点没变,
|
|
103
|
+
裸 `<pre>` 也没有因此获得任何"代码块外观"。
|
|
104
|
+
|
|
105
|
+
### 图标态的品牌补上悬停提示
|
|
106
|
+
|
|
107
|
+
rail 下品牌只剩一个 20px 图形,鼠标用户没有别的线索知道它是什么
|
|
108
|
+
⇒ `demo` 的 `.shell__brand` 加 `title="金标准 · 财务台"`。
|
|
109
|
+
|
|
110
|
+
⚠️ 它只负责悬停提示。名字仍然来自 `.shell__brand-text` —— `title` 会**兜出**名字,
|
|
111
|
+
但 `H2` 判的是"文字是否被 `display: none` 掉",不靠 `title` 兜,所以这条改动
|
|
112
|
+
不会掩盖"把 brand-text 改成 display:none"的破坏。
|
|
113
|
+
|
|
114
|
+
### 工程卫生:38 个页面写成了 `<body class="page page">`
|
|
115
|
+
|
|
116
|
+
`class` 里同一个类写了两遍。浏览器匹配一次,渲染无差异,但它是手误的化石,
|
|
117
|
+
而且会让人怀疑"是不是有两套 page 类"。
|
|
118
|
+
|
|
119
|
+
全库排查:**没有任何生成器产生它**(`gen-docs.py` 里是 `class="page"`),
|
|
120
|
+
也没有 CSS 选择器依赖双类(`.page.page` 零命中)、没有 JS 读 `className` 精确值
|
|
121
|
+
—— 是纯手写遗留。38 个文件各 1 处,已全部改回 `class="page"`。
|
|
122
|
+
|
|
123
|
+
### 版本同步
|
|
124
|
+
|
|
125
|
+
这一版三处改动都**不改渲染**(`overflow-x` 对已有页面本就是 `auto`;
|
|
126
|
+
`title` 不渲染;重复类名去掉后匹配结果不变),只改内容哈希。
|
|
127
|
+
所以两平台视觉基线重录后应当逐字节不变 —— 变的只有 `_stamp.json` 里的指纹。
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
19
131
|
## [0.24.0] - 2026-10-31
|
|
20
132
|
|
|
21
133
|
### 图标态:把"文档说的"和"示例做的"合回一份
|
package/CONTRIBUTING.md
CHANGED
|
@@ -29,7 +29,7 @@ npm run gate # 全量:含浏览器类
|
|
|
29
29
|
npm run gate:fast # 只跑静态层,不用装浏览器
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
全量是 **
|
|
32
|
+
全量是 **222 道门禁**(4 路并发实测约 9 分钟 / 退出码 0;单道耗时累加 1691 秒,
|
|
33
33
|
组件层要起浏览器,还要逐张比 96 张视觉截图。0.11.15 起默认 4 路并发)。
|
|
34
34
|
只想确认没改坏静态契约的话用 `gate:fast`,几秒到几分钟。
|
|
35
35
|
|
package/README.md
CHANGED
|
@@ -192,6 +192,8 @@ Three mistakes the template above already avoids:
|
|
|
192
192
|
| `separator` | `separator` | Divider, optionally with centred text |
|
|
193
193
|
| `skeleton` | `skeleton` | Loading placeholder |
|
|
194
194
|
| `switch` | `switch` | Toggle switch |
|
|
195
|
+
| `timeline` | `timeline` | Ordered event sequence: order is the information, so it is an `ol`; state belongs to `badge`, colour loses meaning here |
|
|
196
|
+
| `upload` | `upload` | File upload: zero-JS native form, plus an enhanced form with drop, multiple files and validation |
|
|
195
197
|
|
|
196
198
|
### patterns (14)
|
|
197
199
|
|
|
@@ -217,6 +219,7 @@ Three mistakes the template above already avoids:
|
|
|
217
219
|
| Component | Root class | Purpose |
|
|
218
220
|
|---|---|---|
|
|
219
221
|
| `analysis-report` | `report` | Research report page: body and side rail side by side, collapsing to one column |
|
|
222
|
+
| `app-shell` | `shell` | App shell: sidebar, top bar, main area; sticky sidebar scrolls itself, folds away on narrow screens |
|
|
220
223
|
| `detail-page` | `detail-page` | Entity detail skeleton: complete / partly missing / no records, three states sharing one DOM structure |
|
|
221
224
|
| `report` | `rep` | Report layout system v1: shared base plus three layouts (magazine, scientific, financial research) |
|
|
222
225
|
| `table` | `table` | Data table: sort / loading / empty / error states, three presets (financial, academic, statistical) |
|
package/README.zh-CN.md
CHANGED
|
@@ -85,9 +85,9 @@ npm install github:owain323/frontend-lib
|
|
|
85
85
|
|
|
86
86
|
## 组件一览
|
|
87
87
|
|
|
88
|
-
共 **
|
|
88
|
+
共 **40** 个(stable 40 · 全部通过四条判据)。每个组件目录下有 `README.md`(为什么这么做)和 `demo.html`(能直接抄的结构)。
|
|
89
89
|
|
|
90
|
-
### primitives · 基础件(
|
|
90
|
+
### primitives · 基础件(17)
|
|
91
91
|
|
|
92
92
|
| 组件 | 根类名 | 用途 |
|
|
93
93
|
|---|---|---|
|
|
@@ -106,6 +106,8 @@ npm install github:owain323/frontend-lib
|
|
|
106
106
|
| `separator` | `separator` | 分隔线,可带中间文字 |
|
|
107
107
|
| `skeleton` | `skeleton` | 加载占位骨架 |
|
|
108
108
|
| `switch` | `switch` | 开关切换 |
|
|
109
|
+
| `timeline` | `timeline` | 时间轴:按时间排的事件序列(公告/大事记/版本记录);顺序即信息,用 `ol`,状态交给 `badge`,颜色在这里会失效 |
|
|
110
|
+
| `upload` | `upload` | 文件上传:零 JS 的原生形态 + 拖放/多文件/校验的增强形态 |
|
|
109
111
|
|
|
110
112
|
### patterns · 组合模式(14)
|
|
111
113
|
|
|
@@ -126,11 +128,12 @@ npm install github:owain323/frontend-lib
|
|
|
126
128
|
| `tooltip` | `tooltip` | 悬停/聚焦提示 |
|
|
127
129
|
| `tree` | `tree` | 可展开树形结构 |
|
|
128
130
|
|
|
129
|
-
### recipes · 整页配方(
|
|
131
|
+
### recipes · 整页配方(5)
|
|
130
132
|
|
|
131
133
|
| 组件 | 根类名 | 用途 |
|
|
132
134
|
|---|---|---|
|
|
133
135
|
| `analysis-report` | `report` | 组合型研究报告页面:正文与辅助栏并排,窄屏自然退回单栏 |
|
|
136
|
+
| `app-shell` | `shell` | 应用外壳:侧栏 + 顶栏 + 主区三段式;sticky 侧栏自滚、`min-width` 防撑破、窄屏收走侧栏 |
|
|
134
137
|
| `detail-page` | `detail-page` | 实体详情页骨架:字段齐全 / 部分缺失 / 一条数据都没有,三态共用同一套 DOM |
|
|
135
138
|
| `report` | `rep` | 报告版式系统 v1:共享基础 + 三套版式(杂志/科研技术/金融研究),只换一个 … |
|
|
136
139
|
| `table` | `table` | 数据表格:排序/加载/空/错误四态;三种用途预设(财务/学术/统计) |
|
package/ai/components.json
CHANGED
|
@@ -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.
|
|
4
|
+
"libraryVersion": "0.24.2",
|
|
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 下的专属门禁 ⇒ 还没被机器验证过,不要用",
|
package/dist/01-tokens/page.css
CHANGED
|
@@ -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);}
|