agentcss 0.11.14 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/01-tokens/README.md +54 -3
  2. package/01-tokens/market.css +48 -0
  3. package/01-tokens/tokens.css +66 -0
  4. package/02-primitives/combobox/combobox.js +1 -1
  5. package/02-primitives/date-range/date-range.js +1 -1
  6. package/02-primitives/delta/README.md +92 -0
  7. package/02-primitives/delta/delta.css +113 -0
  8. package/02-primitives/delta/demo.html +162 -0
  9. package/02-primitives/metric/README.md +93 -0
  10. package/02-primitives/metric/demo.html +176 -0
  11. package/02-primitives/metric/metric.css +157 -0
  12. package/02-primitives/popover/demo.html +1 -1
  13. package/02-primitives/popover/popover.js +1 -1
  14. package/02-primitives/select/select.js +1 -1
  15. package/03-patterns/accordion/accordion.js +25 -5
  16. package/03-patterns/drawer/drawer.js +1 -1
  17. package/03-patterns/dropdown/dropdown.js +1 -1
  18. package/03-patterns/list/flip.js +1 -1
  19. package/03-patterns/nav/nav.js +6 -3
  20. package/03-patterns/nav/toc.js +1 -1
  21. package/03-patterns/overlay/overlay.js +1 -1
  22. package/03-patterns/pagination/demo.html +1 -1
  23. package/03-patterns/pagination/pagination.js +9 -3
  24. package/03-patterns/reveal/reveal.js +4 -1
  25. package/03-patterns/tabs/tabs.js +12 -3
  26. package/03-patterns/tooltip/tooltip.js +1 -1
  27. package/03-patterns/tree/tree.js +1 -1
  28. package/04-recipes/report/demo.html +2 -2
  29. package/04-recipes/tierA-tokens.css +12 -6
  30. package/09-assets/echarts-adapter/demo.html +5 -5
  31. package/09-assets/model-viewer/demo.html +2 -2
  32. package/API.md +52 -3
  33. package/CHANGELOG.md +356 -0
  34. package/CONTRIBUTING.md +2 -1
  35. package/README.zh-CN.md +9 -7
  36. package/START-HERE.md +7 -5
  37. package/ai/START-HERE.md +1 -1
  38. package/ai/components.json +103 -8
  39. package/ai/components.meta.json +8 -0
  40. package/ai/deprecations.schema.json +2 -2
  41. package/ai/tokens.audience.json +3 -2
  42. package/ai/tokens.json +21 -2
  43. package/ai/tokens.tree.json +20 -2
  44. package/dist/01-tokens/market.css +1 -0
  45. package/dist/01-tokens/tokens.css +1 -1
  46. package/dist/02-primitives/combobox/combobox.js +1 -1
  47. package/dist/02-primitives/date-range/date-range.js +1 -1
  48. package/dist/02-primitives/delta/delta.css +1 -0
  49. package/dist/02-primitives/metric/metric.css +1 -0
  50. package/dist/02-primitives/popover/popover.js +1 -1
  51. package/dist/02-primitives/select/select.js +1 -1
  52. package/dist/03-patterns/accordion/accordion.js +10 -4
  53. package/dist/03-patterns/drawer/drawer.js +1 -1
  54. package/dist/03-patterns/dropdown/dropdown.js +1 -1
  55. package/dist/03-patterns/list/flip.js +1 -1
  56. package/dist/03-patterns/nav/nav.js +4 -3
  57. package/dist/03-patterns/nav/toc.js +1 -1
  58. package/dist/03-patterns/overlay/overlay.js +1 -1
  59. package/dist/03-patterns/pagination/pagination.js +4 -3
  60. package/dist/03-patterns/reveal/reveal.js +2 -1
  61. package/dist/03-patterns/tabs/tabs.js +8 -3
  62. package/dist/03-patterns/tooltip/tooltip.js +1 -1
  63. package/dist/03-patterns/tree/tree.js +1 -1
  64. package/dist/04-recipes/tierA-tokens.css +1 -1
  65. package/dist/COSTS.md +35 -33
  66. package/docs/ACCESSIBILITY.md +3 -3
  67. package/docs/CONVENTIONS.md +28 -2
  68. package/docs/DEPRECATIONS.md +128 -0
  69. package/esm/accordion.mjs +7 -0
  70. package/esm/combobox.mjs +7 -0
  71. package/esm/date-range.mjs +7 -0
  72. package/esm/drawer.mjs +7 -0
  73. package/esm/dropdown.mjs +7 -0
  74. package/esm/flip.mjs +7 -0
  75. package/esm/index.mjs +38 -0
  76. package/esm/nav.mjs +7 -0
  77. package/esm/overlay.mjs +7 -0
  78. package/esm/pagination.mjs +7 -0
  79. package/esm/popover.mjs +7 -0
  80. package/esm/reveal.mjs +7 -0
  81. package/esm/select.mjs +7 -0
  82. package/esm/tabs.mjs +7 -0
  83. package/esm/toc.mjs +7 -0
  84. package/esm/tooltip.mjs +7 -0
  85. package/esm/tree.mjs +7 -0
  86. package/index.html +4 -2
  87. package/package.json +10 -3
  88. package/types/index.d.ts +131 -1
