agentcss 0.11.16 → 0.13.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.
package/ai/cli.js CHANGED
@@ -256,6 +256,153 @@ function cmdComponents(args) {
256
256
  process.exit(0);
257
257
  }
258
258
 
259
+ // 🔴 ai assets —— 组件之外那批资产的机器可读目录(WO-03)
260
+ // ---------------------------------------------------------------------------
261
+ // 为什么要有这条:
262
+ // `ai components` 只认 `components.json`,而它只收「有独立 CSS 的目录」⇒ 37 个。
263
+ // 磁盘上还有 5 项不是组件、但 AI 不知道就会自己重写的东西:
264
+ // · 01-tokens/page.css 页面骨架与响应式两栏
265
+ // · 01-tokens/behavior/ 微行为核(Esc 关闭 / 焦点归还 / 方向键游走)
266
+ // · 04-recipes/longform 单文件长文示例页(连 demo.html 都没有)
267
+ // · 04-recipes/data-showcase
268
+ // · 09-assets/echarts-adapter 依赖宿主已有 ECharts(本库不含)
269
+ // 后果很具体:不知道 page.css 就自己写布局,不知道 behavior/ 就手写
270
+ // dismissable —— 后者正是 4 个 beta 组件被判 beta 的原因(dismissable:manual)。
271
+ //
272
+ // ⚠️ 本命令的清单**从磁盘扫描生成**,禁止手工维护第二份事实。
273
+ // `05-audit/assets-catalog-gate.py` 校验「磁盘目录数 == 本命令输出数」,
274
+ // 两边一旦漂移就变红。
275
+ var ROOT = path.join(AI, '..');
276
+ var ASSET_LAYERS = ['02-primitives', '03-patterns', '04-recipes', '09-assets'];
277
+
278
+ function readFirstUsefulLine(file) {
279
+ try {
280
+ var s = fs.readFileSync(file, 'utf8').split('\n');
281
+ for (var i = 0; i < s.length && i < 90; i++) {
282
+ var t = s[i].trim();
283
+ if (!t) continue;
284
+ // 块注释边界与装饰线:跳过,不是描述
285
+ if (/^\/\*+[=\s*-]*$/.test(t)) continue;
286
+ if (/^[=\s-]*\*+\/$/.test(t)) continue;
287
+ if (/^\*+[=\s*-]*$/.test(t)) continue;
288
+ if (/^={3,}/.test(t) || /^-{3,}/.test(t)) continue;
289
+ // 注释内的内容行:去掉前导 * 再判断
290
+ if (t.charAt(0) === '*') { t = t.replace(/^\*+\s*/, '').trim(); if (!t) continue; }
291
+ if (t.length > 2 && t.slice(-2) === '*/') { t = t.slice(0, -2).trim(); if (!t) continue; }
292
+ if (t.charAt(0) === '#') { t = t.replace(/^#+\s*/, '').trim(); if (t) return t.slice(0, 72); continue; }
293
+ // Markdown 表格:只认「用途」这类带说明的字段,其余(来源/门禁/文件)跳过
294
+ var m = t.match(/^\|\s*\*\*([^*]+)\*\*\s*\|\s*([^|]+)\|/);
295
+ if (m) {
296
+ if (m[1].indexOf('用途') >= 0 || m[1].indexOf('定位') >= 0) return m[2].trim().slice(0, 72);
297
+ continue;
298
+ }
299
+ if (t.charAt(0) === '|') continue;
300
+ // 无中文的「a / b / c」是路径面包屑,不是描述
301
+ if (!/[\u4e00-\u9fa5]/.test(t) && t.indexOf(' / ') >= 0) continue;
302
+ if (!/[\u4e00-\u9fa5]/.test(t) && /\.(css|js|html)$/.test(t)) continue;
303
+ return t.slice(0, 72);
304
+ }
305
+ } catch (e) { /* 读不到就当没描述,不抛 */ }
306
+ return '';
307
+ }
308
+
309
+ function describeAsset(dir, name, purpose) {
310
+ // 在契约里的,直接用契约的 purpose(比 README 标题精确)
311
+ if (purpose) return purpose;
312
+ var d = path.join(ROOT, dir, name);
313
+ var rd = path.join(d, 'README.md');
314
+ if (fs.existsSync(rd)) {
315
+ var txt = fs.readFileSync(rd, 'utf8');
316
+ var m = txt.match(/\|\s*\*\*用途\*\*\s*\|\s*([^|\n]+)/);
317
+ if (m) return m[1].trim().slice(0, 72);
318
+ return readFirstUsefulLine(rd);
319
+ }
320
+ // 没有 README:回退到目录内第一个脚本的头部注释
321
+ var f2 = fs.readdirSync(d).filter(function (f) {
322
+ return /\.(js|css)$/.test(f) && f.indexOf('demo') !== 0;
323
+ });
324
+ if (f2.length) return readFirstUsefulLine(path.join(d, f2[0]));
325
+ return '';
326
+ }
327
+
328
+ // 类型判定必须机械可判,不查名单:
329
+ // 在组件契约里 → component
330
+ // 09-assets 下的目录 → adapter(都是「消费外部能力」的适配层)
331
+ // 有 CSS 但不在契约 → component(意味着契约漏了它,门禁会报)
332
+ // 无 CSS 有 demo.html → recipe(示例页)
333
+ // 其余 → example(单文件示例)
334
+ function classifyAsset(layer, name, inContract, files) {
335
+ if (inContract[name]) return 'component';
336
+ if (layer === '09-assets') return 'adapter';
337
+ if (files.some(function (f) { return /\.css$/.test(f); })) return 'component';
338
+ if (files.indexOf('demo.html') >= 0) return 'recipe';
339
+ return 'example';
340
+ }
341
+
342
+ function collectAssets() {
343
+ var doc = readJSON(path.join(AI, 'components.json'));
344
+ var inContract = {};
345
+ var purposeOf = {};
346
+ doc.components.forEach(function (c) {
347
+ inContract[c.id] = true;
348
+ purposeOf[c.id] = c.purpose || '';
349
+ });
350
+
351
+ var rows = [];
352
+ ASSET_LAYERS.forEach(function (layer) {
353
+ var abs = path.join(ROOT, layer);
354
+ if (!fs.existsSync(abs)) return;
355
+ fs.readdirSync(abs).sort().forEach(function (n) {
356
+ // 下划线/点开头是临时目录与隐藏目录,不是资产(扫描口径,不是白名单)
357
+ if (n.charAt(0) === '_' || n.charAt(0) === '.') return;
358
+ var p = path.join(abs, n);
359
+ if (!fs.statSync(p).isDirectory()) return;
360
+ var files = fs.readdirSync(p);
361
+ rows.push({
362
+ id: n, layer: layer, type: classifyAsset(layer, n, inContract, files),
363
+ demo: files.indexOf('demo.html') >= 0, contract: !!inContract[n],
364
+ desc: describeAsset(layer, n, purposeOf[n])
365
+ });
366
+ });
367
+ });
368
+
369
+ // 01-tokens 层:同样靠扫描,不写死名字。
370
+ // behavior/ 目录 → behavior;*.css → base;*.js → behavior;*.html 是 demo,跳过
371
+ var tk = path.join(ROOT, '01-tokens');
372
+ if (fs.existsSync(tk)) {
373
+ fs.readdirSync(tk).sort().forEach(function (n) {
374
+ if (n.charAt(0) === '_' || n.charAt(0) === '.') return;
375
+ var p = path.join(tk, n);
376
+ var st = fs.statSync(p);
377
+ if (st.isDirectory()) {
378
+ rows.push({ id: n, layer: '01-tokens', type: 'behavior', demo: false,
379
+ contract: false, desc: describeAsset('01-tokens', n, '') });
380
+ return;
381
+ }
382
+ if (/\.html$/.test(n)) return;
383
+ var t = /\.css$/.test(n) ? 'base' : /\.js$/.test(n) ? 'behavior' : null;
384
+ if (!t) return;
385
+ rows.push({ id: n, layer: '01-tokens', type: t, demo: false, contract: false,
386
+ desc: readFirstUsefulLine(p) });
387
+ });
388
+ }
389
+ return rows;
390
+ }
391
+
392
+ function cmdAssets(args) {
393
+ var rows = collectAssets();
394
+ if (flag('json', false)) { out(rows); process.exit(0); }
395
+ var miss = rows.filter(function (r) { return !r.contract; });
396
+ process.stdout.write(' === 全部资产(' + rows.length + ' 项)===\n');
397
+ process.stdout.write(' 契约内 ' + (rows.length - miss.length) + ' 项 · 契约外 ' + miss.length + ' 项\n\n');
398
+ rows.forEach(function (r) {
399
+ process.stdout.write(' ' + (r.contract ? '✅' : '○') + ' ' + pad(r.id, 22) +
400
+ '[' + r.type + ']' + (r.demo ? ' demo' : ' ') + ' ' + r.desc + '\n');
401
+ });
402
+ process.stdout.write('\n ✅ 在组件契约内(可 ai components 查详情) ○ 契约外(需看本节)\n');
403
+ process.exit(0);
404
+ }
405
+
259
406
  function cmdTokens(args) {
260
407
  var doc = readJSON(path.join(AI, 'tokens.json'));
261
408
  var set = flag('set', null);
@@ -351,6 +498,7 @@ var CMDS = {
351
498
  diff: cmdDiff,
352
499
  patch: cmdPatch,
353
500
  components: cmdComponents,
501
+ assets: cmdAssets,
354
502
  tokens: cmdTokens,
355
503
  tree: cmdTree,
356
504
  profile: cmdProfile,
@@ -367,6 +515,7 @@ function main() {
367
515
  ' ai diff <改动前.json> <改动后.json> 按语义 id 比对\n' +
368
516
  ' ai patch <doc.json> <patch.json> [-o out.json]\n' +
369
517
  ' ai components [--maturity=stable|beta|alpha]\n' +
518
+ ' ai assets [--json] 组件之外的资产:布局 / 微行为核 / 示例页 / 适配器\n' +
370
519
  ' ai tokens [--set=light|dark]\n' +
371
520
  ' ai tree [--set=light|dark] [--cat=color]\n' +
372
521
  ' ai profile 列出三档及其差异\n' +
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "generatedBy": "05-audit/gen-ai-contract.py",
4
- "libraryVersion": "0.11.16",
4
+ "libraryVersion": "0.13.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 下的专属门禁 ⇒ 还没被机器验证过,不要用",
8
8
  "beta": "有 demo + 专属门禁,但**下面至少有一条没过**:① 状态仍用 .is-* class 表达(违反 INVARIANT I-8);② 该收编到微行为核的行为还是**手写副本**(manual)或**根本没做**(gap) ⇒ 改一处不会全库跟着变(I-14 的病)",
9
9
  "stable": "以上四条全过:有 demo + 专属门禁 + 状态全在 data-* 属性上 + 行为零欠账",
10
10
  "$note": "成熟度是【计算出来的】,不是拍的。手写把某个组件改成 stable 而它还有 manual / gap ⇒ 门禁会红。",
11
- "$whyFourth": "🔴 为什么第四条判据不能省:用前三条时多数组件会**全是 stable** ⇒ ladder 没有任何鉴别力(对标 Primer 六档阶梯,每档都有硬判据)。补上「行为欠账」这一条后:**stable 31 / beta 4**(本行由生成器算出,不要手改)。",
11
+ "$whyFourth": "🔴 为什么第四条判据不能省:用前三条时多数组件会**全是 stable** ⇒ ladder 没有任何鉴别力(对标 Primer 六档阶梯,每档都有硬判据)。补上「行为欠账」这一条后:**stable 33 / beta 4**(本行由生成器算出,不要手改)。",
12
12
  "$strictImpact": "⚠️ strict 档位只放行 stable ⇒ 4 个组件在 strict 下不可用:accordion / drawer / dropdown / overlay。放宽 strict 会让「未收编的手写行为」进入生产路径。(本行由生成器算出,不要手改)"
13
13
  },
14
14
  "summary": {
15
- "total": 35,
15
+ "total": 37,
16
16
  "byMaturity": {
17
- "stable": 31,
17
+ "stable": 33,
18
18
  "beta": 4
19
19
  },
20
20
  "byTier": {
21
- "primitive": 13,
21
+ "primitive": 15,
22
22
  "pattern": 14,
23
23
  "recipe": 4,
24
24
  "asset": 4
@@ -1353,6 +1353,49 @@
1353
1353
  "globalAlso": [],
1354
1354
  "behaviorRef": "API.md#date-range"
1355
1355
  },
1356
+ {
1357
+ "id": "delta",
1358
+ "tier": "primitive",
1359
+ "purpose": "变化量:涨跌方向 + 符号 + 颜色。只描述往哪边变,不判断好坏(等于好恶是 badge 的事,会计正负是 table 的事)",
1360
+ "rootClass": "delta",
1361
+ "maturity": "stable",
1362
+ "maturityReasons": {
1363
+ "hasDemo": true,
1364
+ "hasDedicatedGate": true,
1365
+ "statesOnDomAttributes": true,
1366
+ "behaviorDebt": []
1367
+ },
1368
+ "gates": [
1369
+ "delta-check.js"
1370
+ ],
1371
+ "files": {
1372
+ "css": "02-primitives/delta/delta.css",
1373
+ "js": null,
1374
+ "jsAlso": [],
1375
+ "demo": "02-primitives/delta/demo.html"
1376
+ },
1377
+ "slots": [],
1378
+ "variants": [
1379
+ "delta--arrow",
1380
+ "delta--down",
1381
+ "delta--flat",
1382
+ "delta--sm",
1383
+ "delta--up"
1384
+ ],
1385
+ "states": {
1386
+ "enum": {},
1387
+ "boolean": [],
1388
+ "legacyClass": []
1389
+ },
1390
+ "aria": {
1391
+ "roles": [],
1392
+ "attrs": []
1393
+ },
1394
+ "usesOtherNamespaces": [],
1395
+ "global": null,
1396
+ "globalAlso": [],
1397
+ "behaviorRef": "API.md#delta"
1398
+ },
1356
1399
  {
1357
1400
  "id": "input",
1358
1401
  "tier": "primitive",
@@ -1410,6 +1453,54 @@
1410
1453
  "globalAlso": [],
1411
1454
  "behaviorRef": "API.md#input"
1412
1455
  },
1456
+ {
1457
+ "id": "metric",
1458
+ "tier": "primitive",
1459
+ "purpose": "指标块:一个标签 + 一个值 + 一句上下文。数字等宽、单位分离、缺数是一等状态",
1460
+ "rootClass": "metric",
1461
+ "maturity": "stable",
1462
+ "maturityReasons": {
1463
+ "hasDemo": true,
1464
+ "hasDedicatedGate": true,
1465
+ "statesOnDomAttributes": true,
1466
+ "behaviorDebt": []
1467
+ },
1468
+ "gates": [
1469
+ "metric-check.js"
1470
+ ],
1471
+ "files": {
1472
+ "css": "02-primitives/metric/metric.css",
1473
+ "js": null,
1474
+ "jsAlso": [],
1475
+ "demo": "02-primitives/metric/demo.html"
1476
+ },
1477
+ "slots": [
1478
+ "metric__foot",
1479
+ "metric__label",
1480
+ "metric__note",
1481
+ "metric__spark",
1482
+ "metric__unit",
1483
+ "metric__value"
1484
+ ],
1485
+ "variants": [
1486
+ "metric--lg",
1487
+ "metric--null",
1488
+ "metric--sm"
1489
+ ],
1490
+ "states": {
1491
+ "enum": {},
1492
+ "boolean": [],
1493
+ "legacyClass": []
1494
+ },
1495
+ "aria": {
1496
+ "roles": [],
1497
+ "attrs": []
1498
+ },
1499
+ "usesOtherNamespaces": [],
1500
+ "global": null,
1501
+ "globalAlso": [],
1502
+ "behaviorRef": "API.md#metric"
1503
+ },
1413
1504
  {
1414
1505
  "id": "popover",
1415
1506
  "tier": "primitive",
@@ -58,6 +58,10 @@
58
58
  "rootClass": "drange",
59
59
  "purpose": "日期区间选择,含预设快捷范围"
60
60
  },
61
+ "delta": {
62
+ "rootClass": "delta",
63
+ "purpose": "变化量:涨跌方向 + 符号 + 颜色。只描述往哪边变,不判断好坏(等于好恶是 badge 的事,会计正负是 table 的事)"
64
+ },
61
65
  "drawer": {
62
66
  "rootClass": "drawer",
63
67
  "purpose": "侧边抽屉,含遮罩"
@@ -83,6 +87,10 @@
83
87
  "tier": "asset",
84
88
  "purpose": "3D 模型查看器:令牌驱动样式,不含渲染库本体"
85
89
  },
90
+ "metric": {
91
+ "rootClass": "metric",
92
+ "purpose": "指标块:一个标签 + 一个值 + 一句上下文。数字等宽、单位分离、缺数是一等状态"
93
+ },
86
94
  "nav": {
87
95
  "rootClass": "nav",
88
96
  "purpose": "顶部导航与目录"
@@ -14,6 +14,7 @@
14
14
  "--border": { "audience": "public", "why": "描边三档:控件 / 装饰 / 强装饰" },
15
15
  "--bp-": { "audience": "reference", "why": "断点:CSS media query 条件里用不了 var(),只能当锚点给流体计算和脚本查询" },
16
16
  "--danger": { "audience": "public", "why": "危险色(--danger / -hover / -bg)" },
17
+ "--dir-": { "audience": "public", "why": "涨跌方向色(--dir-up / -down)。**方向 ≠ 好恶**:--danger/--success 是评价(错了/成了),方向是事实(涨了/跌了)。同一件事会同时成立而结论相反 —— 「研发费用同比 +38%」是涨,但那是坏消息。默认 A 股口径红涨绿跌,`[data-market=\"intl\"]` 整体对调" },
17
18
  "--dur-": { "audience": "public", "why": "时长阶梯:快 / 基准 / 慢" },
18
19
  "--ease-": { "audience": "public", "why": "缓动阶梯:默认 / 进出 / 滑入" },
19
20
  "--fs-": { "audience": "public", "why": "字号阶梯:阶梯允许有暂未使用的档位(那是阶梯,不是死代码)" },
@@ -49,7 +50,7 @@
49
50
  "tokens": {},
50
51
 
51
52
  "budget": {
52
- "orphan": 4,
53
- "$comment": "棘轮:孤儿令牌总数只能降。降了就把这个数字一起改小,不许偷偷升。2026-10-10:--lh-loose / --fs-xl 被新增 recipe 引用,7→5;同日 04-recipes/report 改在自身层内重定义边注宽 ⇒ --measure-aside 由『被引用』回到『无引用』,5→5→再核为 4。"
53
+ "orphan": 3,
54
+ "$comment": "棘轮:孤儿令牌总数只能降。降了就把这个数字一起改小,不许偷偷升。2026-10-10:--lh-loose / --fs-xl 被新增 recipe 引用,7→5;同日 04-recipes/report 改在自身层内重定义边注宽 ⇒ --measure-aside 由『被引用』回到『无引用』,5→5→再核为 4。2026-10-29:metric 引用 --tracking-normal ⇒ 4→3。"
54
55
  }
55
56
  }
package/ai/tokens.json CHANGED
@@ -224,6 +224,16 @@
224
224
  "$value": "#e8f1f8",
225
225
  "$type": "color"
226
226
  },
227
+ "--dir-up": {
228
+ "$value": "#c0392b",
229
+ "$type": "color",
230
+ "$description": "---------------------------------------------------------------- 方向色"
231
+ },
232
+ "--dir-down": {
233
+ "$value": "#2f6b3a",
234
+ "$type": "color",
235
+ "$description": "涨:默认红"
236
+ },
227
237
  "--accent": {
228
238
  "$value": "#1b4d8f",
229
239
  "$type": "color",
@@ -621,6 +631,15 @@
621
631
  "$value": "#16241A",
622
632
  "$type": "color"
623
633
  },
634
+ "--dir-up": {
635
+ "$value": "#E07A6E",
636
+ "$type": "color",
637
+ "$description": "方向色(暗色):与 success / danger 同值,理由见浅色段。"
638
+ },
639
+ "--dir-down": {
640
+ "$value": "#6FAA7A",
641
+ "$type": "color"
642
+ },
624
643
  "--warning": {
625
644
  "$value": "#C99A3F",
626
645
  "$type": "color"
@@ -676,8 +695,8 @@
676
695
  }
677
696
  },
678
697
  "coverage": {
679
- "lightCount": 110,
680
- "darkCount": 33,
698
+ "lightCount": 112,
699
+ "darkCount": 35,
681
700
  "onlyInDark": [],
682
701
  "onlyInLight": [
683
702
  "--bp-lg",
@@ -42,6 +42,14 @@
42
42
  "value": "#8f1e17",
43
43
  "type": "color"
44
44
  },
45
+ "dir-down": {
46
+ "value": "#2f6b3a",
47
+ "type": "color"
48
+ },
49
+ "dir-up": {
50
+ "value": "#c0392b",
51
+ "type": "color"
52
+ },
45
53
  "info": {
46
54
  "value": "#1d5f8a",
47
55
  "type": "color"
@@ -516,6 +524,14 @@
516
524
  "value": "#F09A90",
517
525
  "type": "color"
518
526
  },
527
+ "dir-down": {
528
+ "value": "#6FAA7A",
529
+ "type": "color"
530
+ },
531
+ "dir-up": {
532
+ "value": "#E07A6E",
533
+ "type": "color"
534
+ },
519
535
  "info": {
520
536
  "value": "#5B9BC4",
521
537
  "type": "color"
@@ -629,6 +645,8 @@
629
645
  "--danger": "color/danger",
630
646
  "--danger-bg": "color/danger-bg",
631
647
  "--danger-hover": "color/danger-hover",
648
+ "--dir-down": "color/dir-down",
649
+ "--dir-up": "color/dir-up",
632
650
  "--dur-base": "duration/base",
633
651
  "--dur-fast": "duration/fast",
634
652
  "--dur-slow": "duration/slow",
@@ -728,8 +746,8 @@
728
746
  "--z-toast": "zIndex/toast"
729
747
  },
730
748
  "meta": {
731
- "lightCount": 110,
732
- "darkCount": 33,
749
+ "lightCount": 112,
750
+ "darkCount": 35,
733
751
  "categories": [
734
752
  "breakpoint",
735
753
  "color",
@@ -0,0 +1 @@
1
+ :root[data-market="intl"], [data-market="intl"] {--dir-up:var(--raw-dir-down);--dir-down:var(--raw-dir-up);}
@@ -1 +1 @@
1
- :root {--raw-paper:#f6f7f8;--raw-surface:#ffffff;--raw-surface-sunken:#f1f3f5;--raw-surface-raised:#ffffff;--raw-scrollbar-thumb:#7A808A;--raw-scrollbar-thumb-hov:#6E747E;--raw-text-primary:#15181c;--raw-text-secondary:#4f555e;--raw-text-tertiary:#606770;--raw-text-on-accent:#ffffff;--raw-text-on-solid:#ffffff;--raw-skeleton-bg:#e9ecef;--raw-skeleton-shimmer:rgba(255, 255, 255, 0.72);--raw-border-control:#868b94;--raw-border-decor:#e2e5e9;--raw-border-decor-str:#c8cdd4;--raw-danger:#c0392b;--raw-danger-hover:#8f1e17;--raw-scrim:rgba(21, 24, 28, 0.4);--raw-success:#2f6b3a;--raw-warning:#8a5a00;--raw-info:#1d5f8a;--raw-danger-bg:#fdeeec;--raw-success-bg:#eaf2e6;--raw-warning-bg:#fbf1dd;--raw-info-bg:#e8f1f8;--raw-accent:#1b4d8f;--raw-switch-on:#1b4d8f;--raw-accent-hover:#163a6d;--raw-accent-soft:#e6eef7;--raw-tooltip-bg:#15181c;--raw-tooltip-fg:#f6f7f8;--raw-tooltip-border:#15181c;--paper:var(--raw-paper);--surface:var(--raw-surface);--surface-sunken:var(--raw-surface-sunken);--surface-raised:var(--raw-surface-raised);--scrollbar-size:10px;--scrollbar-size-thin:6px;--scrollbar-thumb:var(--raw-scrollbar-thumb);--scrollbar-thumb-hov:var(--raw-scrollbar-thumb-hov);--scrollbar-radius:5px;--text-primary:var(--raw-text-primary);--text-secondary:var(--raw-text-secondary);--text-tertiary:var(--raw-text-tertiary);--text-on-accent:var(--raw-text-on-accent);--text-on-solid:var(--raw-text-on-solid);--skeleton-bg:var(--raw-skeleton-bg);--skeleton-shimmer:var(--raw-skeleton-shimmer);--skeleton-h:1em;--skeleton-size:40px;--skeleton-duration:1.4s;--ease-out:cubic-bezier(0.23, 1, 0.32, 1);--progress-h:6px;--progress-dur:240ms;--r-full:999px;--ring-size:64px;--ring-thickness:8px;--progress:0%;--progress-num:0;--z-popover:60;--popover-min-w:200px;--popover-max-w:320px;--popover-p:var(--sp-3);--popover-gap:8px;--popover-dur:140ms;--border-control:var(--raw-border-control);--border-decor:var(--raw-border-decor);--border-decor-str:var(--raw-border-decor-str);--danger:var(--raw-danger);--danger-hover:var(--raw-danger-hover);--scrim:var(--raw-scrim);--success:var(--raw-success);--warning:var(--raw-warning);--info:var(--raw-info);--danger-bg:var(--raw-danger-bg);--success-bg:var(--raw-success-bg);--warning-bg:var(--raw-warning-bg);--info-bg:var(--raw-info-bg);--accent:var(--raw-accent);--switch-on:var(--raw-switch-on);--accent-hover:var(--raw-accent-hover);--accent-soft:var(--raw-accent-soft);--tooltip-bg:var(--raw-tooltip-bg);--tooltip-fg:var(--raw-tooltip-fg);--tooltip-border:var(--raw-tooltip-border);--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:clamp(1rem, 0.95rem + 0.3vw, 1.25rem);--sp-5:clamp(1.25rem, 1.15rem + 0.7vw, 1.75rem);--sp-6:clamp(1.5rem, 1.3rem + 1.2vw, 2.25rem);--sp-7:clamp(2rem, 1.7rem + 1.8vw, 3.5rem);--sp-8:clamp(2.5rem, 2.1rem + 2.4vw, 4.5rem);--bp-sm:30rem;--bp-md:48rem;--bp-lg:64rem;--bp-xl:80rem;--fs-xs:0.75rem;--fs-sm:0.875rem;--fs-base:clamp(1rem, 0.95rem + 0.3vw, 1.125rem);--fs-md:clamp(1.125rem, 1.05rem + 0.5vw, 1.3125rem);--fs-lg:clamp(1.3125rem, 1.2rem + 0.7vw, 1.5rem);--fs-xl:clamp(1.5rem, 1.3rem + 1.2vw, 1.875rem);--fs-2xl:clamp(1.75rem, 1.45rem + 1.8vw, 2.5rem);--lh-tight:1.25;--lh-base:1.7;--lh-loose:1.85;--measure-page:52rem;--tracking-title:-0.02em;--r-sm:6px;--r-xs:3px;--r-md:10px;--r-lg:14px;--r-pill:999px;--shadow-1:0 1px 2px rgba(31, 29, 25, 0.05), 0 1px 3px rgba(31, 29, 25, 0.06);--shadow-2:0 2px 4px rgba(31, 29, 25, 0.05), 0 6px 16px rgba(31, 29, 25, 0.08);--dur-fast:120ms;--dur-base:180ms;--dur-slow:280ms;--ease-out:cubic-bezier(0.23, 1, 0.32, 1);--ease-in-out:cubic-bezier(0.77, 0, 0.175, 1);--ease-drawer:cubic-bezier(0.32, 0.72, 0, 1);--lift-sm:1px;--lift-md:2px;--lift-lg:8px;--z-base:0;--z-sticky:10;--z-header:20;--z-raised:5;--z-overlay:30;--z-modal:40;--z-toast:50;--sz-touch:44px;--sz-touch-sm:32px;}@media (prefers-reduced-motion:reduce) {*, *::before, *::after {animation-duration:0.01ms !important;animation-iteration-count:1 !important;transition-duration:0.01ms !important;scroll-behavior:auto !important;}}:focus-visible {outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--r-sm);}:root {--measure-prose:34em;--measure-title:20em;--measure-lede:32em;--measure-pull:30em;--measure-aside:32em;}:root:lang(en), :root:lang(en-US), :root:lang(en-GB), :root:lang(fr), :root:lang(de), :root:lang(es), :root:lang(pt), :root:lang(ru), :root:lang(el), :root:lang(tr), :root:lang(vi) {--measure-prose:68ch;--measure-title:34ch;--measure-lede:62ch;--measure-pull:58ch;--measure-aside:56ch;}:root:lang(ar) {--measure-prose:60ch;--measure-title:30ch;--measure-lede:56ch;--measure-pull:52ch;--measure-aside:50ch;}:root:lang(hi), :root:lang(th), :root:lang(km), :root:lang(my) {--measure-prose:56ch;--measure-title:28ch;--measure-lede:52ch;--measure-pull:48ch;--measure-aside:46ch;}:root:lang(zh), :root:lang(zh-CN), :root:lang(zh-TW), :root:lang(ja), :root:lang(ko) {--measure-prose:34em;--measure-title:20em;--measure-lede:32em;--measure-pull:30em;--measure-aside:32em;}@media (prefers-color-scheme:dark) {:root:not([data-theme="light"]) {--raw-paper:#14171A;--raw-surface:#1C2024;--raw-surface-raised:#232830;--raw-surface-sunken:#1A1D21;--raw-scrollbar-thumb:#6E747E;--raw-scrollbar-thumb-hov:#7D828A;--raw-border-decor:#2A3038;--raw-border-decor-str:#3A424C;--raw-border-control:#8A9099;--raw-text-primary:#E4E7EA;--raw-text-secondary:#AEB6C0;--raw-text-tertiary:#9BA3AD;--raw-text-on-accent:#0D1114;--raw-text-on-solid:#0D1114;--raw-skeleton-bg:#2E343C;--raw-skeleton-shimmer:rgba(255, 255, 255, 0.06);--raw-danger:#E07A6E;--raw-danger-hover:#F09A90;--raw-danger-bg:#341D1A;--raw-success:#6FAA7A;--raw-success-bg:#16241A;--raw-warning:#C99A3F;--raw-warning-bg:#242A31;--raw-info:#5B9BC4;--raw-info-bg:#13242F;--raw-accent:#7AA9DE;--raw-switch-on:#3E6EA8;--raw-accent-hover:#8FB8E6;--raw-accent-soft:#1C2C3D;--raw-tooltip-bg:#232830;--raw-tooltip-fg:#E4E7EA;--raw-tooltip-border:#2A3038;--raw-scrim:rgba(0, 0, 0, 0.62);}}[data-theme="light"] {--raw-accent:#1b4d8f;--raw-accent-hover:#163a6d;--raw-accent-soft:#e6eef7;--raw-border-control:#868b94;--raw-border-decor:#e2e5e9;--raw-border-decor-str:#c8cdd4;--raw-danger:#c0392b;--raw-danger-bg:#fdeeec;--raw-danger-hover:#8f1e17;--raw-info:#1d5f8a;--raw-info-bg:#e8f1f8;--raw-paper:#f6f7f8;--raw-scrim:rgba(21, 24, 28, 0.4);--raw-scrollbar-thumb:#7A808A;--raw-scrollbar-thumb-hov:#6E747E;--raw-skeleton-bg:#e9ecef;--raw-skeleton-shimmer:rgba(255, 255, 255, 0.72);--raw-success:#2f6b3a;--raw-success-bg:#eaf2e6;--raw-surface:#ffffff;--raw-surface-raised:#ffffff;--raw-surface-sunken:#f1f3f5;--raw-switch-on:#1b4d8f;--raw-text-on-accent:#ffffff;--raw-text-on-solid:#ffffff;--raw-text-primary:#15181c;--raw-text-secondary:#4f555e;--raw-text-tertiary:#606770;--raw-tooltip-bg:#15181c;--raw-tooltip-border:#15181c;--raw-tooltip-fg:#f6f7f8;--raw-warning:#8a5a00;--raw-warning-bg:#fbf1dd;--accent:var(--raw-accent);--accent-hover:var(--raw-accent-hover);--accent-soft:var(--raw-accent-soft);--border-control:var(--raw-border-control);--border-decor:var(--raw-border-decor);--border-decor-str:var(--raw-border-decor-str);--danger:var(--raw-danger);--danger-bg:var(--raw-danger-bg);--danger-hover:var(--raw-danger-hover);--info:var(--raw-info);--info-bg:var(--raw-info-bg);--paper:var(--raw-paper);--scrim:var(--raw-scrim);--scrollbar-thumb:var(--raw-scrollbar-thumb);--scrollbar-thumb-hov:var(--raw-scrollbar-thumb-hov);--skeleton-bg:var(--raw-skeleton-bg);--skeleton-shimmer:var(--raw-skeleton-shimmer);--success:var(--raw-success);--success-bg:var(--raw-success-bg);--surface:var(--raw-surface);--surface-raised:var(--raw-surface-raised);--surface-sunken:var(--raw-surface-sunken);--switch-on:var(--raw-switch-on);--text-on-accent:var(--raw-text-on-accent);--text-on-solid:var(--raw-text-on-solid);--text-primary:var(--raw-text-primary);--text-secondary:var(--raw-text-secondary);--text-tertiary:var(--raw-text-tertiary);--tooltip-bg:var(--raw-tooltip-bg);--tooltip-border:var(--raw-tooltip-border);--tooltip-fg:var(--raw-tooltip-fg);--warning:var(--raw-warning);--warning-bg:var(--raw-warning-bg);}:root[data-theme="dark"], [data-theme="dark"] {--raw-accent:#7AA9DE;--raw-accent-hover:#8FB8E6;--raw-accent-soft:#1C2C3D;--raw-border-control:#8A9099;--raw-border-decor:#2A3038;--raw-border-decor-str:#3A424C;--raw-danger:#E07A6E;--raw-danger-bg:#341D1A;--raw-danger-hover:#F09A90;--raw-info:#5B9BC4;--raw-info-bg:#13242F;--raw-paper:#14171A;--raw-scrim:rgba(0, 0, 0, 0.62);--raw-scrollbar-thumb:#6E747E;--raw-scrollbar-thumb-hov:#7D828A;--raw-skeleton-bg:#2E343C;--raw-skeleton-shimmer:rgba(255, 255, 255, 0.06);--raw-success:#6FAA7A;--raw-success-bg:#16241A;--raw-surface:#1C2024;--raw-surface-raised:#232830;--raw-surface-sunken:#1A1D21;--raw-switch-on:#3E6EA8;--raw-text-on-accent:#0D1114;--raw-text-on-solid:#0D1114;--raw-text-primary:#E4E7EA;--raw-text-secondary:#AEB6C0;--raw-text-tertiary:#9BA3AD;--raw-tooltip-bg:#232830;--raw-tooltip-border:#2A3038;--raw-tooltip-fg:#E4E7EA;--raw-warning:#C99A3F;--raw-warning-bg:#242A31;--accent:var(--raw-accent);--accent-hover:var(--raw-accent-hover);--accent-soft:var(--raw-accent-soft);--border-control:var(--raw-border-control);--border-decor:var(--raw-border-decor);--border-decor-str:var(--raw-border-decor-str);--danger:var(--raw-danger);--danger-bg:var(--raw-danger-bg);--danger-hover:var(--raw-danger-hover);--info:var(--raw-info);--info-bg:var(--raw-info-bg);--paper:var(--raw-paper);--scrim:var(--raw-scrim);--scrollbar-thumb:var(--raw-scrollbar-thumb);--scrollbar-thumb-hov:var(--raw-scrollbar-thumb-hov);--skeleton-bg:var(--raw-skeleton-bg);--skeleton-shimmer:var(--raw-skeleton-shimmer);--success:var(--raw-success);--success-bg:var(--raw-success-bg);--surface:var(--raw-surface);--surface-raised:var(--raw-surface-raised);--surface-sunken:var(--raw-surface-sunken);--switch-on:var(--raw-switch-on);--text-on-accent:var(--raw-text-on-accent);--text-on-solid:var(--raw-text-on-solid);--text-primary:var(--raw-text-primary);--text-secondary:var(--raw-text-secondary);--text-tertiary:var(--raw-text-tertiary);--tooltip-bg:var(--raw-tooltip-bg);--tooltip-border:var(--raw-tooltip-border);--tooltip-fg:var(--raw-tooltip-fg);--warning:var(--raw-warning);--warning-bg:var(--raw-warning-bg);}:root {--sans:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'Geeza Pro', 'Segoe UI Historic', sans-serif;--mono:ui-monospace, 'SF Mono', 'Cascadia Mono', 'Segoe UI Mono', 'Roboto Mono', Menlo, Consolas, 'Sarasa Mono SC', 'Microsoft YaHei Mono', monospace;--serif:'Iowan Old Style', 'Palatino Linotype', Palatino, Georgia, 'Songti SC', 'SimSun', 'Noto Serif CJK SC', 'Source Han Serif SC', serif;--tracking-normal:0;}:root:lang(ar), :root:lang(fa), :root:lang(he), :root:lang(ur) {--tracking-normal:0.01em;}a, button, label, summary, input[type="checkbox"], input[type="radio"], input[type="button"], input[type="submit"], [role="button"], [role="switch"], [role="tab"], [role="option"], .choice, .switch, .btn, .accordion__trigger, .tabs__tab, .card, .list__row {-webkit-tap-highlight-color:transparent;}.choice:active, .switch:active, .btn:active, .list__row:active, .card:active {opacity:0.82;}@media (hover:hover) and (pointer:fine) {.choice:active, .switch:active, .btn:active, .list__row:active, .card:active {opacity:1;}}
1
+ :root {--raw-paper:#f6f7f8;--raw-surface:#ffffff;--raw-surface-sunken:#f1f3f5;--raw-surface-raised:#ffffff;--raw-scrollbar-thumb:#7A808A;--raw-scrollbar-thumb-hov:#6E747E;--raw-text-primary:#15181c;--raw-text-secondary:#4f555e;--raw-text-tertiary:#606770;--raw-text-on-accent:#ffffff;--raw-text-on-solid:#ffffff;--raw-skeleton-bg:#e9ecef;--raw-skeleton-shimmer:rgba(255, 255, 255, 0.72);--raw-border-control:#868b94;--raw-border-decor:#e2e5e9;--raw-border-decor-str:#c8cdd4;--raw-danger:#c0392b;--raw-danger-hover:#8f1e17;--raw-scrim:rgba(21, 24, 28, 0.4);--raw-success:#2f6b3a;--raw-warning:#8a5a00;--raw-info:#1d5f8a;--raw-danger-bg:#fdeeec;--raw-success-bg:#eaf2e6;--raw-warning-bg:#fbf1dd;--raw-info-bg:#e8f1f8;--raw-dir-up:#c0392b;--raw-dir-down:#2f6b3a;--raw-accent:#1b4d8f;--raw-switch-on:#1b4d8f;--raw-accent-hover:#163a6d;--raw-accent-soft:#e6eef7;--raw-tooltip-bg:#15181c;--raw-tooltip-fg:#f6f7f8;--raw-tooltip-border:#15181c;--paper:var(--raw-paper);--surface:var(--raw-surface);--surface-sunken:var(--raw-surface-sunken);--surface-raised:var(--raw-surface-raised);--scrollbar-size:10px;--scrollbar-size-thin:6px;--scrollbar-thumb:var(--raw-scrollbar-thumb);--scrollbar-thumb-hov:var(--raw-scrollbar-thumb-hov);--scrollbar-radius:5px;--text-primary:var(--raw-text-primary);--text-secondary:var(--raw-text-secondary);--text-tertiary:var(--raw-text-tertiary);--text-on-accent:var(--raw-text-on-accent);--text-on-solid:var(--raw-text-on-solid);--skeleton-bg:var(--raw-skeleton-bg);--skeleton-shimmer:var(--raw-skeleton-shimmer);--skeleton-h:1em;--skeleton-size:40px;--skeleton-duration:1.4s;--ease-out:cubic-bezier(0.23, 1, 0.32, 1);--progress-h:6px;--progress-dur:240ms;--r-full:999px;--ring-size:64px;--ring-thickness:8px;--progress:0%;--progress-num:0;--z-popover:60;--popover-min-w:200px;--popover-max-w:320px;--popover-p:var(--sp-3);--popover-gap:8px;--popover-dur:140ms;--border-control:var(--raw-border-control);--border-decor:var(--raw-border-decor);--border-decor-str:var(--raw-border-decor-str);--danger:var(--raw-danger);--danger-hover:var(--raw-danger-hover);--scrim:var(--raw-scrim);--success:var(--raw-success);--warning:var(--raw-warning);--info:var(--raw-info);--danger-bg:var(--raw-danger-bg);--success-bg:var(--raw-success-bg);--warning-bg:var(--raw-warning-bg);--info-bg:var(--raw-info-bg);--dir-up:var(--raw-dir-up);--dir-down:var(--raw-dir-down);--accent:var(--raw-accent);--switch-on:var(--raw-switch-on);--accent-hover:var(--raw-accent-hover);--accent-soft:var(--raw-accent-soft);--tooltip-bg:var(--raw-tooltip-bg);--tooltip-fg:var(--raw-tooltip-fg);--tooltip-border:var(--raw-tooltip-border);--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:clamp(1rem, 0.95rem + 0.3vw, 1.25rem);--sp-5:clamp(1.25rem, 1.15rem + 0.7vw, 1.75rem);--sp-6:clamp(1.5rem, 1.3rem + 1.2vw, 2.25rem);--sp-7:clamp(2rem, 1.7rem + 1.8vw, 3.5rem);--sp-8:clamp(2.5rem, 2.1rem + 2.4vw, 4.5rem);--bp-sm:30rem;--bp-md:48rem;--bp-lg:64rem;--bp-xl:80rem;--fs-xs:0.75rem;--fs-sm:0.875rem;--fs-base:clamp(1rem, 0.95rem + 0.3vw, 1.125rem);--fs-md:clamp(1.125rem, 1.05rem + 0.5vw, 1.3125rem);--fs-lg:clamp(1.3125rem, 1.2rem + 0.7vw, 1.5rem);--fs-xl:clamp(1.5rem, 1.3rem + 1.2vw, 1.875rem);--fs-2xl:clamp(1.75rem, 1.45rem + 1.8vw, 2.5rem);--lh-tight:1.25;--lh-base:1.7;--lh-loose:1.85;--measure-page:52rem;--tracking-title:-0.02em;--r-sm:6px;--r-xs:3px;--r-md:10px;--r-lg:14px;--r-pill:999px;--shadow-1:0 1px 2px rgba(31, 29, 25, 0.05), 0 1px 3px rgba(31, 29, 25, 0.06);--shadow-2:0 2px 4px rgba(31, 29, 25, 0.05), 0 6px 16px rgba(31, 29, 25, 0.08);--dur-fast:120ms;--dur-base:180ms;--dur-slow:280ms;--ease-out:cubic-bezier(0.23, 1, 0.32, 1);--ease-in-out:cubic-bezier(0.77, 0, 0.175, 1);--ease-drawer:cubic-bezier(0.32, 0.72, 0, 1);--lift-sm:1px;--lift-md:2px;--lift-lg:8px;--z-base:0;--z-sticky:10;--z-header:20;--z-raised:5;--z-overlay:30;--z-modal:40;--z-toast:50;--sz-touch:44px;--sz-touch-sm:32px;}@media (prefers-reduced-motion:reduce) {*, *::before, *::after {animation-duration:0.01ms !important;animation-iteration-count:1 !important;transition-duration:0.01ms !important;scroll-behavior:auto !important;}}:focus-visible {outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--r-sm);}:root {--measure-prose:34em;--measure-title:20em;--measure-lede:32em;--measure-pull:30em;--measure-aside:32em;}:root:lang(en), :root:lang(en-US), :root:lang(en-GB), :root:lang(fr), :root:lang(de), :root:lang(es), :root:lang(pt), :root:lang(ru), :root:lang(el), :root:lang(tr), :root:lang(vi) {--measure-prose:68ch;--measure-title:34ch;--measure-lede:62ch;--measure-pull:58ch;--measure-aside:56ch;}:root:lang(ar) {--measure-prose:60ch;--measure-title:30ch;--measure-lede:56ch;--measure-pull:52ch;--measure-aside:50ch;}:root:lang(hi), :root:lang(th), :root:lang(km), :root:lang(my) {--measure-prose:56ch;--measure-title:28ch;--measure-lede:52ch;--measure-pull:48ch;--measure-aside:46ch;}:root:lang(zh), :root:lang(zh-CN), :root:lang(zh-TW), :root:lang(ja), :root:lang(ko) {--measure-prose:34em;--measure-title:20em;--measure-lede:32em;--measure-pull:30em;--measure-aside:32em;}@media (prefers-color-scheme:dark) {:root:not([data-theme="light"]) {--raw-paper:#14171A;--raw-surface:#1C2024;--raw-surface-raised:#232830;--raw-surface-sunken:#1A1D21;--raw-scrollbar-thumb:#6E747E;--raw-scrollbar-thumb-hov:#7D828A;--raw-border-decor:#2A3038;--raw-border-decor-str:#3A424C;--raw-border-control:#8A9099;--raw-text-primary:#E4E7EA;--raw-text-secondary:#AEB6C0;--raw-text-tertiary:#9BA3AD;--raw-text-on-accent:#0D1114;--raw-text-on-solid:#0D1114;--raw-skeleton-bg:#2E343C;--raw-skeleton-shimmer:rgba(255, 255, 255, 0.06);--raw-danger:#E07A6E;--raw-danger-hover:#F09A90;--raw-danger-bg:#341D1A;--raw-success:#6FAA7A;--raw-success-bg:#16241A;--raw-dir-up:#E07A6E;--raw-dir-down:#6FAA7A;--raw-warning:#C99A3F;--raw-warning-bg:#242A31;--raw-info:#5B9BC4;--raw-info-bg:#13242F;--raw-accent:#7AA9DE;--raw-switch-on:#3E6EA8;--raw-accent-hover:#8FB8E6;--raw-accent-soft:#1C2C3D;--raw-tooltip-bg:#232830;--raw-tooltip-fg:#E4E7EA;--raw-tooltip-border:#2A3038;--raw-scrim:rgba(0, 0, 0, 0.62);}}[data-theme="light"] {--raw-accent:#1b4d8f;--raw-accent-hover:#163a6d;--raw-accent-soft:#e6eef7;--raw-border-control:#868b94;--raw-border-decor:#e2e5e9;--raw-border-decor-str:#c8cdd4;--raw-danger:#c0392b;--raw-danger-bg:#fdeeec;--raw-danger-hover:#8f1e17;--raw-dir-down:#2f6b3a;--raw-dir-up:#c0392b;--raw-info:#1d5f8a;--raw-info-bg:#e8f1f8;--raw-paper:#f6f7f8;--raw-scrim:rgba(21, 24, 28, 0.4);--raw-scrollbar-thumb:#7A808A;--raw-scrollbar-thumb-hov:#6E747E;--raw-skeleton-bg:#e9ecef;--raw-skeleton-shimmer:rgba(255, 255, 255, 0.72);--raw-success:#2f6b3a;--raw-success-bg:#eaf2e6;--raw-surface:#ffffff;--raw-surface-raised:#ffffff;--raw-surface-sunken:#f1f3f5;--raw-switch-on:#1b4d8f;--raw-text-on-accent:#ffffff;--raw-text-on-solid:#ffffff;--raw-text-primary:#15181c;--raw-text-secondary:#4f555e;--raw-text-tertiary:#606770;--raw-tooltip-bg:#15181c;--raw-tooltip-border:#15181c;--raw-tooltip-fg:#f6f7f8;--raw-warning:#8a5a00;--raw-warning-bg:#fbf1dd;--accent:var(--raw-accent);--accent-hover:var(--raw-accent-hover);--accent-soft:var(--raw-accent-soft);--border-control:var(--raw-border-control);--border-decor:var(--raw-border-decor);--border-decor-str:var(--raw-border-decor-str);--danger:var(--raw-danger);--danger-bg:var(--raw-danger-bg);--danger-hover:var(--raw-danger-hover);--dir-down:var(--raw-dir-down);--dir-up:var(--raw-dir-up);--info:var(--raw-info);--info-bg:var(--raw-info-bg);--paper:var(--raw-paper);--scrim:var(--raw-scrim);--scrollbar-thumb:var(--raw-scrollbar-thumb);--scrollbar-thumb-hov:var(--raw-scrollbar-thumb-hov);--skeleton-bg:var(--raw-skeleton-bg);--skeleton-shimmer:var(--raw-skeleton-shimmer);--success:var(--raw-success);--success-bg:var(--raw-success-bg);--surface:var(--raw-surface);--surface-raised:var(--raw-surface-raised);--surface-sunken:var(--raw-surface-sunken);--switch-on:var(--raw-switch-on);--text-on-accent:var(--raw-text-on-accent);--text-on-solid:var(--raw-text-on-solid);--text-primary:var(--raw-text-primary);--text-secondary:var(--raw-text-secondary);--text-tertiary:var(--raw-text-tertiary);--tooltip-bg:var(--raw-tooltip-bg);--tooltip-border:var(--raw-tooltip-border);--tooltip-fg:var(--raw-tooltip-fg);--warning:var(--raw-warning);--warning-bg:var(--raw-warning-bg);}:root[data-theme="dark"], [data-theme="dark"] {--raw-accent:#7AA9DE;--raw-accent-hover:#8FB8E6;--raw-accent-soft:#1C2C3D;--raw-border-control:#8A9099;--raw-border-decor:#2A3038;--raw-border-decor-str:#3A424C;--raw-danger:#E07A6E;--raw-danger-bg:#341D1A;--raw-danger-hover:#F09A90;--raw-dir-down:#6FAA7A;--raw-dir-up:#E07A6E;--raw-info:#5B9BC4;--raw-info-bg:#13242F;--raw-paper:#14171A;--raw-scrim:rgba(0, 0, 0, 0.62);--raw-scrollbar-thumb:#6E747E;--raw-scrollbar-thumb-hov:#7D828A;--raw-skeleton-bg:#2E343C;--raw-skeleton-shimmer:rgba(255, 255, 255, 0.06);--raw-success:#6FAA7A;--raw-success-bg:#16241A;--raw-surface:#1C2024;--raw-surface-raised:#232830;--raw-surface-sunken:#1A1D21;--raw-switch-on:#3E6EA8;--raw-text-on-accent:#0D1114;--raw-text-on-solid:#0D1114;--raw-text-primary:#E4E7EA;--raw-text-secondary:#AEB6C0;--raw-text-tertiary:#9BA3AD;--raw-tooltip-bg:#232830;--raw-tooltip-border:#2A3038;--raw-tooltip-fg:#E4E7EA;--raw-warning:#C99A3F;--raw-warning-bg:#242A31;--accent:var(--raw-accent);--accent-hover:var(--raw-accent-hover);--accent-soft:var(--raw-accent-soft);--border-control:var(--raw-border-control);--border-decor:var(--raw-border-decor);--border-decor-str:var(--raw-border-decor-str);--danger:var(--raw-danger);--danger-bg:var(--raw-danger-bg);--danger-hover:var(--raw-danger-hover);--dir-down:var(--raw-dir-down);--dir-up:var(--raw-dir-up);--info:var(--raw-info);--info-bg:var(--raw-info-bg);--paper:var(--raw-paper);--scrim:var(--raw-scrim);--scrollbar-thumb:var(--raw-scrollbar-thumb);--scrollbar-thumb-hov:var(--raw-scrollbar-thumb-hov);--skeleton-bg:var(--raw-skeleton-bg);--skeleton-shimmer:var(--raw-skeleton-shimmer);--success:var(--raw-success);--success-bg:var(--raw-success-bg);--surface:var(--raw-surface);--surface-raised:var(--raw-surface-raised);--surface-sunken:var(--raw-surface-sunken);--switch-on:var(--raw-switch-on);--text-on-accent:var(--raw-text-on-accent);--text-on-solid:var(--raw-text-on-solid);--text-primary:var(--raw-text-primary);--text-secondary:var(--raw-text-secondary);--text-tertiary:var(--raw-text-tertiary);--tooltip-bg:var(--raw-tooltip-bg);--tooltip-border:var(--raw-tooltip-border);--tooltip-fg:var(--raw-tooltip-fg);--warning:var(--raw-warning);--warning-bg:var(--raw-warning-bg);}:root {--sans:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Source Han Sans SC', 'Noto Sans CJK SC', 'Geeza Pro', 'Segoe UI Historic', sans-serif;--mono:ui-monospace, 'SF Mono', 'Cascadia Mono', 'Segoe UI Mono', 'Roboto Mono', Menlo, Consolas, 'Sarasa Mono SC', 'Microsoft YaHei Mono', monospace;--serif:'Iowan Old Style', 'Palatino Linotype', Palatino, Georgia, 'Songti SC', 'SimSun', 'Noto Serif CJK SC', 'Source Han Serif SC', serif;--tracking-normal:0;}:root:lang(ar), :root:lang(fa), :root:lang(he), :root:lang(ur) {--tracking-normal:0.01em;}a, button, label, summary, input[type="checkbox"], input[type="radio"], input[type="button"], input[type="submit"], [role="button"], [role="switch"], [role="tab"], [role="option"], .choice, .switch, .btn, .accordion__trigger, .tabs__tab, .card, .list__row {-webkit-tap-highlight-color:transparent;}.choice:active, .switch:active, .btn:active, .list__row:active, .card:active {opacity:0.82;}@media (hover:hover) and (pointer:fine) {.choice:active, .switch:active, .btn:active, .list__row:active, .card:active {opacity:1;}}
@@ -0,0 +1 @@
1
+ .delta {display:inline-flex;align-items:baseline;gap:0.15em;font-family:var(--mono);white-space:nowrap;font-weight:500;line-height:1.4;}.delta::before {font-weight:400;font-size:0.95em;}.delta--up {color:var(--dir-up);}.delta--up::before {content:"+";}.delta--down {color:var(--dir-down);}.delta--down::before {content:"\2212";}.delta--flat {color:var(--text-secondary);}.delta--flat::before {content:none;}.delta--arrow.delta--up::before {content:"\25B2";font-size:0.8em;}.delta--arrow.delta--down::before {content:"\25BC";font-size:0.8em;}.delta--sm {font-size:var(--fs-xs);font-weight:400;}
@@ -0,0 +1 @@
1
+ .metric {display:flex;flex-direction:column;gap:var(--sp-1);margin:0;min-width:0;}.metric > dd {margin-inline-start:0;}.metric__label {margin:0;font-size:var(--fs-xs);font-weight:500;line-height:1.5;color:var(--text-secondary);letter-spacing:var(--tracking-normal);}.metric__value {margin:0;font-family:var(--mono);font-size:var(--fs-xl);font-weight:600;line-height:var(--lh-tight);color:var(--text-primary);white-space:normal;overflow-wrap:anywhere;display:flex;flex-wrap:wrap;align-items:baseline;}.metric__unit {margin-inline-start:0.3em;font-size:var(--fs-sm);font-weight:400;color:var(--text-secondary);white-space:normal;overflow-wrap:anywhere;min-width:0;}.metric__foot {margin:0;display:flex;align-items:baseline;flex-wrap:wrap;gap:var(--sp-2);font-size:var(--fs-xs);line-height:1.5;color:var(--text-tertiary);}.metric__note {color:var(--text-tertiary);}.metric__spark {margin-block-start:var(--sp-1);color:var(--text-tertiary);}.metric--null .metric__value {color:var(--text-tertiary);font-weight:400;}.metric--lg .metric__value {font-size:var(--fs-2xl);}.metric--sm .metric__value {font-size:var(--fs-md);font-weight:500;}.metric-grid {display:grid;grid-template-columns:repeat(auto-fit, minmax(min(100%, 12rem), 1fr));gap:var(--sp-5) var(--sp-5);margin:0;padding:0;list-style:none;}
@@ -1 +1 @@
1
- :root {--paper:#f6f7f8;--surface:#ffffff;--surface-sunken:#f1f3f5;--surface-raised:#ffffff;--scrollbar-size:10px;--scrollbar-size-thin:6px;--scrollbar-thumb:#7A808A;--scrollbar-thumb-hov:#6E747E;--scrollbar-radius:5px;--text-primary:#15181c;--text-secondary:#4f555e;--text-tertiary:#606770;--text-on-accent:#ffffff;--text-on-solid:#ffffff;--skeleton-bg:#e9ecef;--skeleton-shimmer:rgba(255, 255, 255, 0.72);--skeleton-h:1em;--skeleton-size:40px;--skeleton-duration:1.4s;--ease-out:cubic-bezier(0.23, 1, 0.32, 1);--progress-h:6px;--progress-dur:240ms;--r-full:999px;--ring-size:64px;--ring-thickness:8px;--progress:0%;--progress-num:0;--z-popover:60;--popover-min-w:200px;--popover-max-w:320px;--popover-p:12px;--popover-gap:8px;--popover-dur:140ms;--border-control:#868b94;--border-decor:#e2e5e9;--border-decor-str:#c8cdd4;--danger:#c0392b;--danger-hover:#8f1e17;--scrim:rgba(21, 24, 28, 0.4);--success:#2f6b3a;--warning:#8a5a00;--info:#1d5f8a;--danger-bg:#fdeeec;--success-bg:#eaf2e6;--warning-bg:#fbf1dd;--info-bg:#e8f1f8;--accent:#1b4d8f;--switch-on:#1b4d8f;--accent-hover:#163a6d;--accent-soft:#e6eef7;--tooltip-bg:#15181c;--tooltip-fg:#f6f7f8;--tooltip-border:#15181c;--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:clamp(1rem, 0.95rem + 0.3vw, 1.25rem);--sp-5:clamp(1.25rem, 1.15rem + 0.7vw, 1.75rem);--sp-6:clamp(1.5rem, 1.3rem + 1.2vw, 2.25rem);--sp-7:clamp(2rem, 1.7rem + 1.8vw, 3.5rem);--sp-8:clamp(2.5rem, 2.1rem + 2.4vw, 4.5rem);--bp-sm:30rem;--bp-md:48rem;--bp-lg:64rem;--bp-xl:80rem;--fs-xs:0.75rem;--fs-sm:0.875rem;--fs-base:clamp(1rem, 0.95rem + 0.3vw, 1.125rem);--fs-md:clamp(1.125rem, 1.05rem + 0.5vw, 1.3125rem);--fs-lg:clamp(1.3125rem, 1.2rem + 0.7vw, 1.5rem);--fs-xl:clamp(1.5rem, 1.3rem + 1.2vw, 1.875rem);--fs-2xl:clamp(1.75rem, 1.45rem + 1.8vw, 2.5rem);--lh-tight:1.25;--lh-base:1.7;--lh-loose:1.85;--measure-page:52rem;--tracking-title:-0.02em;--r-sm:6px;--r-xs:3px;--r-md:10px;--r-lg:14px;--r-pill:999px;--shadow-1:0 1px 2px rgba(31, 29, 25, 0.05), 0 1px 3px rgba(31, 29, 25, 0.06);--shadow-2:0 2px 4px rgba(31, 29, 25, 0.05), 0 6px 16px rgba(31, 29, 25, 0.08);--dur-fast:120ms;--dur-base:180ms;--dur-slow:280ms;--ease-out:cubic-bezier(0.23, 1, 0.32, 1);--ease-in-out:cubic-bezier(0.77, 0, 0.175, 1);--ease-drawer:cubic-bezier(0.32, 0.72, 0, 1);--lift-sm:1px;--lift-md:2px;--lift-lg:8px;--z-base:0;--z-sticky:10;--z-header:20;--z-raised:5;--z-overlay:30;--z-modal:40;--z-toast:50;--sz-touch:44px;--sz-touch-sm:32px;}@media (prefers-color-scheme:dark) {:root:not([data-theme="light"]) {--paper:#14171A;--surface:#1C2024;--surface-raised:#232830;--surface-sunken:#1A1D21;--scrollbar-thumb:#6E747E;--scrollbar-thumb-hov:#7D828A;--border-decor:#2A3038;--border-decor-str:#3A424C;--border-control:#8A9099;--text-primary:#E4E7EA;--text-secondary:#AEB6C0;--text-tertiary:#9BA3AD;--text-on-accent:#0D1114;--text-on-solid:#0D1114;--skeleton-bg:#2E343C;--skeleton-shimmer:rgba(255, 255, 255, 0.06);--danger:#E07A6E;--danger-hover:#F09A90;--danger-bg:#341D1A;--success:#6FAA7A;--success-bg:#16241A;--warning:#C99A3F;--warning-bg:#242A31;--info:#5B9BC4;--info-bg:#13242F;--accent:#7AA9DE;--switch-on:#3E6EA8;--accent-hover:#8FB8E6;--accent-soft:#1C2C3D;--tooltip-bg:#232830;--tooltip-fg:#E4E7EA;--tooltip-border:#2A3038;--scrim:rgba(0, 0, 0, 0.62);}}
1
+ :root {--paper:#f6f7f8;--surface:#ffffff;--surface-sunken:#f1f3f5;--surface-raised:#ffffff;--scrollbar-size:10px;--scrollbar-size-thin:6px;--scrollbar-thumb:#7A808A;--scrollbar-thumb-hov:#6E747E;--scrollbar-radius:5px;--text-primary:#15181c;--text-secondary:#4f555e;--text-tertiary:#606770;--text-on-accent:#ffffff;--text-on-solid:#ffffff;--skeleton-bg:#e9ecef;--skeleton-shimmer:rgba(255, 255, 255, 0.72);--skeleton-h:1em;--skeleton-size:40px;--skeleton-duration:1.4s;--ease-out:cubic-bezier(0.23, 1, 0.32, 1);--progress-h:6px;--progress-dur:240ms;--r-full:999px;--ring-size:64px;--ring-thickness:8px;--progress:0%;--progress-num:0;--z-popover:60;--popover-min-w:200px;--popover-max-w:320px;--popover-p:12px;--popover-gap:8px;--popover-dur:140ms;--border-control:#868b94;--border-decor:#e2e5e9;--border-decor-str:#c8cdd4;--danger:#c0392b;--danger-hover:#8f1e17;--scrim:rgba(21, 24, 28, 0.4);--success:#2f6b3a;--warning:#8a5a00;--info:#1d5f8a;--danger-bg:#fdeeec;--success-bg:#eaf2e6;--warning-bg:#fbf1dd;--info-bg:#e8f1f8;--dir-up:#c0392b;--dir-down:#2f6b3a;--accent:#1b4d8f;--switch-on:#1b4d8f;--accent-hover:#163a6d;--accent-soft:#e6eef7;--tooltip-bg:#15181c;--tooltip-fg:#f6f7f8;--tooltip-border:#15181c;--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:clamp(1rem, 0.95rem + 0.3vw, 1.25rem);--sp-5:clamp(1.25rem, 1.15rem + 0.7vw, 1.75rem);--sp-6:clamp(1.5rem, 1.3rem + 1.2vw, 2.25rem);--sp-7:clamp(2rem, 1.7rem + 1.8vw, 3.5rem);--sp-8:clamp(2.5rem, 2.1rem + 2.4vw, 4.5rem);--bp-sm:30rem;--bp-md:48rem;--bp-lg:64rem;--bp-xl:80rem;--fs-xs:0.75rem;--fs-sm:0.875rem;--fs-base:clamp(1rem, 0.95rem + 0.3vw, 1.125rem);--fs-md:clamp(1.125rem, 1.05rem + 0.5vw, 1.3125rem);--fs-lg:clamp(1.3125rem, 1.2rem + 0.7vw, 1.5rem);--fs-xl:clamp(1.5rem, 1.3rem + 1.2vw, 1.875rem);--fs-2xl:clamp(1.75rem, 1.45rem + 1.8vw, 2.5rem);--lh-tight:1.25;--lh-base:1.7;--lh-loose:1.85;--measure-page:52rem;--tracking-title:-0.02em;--r-sm:6px;--r-xs:3px;--r-md:10px;--r-lg:14px;--r-pill:999px;--shadow-1:0 1px 2px rgba(31, 29, 25, 0.05), 0 1px 3px rgba(31, 29, 25, 0.06);--shadow-2:0 2px 4px rgba(31, 29, 25, 0.05), 0 6px 16px rgba(31, 29, 25, 0.08);--dur-fast:120ms;--dur-base:180ms;--dur-slow:280ms;--ease-out:cubic-bezier(0.23, 1, 0.32, 1);--ease-in-out:cubic-bezier(0.77, 0, 0.175, 1);--ease-drawer:cubic-bezier(0.32, 0.72, 0, 1);--lift-sm:1px;--lift-md:2px;--lift-lg:8px;--z-base:0;--z-sticky:10;--z-header:20;--z-raised:5;--z-overlay:30;--z-modal:40;--z-toast:50;--sz-touch:44px;--sz-touch-sm:32px;}@media (prefers-color-scheme:dark) {:root:not([data-theme="light"]) {--paper:#14171A;--surface:#1C2024;--surface-raised:#232830;--surface-sunken:#1A1D21;--scrollbar-thumb:#6E747E;--scrollbar-thumb-hov:#7D828A;--border-decor:#2A3038;--border-decor-str:#3A424C;--border-control:#8A9099;--text-primary:#E4E7EA;--text-secondary:#AEB6C0;--text-tertiary:#9BA3AD;--text-on-accent:#0D1114;--text-on-solid:#0D1114;--skeleton-bg:#2E343C;--skeleton-shimmer:rgba(255, 255, 255, 0.06);--danger:#E07A6E;--danger-hover:#F09A90;--danger-bg:#341D1A;--success:#6FAA7A;--success-bg:#16241A;--dir-up:#E07A6E;--dir-down:#6FAA7A;--warning:#C99A3F;--warning-bg:#242A31;--info:#5B9BC4;--info-bg:#13242F;--accent:#7AA9DE;--switch-on:#3E6EA8;--accent-hover:#8FB8E6;--accent-soft:#1C2C3D;--tooltip-bg:#232830;--tooltip-fg:#E4E7EA;--tooltip-border:#2A3038;--scrim:rgba(0, 0, 0, 0.62);}}
package/dist/COSTS.md CHANGED
@@ -9,48 +9,50 @@
9
9
 
10
10
  实测两笔账,一笔不省:
11
11
 
12
- - `tokens` 源码版 gzip **18.1 KB** → min 版 **2.6 KB**(省 85%)——
13
- 源码多的那部分**全是注释**(全库 CSS 有 66% 是注释,字节口径),而注释是给维护者的,不是给浏览器的。
14
- - tokens 的 min 版 2.6 KB **比任何一个组件自己都贵** ⇒
12
+ - `tokens` 源码版 gzip **19.6 KB** → min 版 **2.7 KB**(省 86%)——
13
+ 源码多的那部分**全是注释**(全库 CSS 有 67% 是注释,字节口径),而注释是给维护者的,不是给浏览器的。
14
+ - tokens 的 min 版 2.7 KB **比任何一个组件自己都贵** ⇒
15
15
  "只用一个组件"的真实起步价就是它。不公开这张表,等于让人盲买。
16
16
 
17
17
  ## 二、明码标价
18
18
 
19
19
  | 档 | 组件 | tokens(必付) | CSS | JS | **合计** | 源码版合计 | 差 |
20
20
  |---|---|---:|---:|---:|---:|---:|---:|
21
- | primitive | `badge` | 2.6 KB | 0.5 KB | — | **3.1 KB** | 20.8 KB | −17.7 KB |
22
- | primitive | `button` | 2.6 KB | 1.0 KB | — | **3.6 KB** | 24.4 KB | −20.8 KB |
23
- | primitive | `card` | 2.6 KB | 0.9 KB | — | **3.6 KB** | 21.6 KB | −18.0 KB |
24
- | primitive | `choice` | 2.6 KB | 1.1 KB | — | **3.7 KB** | 23.4 KB | −19.7 KB |
25
- | primitive | `combobox` | 2.6 KB | 1.0 KB | 5.4 KB | **9.0 KB** | 27.7 KB | −18.8 KB |
26
- | primitive | `date-range` | 2.6 KB | 0.8 KB | 2.5 KB | **6.0 KB** | 24.5 KB | −18.5 KB |
27
- | primitive | `input` | 2.6 KB | 1.0 KB | — | **3.6 KB** | 21.7 KB | −18.0 KB |
28
- | primitive | `popover` | 2.6 KB | 0.8 KB | 2.2 KB | **5.6 KB** | 25.6 KB | −20.0 KB |
29
- | primitive | `progress` | 2.6 KB | 0.7 KB | — | **3.3 KB** | 20.9 KB | −17.6 KB |
30
- | primitive | `select` | 2.6 KB | 0.8 KB | 3.5 KB | **7.0 KB** | 27.9 KB | −20.9 KB |
31
- | primitive | `separator` | 2.6 KB | 0.2 KB | — | **2.9 KB** | 19.3 KB | −16.5 KB |
32
- | primitive | `skeleton` | 2.6 KB | 0.5 KB | — | **3.1 KB** | 19.5 KB | −16.4 KB |
33
- | primitive | `switch` | 2.6 KB | 0.8 KB | — | **3.4 KB** | 25.2 KB | −21.8 KB |
34
- | pattern | `accordion` | 2.6 KB | 1.3 KB | 1.8 KB | **5.7 KB** | 32.5 KB | −26.8 KB |
35
- | pattern | `content` | 2.6 KB | 1.0 KB | — | **3.6 KB** | 22.6 KB | −19.0 KB |
36
- | pattern | `drawer` | 2.6 KB | 0.8 KB | 2.0 KB | **5.4 KB** | 23.4 KB | −18.1 KB |
37
- | pattern | `dropdown` | 2.6 KB | 0.8 KB | 2.9 KB | **6.3 KB** | 26.3 KB | −20.0 KB |
38
- | pattern | `form-validation` | 2.6 KB | 0.8 KB | — | **3.4 KB** | 22.6 KB | −19.1 KB |
39
- | pattern | `list` | 2.6 KB | 0.6 KB | — | **3.2 KB** | 20.4 KB | −17.2 KB |
40
- | pattern | `nav` | 2.6 KB | 1.2 KB | 2.6 KB | **6.5 KB** | 29.3 KB | −22.9 KB |
41
- | pattern | `overlay` | 2.6 KB | 1.1 KB | 2.8 KB | **6.6 KB** | 32.0 KB | −25.4 KB |
42
- | pattern | `pagination` | 2.6 KB | 0.8 KB | 2.6 KB | **6.0 KB** | 28.6 KB | −22.6 KB |
43
- | pattern | `reveal` | 2.6 KB | 0.3 KB | 1.2 KB | **4.1 KB** | 22.6 KB | −18.5 KB |
44
- | pattern | `states` | 2.6 KB | 0.8 KB | — | **3.5 KB** | 22.1 KB | −18.6 KB |
45
- | pattern | `tabs` | 2.6 KB | 0.7 KB | 2.0 KB | **5.3 KB** | 25.3 KB | −19.9 KB |
46
- | pattern | `tooltip` | 2.6 KB | 0.5 KB | 1.9 KB | **5.0 KB** | 24.7 KB | −19.7 KB |
47
- | pattern | `tree` | 2.6 KB | 0.6 KB | 2.9 KB | **6.2 KB** | 26.2 KB | −20.0 KB |
21
+ | primitive | `badge` | 2.7 KB | 0.5 KB | — | **3.2 KB** | 22.4 KB | −19.2 KB |
22
+ | primitive | `button` | 2.7 KB | 1.0 KB | — | **3.7 KB** | 26.0 KB | −22.4 KB |
23
+ | primitive | `card` | 2.7 KB | 0.9 KB | — | **3.6 KB** | 23.1 KB | −19.5 KB |
24
+ | primitive | `choice` | 2.7 KB | 1.1 KB | — | **3.8 KB** | 25.0 KB | −21.2 KB |
25
+ | primitive | `combobox` | 2.7 KB | 1.0 KB | 5.4 KB | **9.0 KB** | 29.3 KB | −20.3 KB |
26
+ | primitive | `date-range` | 2.7 KB | 0.8 KB | 2.5 KB | **6.1 KB** | 26.1 KB | −20.1 KB |
27
+ | primitive | `delta` | 2.7 KB | 0.3 KB | — | **3.0 KB** | 22.4 KB | −19.4 KB |
28
+ | primitive | `input` | 2.7 KB | 1.0 KB | — | **3.7 KB** | 23.2 KB | −19.5 KB |
29
+ | primitive | `metric` | 2.7 KB | 0.5 KB | — | **3.2 KB** | 22.8 KB | −19.7 KB |
30
+ | primitive | `popover` | 2.7 KB | 0.8 KB | 2.2 KB | **5.7 KB** | 27.2 KB | −21.5 KB |
31
+ | primitive | `progress` | 2.7 KB | 0.7 KB | — | **3.4 KB** | 22.5 KB | −19.1 KB |
32
+ | primitive | `select` | 2.7 KB | 0.8 KB | 3.5 KB | **7.0 KB** | 29.4 KB | −22.4 KB |
33
+ | primitive | `separator` | 2.7 KB | 0.2 KB | — | **2.9 KB** | 20.9 KB | −18.0 KB |
34
+ | primitive | `skeleton` | 2.7 KB | 0.5 KB | — | **3.2 KB** | 21.1 KB | −17.9 KB |
35
+ | primitive | `switch` | 2.7 KB | 0.8 KB | — | **3.4 KB** | 26.8 KB | −23.3 KB |
36
+ | pattern | `accordion` | 2.7 KB | 1.3 KB | 1.8 KB | **5.8 KB** | 34.1 KB | −28.3 KB |
37
+ | pattern | `content` | 2.7 KB | 1.0 KB | — | **3.7 KB** | 24.2 KB | −20.5 KB |
38
+ | pattern | `drawer` | 2.7 KB | 0.8 KB | 2.0 KB | **5.4 KB** | 25.0 KB | −19.6 KB |
39
+ | pattern | `dropdown` | 2.7 KB | 0.8 KB | 2.9 KB | **6.4 KB** | 27.9 KB | −21.5 KB |
40
+ | pattern | `form-validation` | 2.7 KB | 0.8 KB | — | **3.5 KB** | 24.1 KB | −20.7 KB |
41
+ | pattern | `list` | 2.7 KB | 0.6 KB | — | **3.3 KB** | 22.0 KB | −18.7 KB |
42
+ | pattern | `nav` | 2.7 KB | 1.2 KB | 2.6 KB | **6.5 KB** | 30.9 KB | −24.4 KB |
43
+ | pattern | `overlay` | 2.7 KB | 1.1 KB | 2.8 KB | **6.7 KB** | 33.9 KB | −27.2 KB |
44
+ | pattern | `pagination` | 2.7 KB | 0.8 KB | 2.6 KB | **6.0 KB** | 30.1 KB | −24.1 KB |
45
+ | pattern | `reveal` | 2.7 KB | 0.3 KB | 1.2 KB | **4.2 KB** | 24.2 KB | −20.0 KB |
46
+ | pattern | `states` | 2.7 KB | 0.8 KB | — | **3.5 KB** | 23.6 KB | −20.1 KB |
47
+ | pattern | `tabs` | 2.7 KB | 0.7 KB | 2.0 KB | **5.4 KB** | 26.8 KB | −21.4 KB |
48
+ | pattern | `tooltip` | 2.7 KB | 0.5 KB | 1.9 KB | **5.1 KB** | 26.3 KB | −21.2 KB |
49
+ | pattern | `tree` | 2.7 KB | 0.6 KB | 2.9 KB | **6.2 KB** | 27.8 KB | −21.6 KB |
48
50
 
49
51
  ## 三、全库
50
52
 
51
- - 全部组件都用上(min,含 tokens 一份):**60.4 KB**
52
- - 源码版(带注释)全库 gzip:292.9 KB
53
+ - 全部组件都用上(min,含 tokens 一份):**61.2 KB**
54
+ - 源码版(带注释)全库 gzip:302.3 KB
53
55
 
54
- > ⚠️ 源码版那个数字**不是**要付的钱:它包含我们的注释(全库 CSS 有 66% 是注释,字节口径)。
56
+ > ⚠️ 源码版那个数字**不是**要付的钱:它包含我们的注释(全库 CSS 有 67% 是注释,字节口径)。
55
57
  > 它的用途只有一个 —— 让人看清"dist 到底省了多少"。
56
58
 
@@ -62,6 +62,14 @@ python3 -m http.server 8000 --bind 127.0.0.1
62
62
  | tabs | 未执行 | 未执行 | — | — | — | |
63
63
  | overlay | 未执行 | 未执行 | — | — | 未执行 | |
64
64
  | table | 未执行 | 未执行 | — | — | — | |
65
+ | **accordion** | 未执行 | 未执行 | — | — | — | 重点:展开/收起时 `aria-expanded` 有没有读出来,面板与标题的关联有没有读 |
66
+ | **drawer** | 未执行 | 未执行 | — | — | 未执行 | 重点:抽屉打开时焦点有没有进到里面;Esc 关闭后焦点有没有回到触发按钮 |
67
+ | **dropdown** | 未执行 | 未执行 | — | — | 未执行 | 重点:方向键在菜单项之间的移动能否被读出;Esc 关列表后焦点在哪 |
68
+
69
+ > **为什么后三行是补的**:`accordion` / `drawer` / `dropdown` 是当前仅有的 beta 组件里的三个,
70
+ > 而它们升 stable 的判据之一就是「行为零欠账」——人工读屏是这件事**唯一的用户侧证据**。
71
+ > 只覆盖 `overlay` 一个浮层,等于对另外两个浮层的真实表现没有任何记录。
72
+ > 这三行同样**未执行**,加行不等于做过。
65
73
 
66
74
  状态只填三种:**通过** / **失败(附听到的内容)** / **未执行**。
67
75
  "大概没问题"不属于这三种,不要写。