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/01-tokens/README.md +54 -3
- package/01-tokens/market.css +48 -0
- package/01-tokens/tokens.css +66 -0
- package/02-primitives/delta/README.md +92 -0
- package/02-primitives/delta/delta.css +113 -0
- package/02-primitives/delta/demo.html +162 -0
- package/02-primitives/metric/README.md +93 -0
- package/02-primitives/metric/demo.html +176 -0
- package/02-primitives/metric/metric.css +157 -0
- package/03-patterns/overlay/overlay.js +10 -4
- package/04-recipes/table/README.md +45 -7
- package/04-recipes/table/demo.html +92 -5
- package/04-recipes/tierA-tokens.css +12 -6
- package/API.md +15 -0
- package/CHANGELOG.md +295 -0
- package/CONTRIBUTING.md +54 -2
- package/README.zh-CN.md +8 -6
- package/START-HERE.md +3 -1
- package/ai/START-HERE.md +1 -1
- package/ai/cli.js +149 -0
- package/ai/components.json +96 -5
- package/ai/components.meta.json +8 -0
- package/ai/tokens.audience.json +3 -2
- package/ai/tokens.json +21 -2
- package/ai/tokens.tree.json +20 -2
- package/dist/01-tokens/market.css +1 -0
- package/dist/01-tokens/tokens.css +1 -1
- package/dist/02-primitives/delta/delta.css +1 -0
- package/dist/02-primitives/metric/metric.css +1 -0
- package/dist/04-recipes/tierA-tokens.css +1 -1
- package/dist/COSTS.md +35 -33
- package/docs/A11Y-MANUAL-PROTOCOL.md +8 -0
- package/docs/ACCESSIBILITY.md +5 -5
- package/docs/CONVENTIONS.md +36 -2
- package/index.html +4 -2
- package/package.json +1 -1
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' +
|
package/ai/components.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
3
|
"generatedBy": "05-audit/gen-ai-contract.py",
|
|
4
|
-
"libraryVersion": "0.
|
|
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
|
|
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":
|
|
15
|
+
"total": 37,
|
|
16
16
|
"byMaturity": {
|
|
17
|
-
"stable":
|
|
17
|
+
"stable": 33,
|
|
18
18
|
"beta": 4
|
|
19
19
|
},
|
|
20
20
|
"byTier": {
|
|
21
|
-
"primitive":
|
|
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",
|
package/ai/components.meta.json
CHANGED
|
@@ -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": "顶部导航与目录"
|
package/ai/tokens.audience.json
CHANGED
|
@@ -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":
|
|
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":
|
|
680
|
-
"darkCount":
|
|
698
|
+
"lightCount": 112,
|
|
699
|
+
"darkCount": 35,
|
|
681
700
|
"onlyInDark": [],
|
|
682
701
|
"onlyInLight": [
|
|
683
702
|
"--bp-lg",
|
package/ai/tokens.tree.json
CHANGED
|
@@ -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":
|
|
732
|
-
"darkCount":
|
|
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 **
|
|
13
|
-
源码多的那部分**全是注释**(全库 CSS 有
|
|
14
|
-
- tokens 的 min 版 2.
|
|
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.
|
|
22
|
-
| primitive | `button` | 2.
|
|
23
|
-
| primitive | `card` | 2.
|
|
24
|
-
| primitive | `choice` | 2.
|
|
25
|
-
| primitive | `combobox` | 2.
|
|
26
|
-
| primitive | `date-range` | 2.
|
|
27
|
-
| primitive | `
|
|
28
|
-
| primitive | `
|
|
29
|
-
| primitive | `
|
|
30
|
-
| primitive | `
|
|
31
|
-
| primitive | `
|
|
32
|
-
| primitive | `
|
|
33
|
-
| primitive | `
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
| pattern | `
|
|
37
|
-
| pattern | `
|
|
38
|
-
| pattern | `
|
|
39
|
-
| pattern | `
|
|
40
|
-
| pattern | `
|
|
41
|
-
| pattern | `
|
|
42
|
-
| pattern | `
|
|
43
|
-
| pattern | `
|
|
44
|
-
| pattern | `
|
|
45
|
-
| pattern | `
|
|
46
|
-
| pattern | `
|
|
47
|
-
| pattern | `
|
|
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 一份):**
|
|
52
|
-
- 源码版(带注释)全库 gzip:
|
|
53
|
+
- 全部组件都用上(min,含 tokens 一份):**61.2 KB**
|
|
54
|
+
- 源码版(带注释)全库 gzip:302.3 KB
|
|
53
55
|
|
|
54
|
-
> ⚠️ 源码版那个数字**不是**要付的钱:它包含我们的注释(全库 CSS 有
|
|
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
|
"大概没问题"不属于这三种,不要写。
|