package/README.zh-CN.md CHANGED
@@ -83,9 +83,9 @@ npm install github:owain323/frontend-lib
83
83
 
84
84
  ## 组件一览
85
85
 
86
- 共 **35** 个(stable 31 / beta 4)。每个组件目录下有 `README.md`(为什么这么做)和 `demo.html`(能直接抄的结构)。
86
+ 共 **37** 个(stable 33 / beta 4)。每个组件目录下有 `README.md`(为什么这么做)和 `demo.html`(能直接抄的结构)。
87
87
 
88
- ### primitives · 基础件(13)
88
+ ### primitives · 基础件(15)
89
89
 
90
90
  | 组件 | 根类名 | 用途 |
91
91
  |---|---|---|
@@ -95,7 +95,9 @@ npm install github:owain323/frontend-lib
95
95
  | `choice` | `choice` | 单选/多选/原生 select 外观的统一控件 |
96
96
  | `combobox` | `combo` | 可搜索 + 可多选标签的输入控件 |
97
97
  | `date-range` | `drange` | 日期区间选择,含预设快捷范围 |
98
+ | `delta` | `delta` | 变化量:涨跌方向 + 符号,**只描述方向不判断好坏** |
98
99
  | `input` | `field` | 文本输入及其标签/帮助/错误三件套 |
100
+ | `metric` | `metric` | 指标块:一个标签 + 一个值 + 一句上下文,缺数是一等状态 |
99
101
  | `popover` | `popover` | 锚定到触发元素的浮层 |
100
102
  | `progress` | `progress` | 进度条与进度环 |
101
103
  | `select` | `select` | 自定义下拉选择(非原生) |
@@ -181,8 +183,8 @@ dist/01-tokens/tokens.css ← 拷这个
181
183
  01-tokens/tokens.css ← 源码(带 31.6 KB 注释),用于阅读
182
184
  ```
183
185
 
184
- - **别拷源码目录**除非你要读它:全库 CSS 有 66% 是注释(字节口径;字符口径会低报 12 个百分点),`page.css` 一个文件
185
- 12.4 KB 里 10.8 KB 是注释。
186
+ - **别拷源码目录**除非你要读它:全库 CSS 有 67% 是注释(字节口径;字符口径会低报 12 个百分点),`page.css` 一个文件
187
+ 17.5 KB 里 15.1 KB 是注释。
186
188
  - **JS 也拷 `dist/`**:那一份去了注释但没压缩(理由见「体积」一节)。
187
189
 
188
190
  ---
@@ -249,10 +251,10 @@ dist/01-tokens/tokens.css ← 拷这个
249
251
  ## 体积:默认给你的已经是干净产物
250
252
 
251
253
  源码目录(`01-tokens/` `02-primitives/` …)里的 CSS **带着全部注释** —— 实测全库 CSS
252
- 有 **66% 是注释**(354.7 KB 原始里 235.2 KB),`page.css` 单个就有 87%。
254
+ 有 **67% 是注释**(399.3 KB 原始里 267.8 KB),`page.css` 单个就有 86%。
253
255
 
254
256
  那些注释是写给你看的取舍理由(为什么这么定、踩过什么坑),不是写给你浏览器看的。
255
- **注释让你看代码时处处撞墙,构建工具还会把 66% 的字节原样传下去。**
257
+ **注释让你看代码时处处撞墙,构建工具还会把 67% 的字节原样传下去。**
256
258
 
257
259
  ⇒ 所以 `import 'agentcss/tokens.css'` **默认给你去注释后的产物**,
258
260
  源码版放在 `agentcss/src/*`:
@@ -343,7 +345,7 @@ import 'agentcss/dist/02-primitives/button/button.css';
343
345
  | `ai/` | **机器可读契约**:`components.json` / `tokens.json` / schema / 校验器 / 命令行 |
344
346
  | `adapters/` | 场景适配层(如演示文稿),**不进核心** |
345
347
  | `benchmark/` | 兼容性基准(10 类编辑意图,当前无模型实测记录) |
346
- | `docs/` | `INVARIANT.md`(不变式)· `CONVENTIONS.md`(全局约定)· `ACCESSIBILITY.md`(无障碍)· `AI-CONTRACT.md`(与 AI 协作的契约)· `LAYER-BASELINE.md`(引擎能力基线) |
348
+ | `docs/` | `INVARIANT.md`(不变式)· `CONVENTIONS.md`(全局约定)· `ACCESSIBILITY.md`(无障碍)· `DEPRECATIONS.md`(弃用与移除)· `AI-CONTRACT.md`(与 AI 协作的契约)· `LAYER-BASELINE.md`(引擎能力基线) |
347
349
  | `types/` | TypeScript 类型定义(描述 `window` 上的全局对象) |
348
350
 
349
351
  ## 示例与验证状态
package/START-HERE.md CHANGED
@@ -47,20 +47,22 @@
47
47
  | 进度条 / 环 | `02-primitives/progress/progress.css` | 172 | — | 有耗时过程要给进度就要 |
48
48
  | 浮层气泡 | `02-primitives/popover/popover.css` | 187 | **必需 331** (`popover.js`) | 要一段信息贴着触发元素浮出来就要 |
49
49
  | 日期区间 | `02-primitives/date-range/date-range.css` | 206 | **必需 301** (`date-range.js`) | 要选起止日期就要 |
50
- | 标签页 | `03-patterns/tabs/tabs.css` | 172 | **必需 307** (`tabs.js`) | 同层级内容切换就要 |
51
- | 折叠面板(beta) | `03-patterns/accordion/accordion.css` | 453 | **必需 369** (`accordion.js`) | 长表单分段就要 |
50
+ | 标签页 | `03-patterns/tabs/tabs.css` | 172 | **必需 316** (`tabs.js`) | 同层级内容切换就要 |
51
+ | 折叠面板(beta) | `03-patterns/accordion/accordion.css` | 453 | **必需 389** (`accordion.js`) | 长表单分段就要 |
52
52
  | 动作菜单(beta) | `03-patterns/dropdown/dropdown.css` | 135 | **必需 451** (`dropdown.js`) | 要一组动作(新建 / 导出 / 删除)就要 |
53
53
  | 文字提示 | `03-patterns/tooltip/tooltip.css` | 89 | **必需 288** (`tooltip.js`) | 图标按钮或缩写需要一句话解释就要 |
54
- | 分页 | `03-patterns/pagination/pagination.css` | 195 | **必需 395** (`pagination.js`) | 数据多到要翻页就要 |
54
+ | 分页 | `03-patterns/pagination/pagination.css` | 195 | **必需 401** (`pagination.js`) | 数据多到要翻页就要 |
55
55
  | 树形 | `03-patterns/tree/tree.css` | 122 | **必需 464** (`tree.js`) | 层级数据(文件 / 组织 / 分类)要展开就要 |
56
56
  | 侧边抽屉(beta) | `03-patterns/drawer/drawer.css` | 129 | **必需 258** (`drawer.js`) | 要从侧边滑出面板就要 |
57
57
  | 弹窗 / 吐司(beta) | `03-patterns/overlay/overlay.css` | 319 | **必需 563** (`overlay.js`) | 需要弹层(吐司 / 模态)就要 |
58
58
  | 状态(空 / 加载 / 错 / 成功) | `03-patterns/states/states.css` | 252 | — | **凡是会异步取数就要** |
59
59
  | 表单校验 | `03-patterns/form-validation/form-validation.css` | 263 | — | 提交前要校验就要 |
60
60
  | 列表增删 | `03-patterns/list/list.css` | 162 | 可选 201 (`flip.js`,FLIP 增删动画,纯增强) | 列表会动态增删就要 |
61
- | 导航 / 目录 | `03-patterns/nav/nav.css` | 314 | **必需 430** (`nav.js`) · 可选 111 (`toc.js`,自动生成目录,纯增强) | 顶部要导航,或长文要目录就要 |
61
+ | 导航 / 目录 | `03-patterns/nav/nav.css` | 314 | **必需 433** (`nav.js`) · 可选 111 (`toc.js`,自动生成目录,纯增强) | 顶部要导航,或长文要目录就要 |
62
62
  | 长文排版 | `03-patterns/content/content.css` | 286 | — | 写文档 / 长文就要 |
63
- | reveal | `03-patterns/reveal/reveal.css` | 93 | 可选 172 (`reveal.js`,入场动效,纯增强;没有它内容直接可见) | |
63
+ | delta | `02-primitives/delta/delta.css` | 113 | — | |
64
+ | metric | `02-primitives/metric/metric.css` | 157 | — | |
65
+ | reveal | `03-patterns/reveal/reveal.css` | 93 | 可选 175 (`reveal.js`,入场动效,纯增强;没有它内容直接可见) | |
64
66
  | analysis-report | `04-recipes/analysis-report/analysis-report.css` | 187 | — | |
65
67
  | detail-page | `04-recipes/detail-page/detail-page.css` | 190 | — | |
66
68
  | report | `04-recipes/report/report.css` | 364 | — | |
package/ai/START-HERE.md CHANGED
@@ -30,7 +30,7 @@
30
30
  > 它的值直接从 `ai/components.json` 与目录实际内容读出来 —— **不信上面的说法,信这个**。
31
31
 
32
32
  <!-- ==== AI-INVENTORY-BEGIN ==== -->
33
- - 组件 **35** 个(`beta` 4 · `stable` 31)
33
+ - 组件 **37** 个(`beta` 4 · `stable` 33)
34
34
  - `04-recipes/`(页面级示例):`analysis-report`(组合型研究报告:正文 + 辅助栏并排,窄屏退回单栏) · `data-showcase`(四种数据表达方式对照:我到底该用哪个) · `detail-page`(实体详情页骨架:字段齐全 / 部分缺失 / 无数据,三态同构(DOM 不变)) · `longform`(单栏长文排版与阅读节奏) · `report`(报告版式系统 v1:共享基础 + 三种版式取舍(杂志 / 科研技术 / 金融研究)) · `table`(专业数据表格:列级格式与单位,三种用途预设)
35
35
  - `09-assets/`(图表与可视化):`bar`(柱状图,含图表规范的裁剪铁律) · `echarts-adapter`(把令牌喂给 ECharts,按需引入;本库不含 ECharts) · `model-viewer`(惰性加载的 3D 模型查看器) · `scientific-plot`(二维科学绘图:坐标轴 / 误差棒 / 置信区间带 / 对数轴) · `sparkline`(迷你趋势线,没有坐标轴的走势提示)
36
36
  <!-- ==== AI-INVENTORY-END ==== -->
@@ -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.14",
4
+ "libraryVersion": "0.12.0",
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
@@ -125,7 +125,9 @@
125
125
  },
126
126
  "aria": {
127
127
  "roles": [],
128
- "attrs": []
128
+ "attrs": [
129
+ "label"
130
+ ]
129
131
  },
130
132
  "usesOtherNamespaces": [],
131
133
  "global": "ModelViewer",
@@ -1351,6 +1353,49 @@
1351
1353
  "globalAlso": [],
1352
1354
  "behaviorRef": "API.md#date-range"
1353
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
+ },
1354
1399
  {
1355
1400
  "id": "input",
1356
1401
  "tier": "primitive",
@@ -1408,6 +1453,54 @@
1408
1453
  "globalAlso": [],
1409
1454
  "behaviorRef": "API.md#input"
1410
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
+ },
1411
1504
  {
1412
1505
  "id": "popover",
1413
1506
  "tier": "primitive",
@@ -1455,7 +1548,8 @@
1455
1548
  "main"
1456
1549
  ],
1457
1550
  "attrs": [
1458
- "hidden"
1551
+ "hidden",
1552
+ "label"
1459
1553
  ]
1460
1554
  },
1461
1555
  "usesOtherNamespaces": [],
@@ -1899,7 +1993,8 @@
1899
1993
  "aria": {
1900
1994
  "roles": [],
1901
1995
  "attrs": [
1902
- "hidden"
1996
+ "hidden",
1997
+ "label"
1903
1998
  ]
1904
1999
  },
1905
2000
  "usesOtherNamespaces": [],
@@ -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": "顶部导航与目录"
@@ -39,7 +39,7 @@
39
39
  "required": ["id", "kind", "name", "deprecatedIn", "removeIn", "reason"],
40
40
  "properties": {
41
41
  "id": { "type": "string", "minLength": 1 },
42
- "kind": { "enum": ["token", "class"] },
42
+ "kind": { "enum": ["token", "class", "api", "event"] },
43
43
  "name": { "type": "string", "minLength": 1 },
44
44
  "deprecatedIn": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
45
45
  "removeIn": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
@@ -61,7 +61,7 @@
61
61
  "type": "object",
62
62
  "required": ["kind", "name", "removedIn"],
63
63
  "properties": {
64
- "kind": { "enum": ["token", "class"] },
64
+ "kind": { "enum": ["token", "class", "api", "event"] },
65
65
  "name": { "type": "string", "minLength": 1 },
66
66
  "removedIn": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
67
67
  "replacement": {
@@ -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;}}
@@ -436,4 +436,4 @@ return String(s).replace(/[&<>"]/g, function (c) {
436
436
  }
437
437
 
438
438
  global.Combobox = { create: create };
439
- })(window);
439
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -264,4 +264,4 @@ create: create,
264
264
  iso: iso, addDays: addDays, addMonths: addMonths,
265
265
  quarterOf: quarterOf, quarterRange: quarterRange,
266
266
  };
267
- })(window);
267
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -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;}
@@ -254,4 +254,4 @@ get current() { return current; },
254
254
  };
255
255
 
256
256
  global.Popover = Popover;
257
- })(window);
257
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -446,4 +446,4 @@ set value(v) { selected = v == null ? null : String(v); paint(); },
446
446
  }
447
447
 
448
448
  global.Select = { create: create };
449
- })(window);
449
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -1,4 +1,4 @@
1
- (function () {
1
+ (function (global) {
2
2
  'use strict';
3
3
 
4
4
  var uid = 0;
@@ -28,7 +28,8 @@ return ev;
28
28
 
29
29
  function toArray(x) { return Array.prototype.slice.call(x); }
30
30
 
31
- var raf = (typeof window.requestAnimationFrame === 'function')
31
+ var raf = (typeof window !== 'undefined' &&
32
+ typeof window.requestAnimationFrame === 'function')
32
33
  ? window.requestAnimationFrame.bind(window)
33
34
  : function (fn) { return setTimeout(fn, 16); };
34
35
 
@@ -51,6 +52,8 @@ return null;
51
52
  }
52
53
 
53
54
  function Accordion(root, opts) {
55
+
56
+ if (root && root.accordionInstance) return root.accordionInstance;
54
57
  this.root = root;
55
58
  this.opts = opts || {};
56
59
  this.items = toArray(root.querySelectorAll('.accordion__item'));
@@ -202,18 +205,21 @@ if (item) self.toggle(item);
202
205
 
203
206
  };
204
207
 
205
- window.Accordion = Accordion;
208
+ global.Accordion = Accordion;
206
209
 
207
210
  function init() {
208
211
  var nodes = document.querySelectorAll('[data-accordion]');
209
212
  for (var i = 0; i < nodes.length; i++) {
213
+
214
+ if (nodes[i].accordionInstance) continue;
210
215
  nodes[i].accordionInstance = new Accordion(nodes[i]);
211
216
  }
212
217
  }
213
218
 
219
+ if (typeof document === 'undefined') return;
214
220
  if (document.readyState === 'loading') {
215
221
  document.addEventListener('DOMContentLoaded', init);
216
222
  } else {
217
223
  init();
218
224
  }
219
- })();
225
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -226,4 +226,4 @@ return { el: d, close: close };
226
226
  }
227
227
 
228
228
  global.Drawer = { open: open };
229
- })(window);
229
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -362,4 +362,4 @@ destroy: function () { roving.destroy(); dismiss.destroy(); menu.hidden = true;
362
362
  }
363
363
 
364
364
  global.Dropdown = { create: create };
365
- })(window);
365
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -114,4 +114,4 @@ if (done) { done(); }
114
114
 
115
115
  global.FLIP = { flip: flip, remove: removeWithAnimation };
116
116
 
117
- })(window);
117
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -1,4 +1,4 @@
1
- (function () {
1
+ (function (global) {
2
2
  'use strict';
3
3
 
4
4
  var flEmit = function (el, name, detail) {
@@ -306,7 +306,7 @@ root.navInstance = new Nav(root, opts);
306
306
  return root.navInstance;
307
307
  };
308
308
 
309
- window.Nav = Nav;
309
+ global.Nav = Nav;
310
310
 
311
311
  function init() {
312
312
  each(document.querySelectorAll('[data-nav]'), function (el) {
@@ -314,9 +314,10 @@ if (!el.navInstance) Nav.attach(el, {});
314
314
  });
315
315
  }
316
316
 
317
+ if (typeof document === 'undefined') return;
317
318
  if (document.readyState === 'loading') {
318
319
  document.addEventListener('DOMContentLoaded', init);
319
320
  } else {
320
321
  init();
321
322
  }
322
- })();
323
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -73,4 +73,4 @@ global.removeEventListener('hashchange', update);
73
73
 
74
74
  global.Toc = { init: init };
75
75
 
76
- })(window);
76
+ })(typeof window !== 'undefined' ? window : globalThis);
@@ -395,4 +395,4 @@ return { el: box, close: close };
395
395
 
396
396
  global.Overlay = { toast: toast, dialog: dialog };
397
397
 
398
- })(window);
398
+ })(typeof window !== 'undefined' ? window : globalThis);