agentcss 0.0.0-stage → 0.11.3

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 (274) hide show
  1. package/01-tokens/README.md +236 -0
  2. package/01-tokens/behavior/dismissable.js +132 -0
  3. package/01-tokens/behavior/emit.js +76 -0
  4. package/01-tokens/behavior/focus-return.js +81 -0
  5. package/01-tokens/behavior/roving.js +152 -0
  6. package/01-tokens/behavior/typeahead.js +124 -0
  7. package/01-tokens/focus-ring-demo.html +133 -0
  8. package/01-tokens/focus-ring.css +102 -0
  9. package/01-tokens/page.css +244 -0
  10. package/01-tokens/polyfill.js +116 -0
  11. package/01-tokens/responsive-demo.html +171 -0
  12. package/01-tokens/scrollbar-demo.html +194 -0
  13. package/01-tokens/scrollbar.css +179 -0
  14. package/01-tokens/theme-toggle.js +103 -0
  15. package/01-tokens/tokens.css +972 -0
  16. package/01-tokens/typography.css +156 -0
  17. package/02-primitives/badge/README.md +71 -0
  18. package/02-primitives/badge/badge.css +141 -0
  19. package/02-primitives/badge/demo.html +101 -0
  20. package/02-primitives/button/README.md +99 -0
  21. package/02-primitives/button/button.css +353 -0
  22. package/02-primitives/button/demo.html +200 -0
  23. package/02-primitives/card/README.md +145 -0
  24. package/02-primitives/card/card.css +246 -0
  25. package/02-primitives/card/demo.html +170 -0
  26. package/02-primitives/choice/README.md +161 -0
  27. package/02-primitives/choice/choice.css +395 -0
  28. package/02-primitives/choice/demo.html +277 -0
  29. package/02-primitives/combobox/README.md +79 -0
  30. package/02-primitives/combobox/combobox.css +223 -0
  31. package/02-primitives/combobox/combobox.js +485 -0
  32. package/02-primitives/combobox/demo.html +109 -0
  33. package/02-primitives/date-range/README.md +100 -0
  34. package/02-primitives/date-range/date-range.css +206 -0
  35. package/02-primitives/date-range/date-range.js +301 -0
  36. package/02-primitives/date-range/demo.html +104 -0
  37. package/02-primitives/input/README.md +170 -0
  38. package/02-primitives/input/demo.html +246 -0
  39. package/02-primitives/input/input.css +239 -0
  40. package/02-primitives/popover/README.md +80 -0
  41. package/02-primitives/popover/demo.html +150 -0
  42. package/02-primitives/popover/popover.css +187 -0
  43. package/02-primitives/popover/popover.js +331 -0
  44. package/02-primitives/progress/README.md +82 -0
  45. package/02-primitives/progress/demo.html +154 -0
  46. package/02-primitives/progress/progress.css +172 -0
  47. package/02-primitives/select/README.md +95 -0
  48. package/02-primitives/select/demo.html +121 -0
  49. package/02-primitives/select/select.css +151 -0
  50. package/02-primitives/select/select.js +549 -0
  51. package/02-primitives/separator/README.md +63 -0
  52. package/02-primitives/separator/demo.html +84 -0
  53. package/02-primitives/separator/separator.css +73 -0
  54. package/02-primitives/skeleton/README.md +69 -0
  55. package/02-primitives/skeleton/demo.html +110 -0
  56. package/02-primitives/skeleton/skeleton.css +96 -0
  57. package/02-primitives/switch/README.md +65 -0
  58. package/02-primitives/switch/demo.html +115 -0
  59. package/02-primitives/switch/switch.css +370 -0
  60. package/03-patterns/accordion/README.md +121 -0
  61. package/03-patterns/accordion/accordion.css +453 -0
  62. package/03-patterns/accordion/accordion.js +369 -0
  63. package/03-patterns/accordion/demo.html +223 -0
  64. package/03-patterns/content/README.md +103 -0
  65. package/03-patterns/content/content.css +286 -0
  66. package/03-patterns/content/demo.html +88 -0
  67. package/03-patterns/drawer/README.md +79 -0
  68. package/03-patterns/drawer/demo.html +101 -0
  69. package/03-patterns/drawer/drawer.css +129 -0
  70. package/03-patterns/drawer/drawer.js +258 -0
  71. package/03-patterns/dropdown/README.md +78 -0
  72. package/03-patterns/dropdown/demo.html +101 -0
  73. package/03-patterns/dropdown/dropdown.css +135 -0
  74. package/03-patterns/dropdown/dropdown.js +451 -0
  75. package/03-patterns/form-validation/README.md +147 -0
  76. package/03-patterns/form-validation/demo.html +280 -0
  77. package/03-patterns/form-validation/form-validation.css +263 -0
  78. package/03-patterns/list/README.md +150 -0
  79. package/03-patterns/list/demo.html +225 -0
  80. package/03-patterns/list/flip.js +201 -0
  81. package/03-patterns/list/list.css +162 -0
  82. package/03-patterns/nav/README.md +225 -0
  83. package/03-patterns/nav/demo.html +131 -0
  84. package/03-patterns/nav/nav.css +314 -0
  85. package/03-patterns/nav/nav.js +430 -0
  86. package/03-patterns/nav/toc.js +111 -0
  87. package/03-patterns/overlay/README.md +196 -0
  88. package/03-patterns/overlay/demo.html +241 -0
  89. package/03-patterns/overlay/overlay.css +319 -0
  90. package/03-patterns/overlay/overlay.js +563 -0
  91. package/03-patterns/pagination/README.md +114 -0
  92. package/03-patterns/pagination/demo.html +165 -0
  93. package/03-patterns/pagination/pagination.css +195 -0
  94. package/03-patterns/pagination/pagination.js +395 -0
  95. package/03-patterns/reveal/README.md +91 -0
  96. package/03-patterns/reveal/demo.html +106 -0
  97. package/03-patterns/reveal/reveal.css +93 -0
  98. package/03-patterns/reveal/reveal.js +172 -0
  99. package/03-patterns/states/README.md +141 -0
  100. package/03-patterns/states/demo.html +240 -0
  101. package/03-patterns/states/states.css +252 -0
  102. package/03-patterns/tabs/README.md +84 -0
  103. package/03-patterns/tabs/demo.html +139 -0
  104. package/03-patterns/tabs/tabs.css +172 -0
  105. package/03-patterns/tabs/tabs.js +307 -0
  106. package/03-patterns/tooltip/README.md +96 -0
  107. package/03-patterns/tooltip/demo.html +78 -0
  108. package/03-patterns/tooltip/tooltip.css +89 -0
  109. package/03-patterns/tooltip/tooltip.js +288 -0
  110. package/03-patterns/tree/README.md +94 -0
  111. package/03-patterns/tree/demo.html +138 -0
  112. package/03-patterns/tree/tree.css +113 -0
  113. package/03-patterns/tree/tree.js +456 -0
  114. package/04-recipes/analysis-report/README.md +80 -0
  115. package/04-recipes/analysis-report/analysis-report.css +187 -0
  116. package/04-recipes/analysis-report/demo.html +274 -0
  117. package/04-recipes/data-showcase/README.md +45 -0
  118. package/04-recipes/data-showcase/demo.html +247 -0
  119. package/04-recipes/detail-page/README.md +93 -0
  120. package/04-recipes/detail-page/demo.html +55 -0
  121. package/04-recipes/detail-page/detail-page.css +190 -0
  122. package/04-recipes/detail-page/full.html +60 -0
  123. package/04-recipes/detail-page/null.html +60 -0
  124. package/04-recipes/detail-page/partial.html +60 -0
  125. package/04-recipes/detail-page/verify-skeleton.py +19 -0
  126. package/04-recipes/longform/README.md +93 -0
  127. package/04-recipes/longform/agc-memory.svg +4 -0
  128. package/04-recipes/longform/content.html +610 -0
  129. package/04-recipes/longform/content.md +51 -0
  130. package/04-recipes/longform/longform.html +627 -0
  131. package/04-recipes/report/README.md +176 -0
  132. package/04-recipes/report/demo.html +355 -0
  133. package/04-recipes/report/report.css +364 -0
  134. package/04-recipes/table/README.md +103 -0
  135. package/04-recipes/table/demo.html +455 -0
  136. package/04-recipes/table/table.css +372 -0
  137. package/04-recipes/tierA-tokens.css +189 -0
  138. package/09-assets/README.md +74 -0
  139. package/09-assets/bar/README.md +94 -0
  140. package/09-assets/bar/bar.css +166 -0
  141. package/09-assets/bar/bar.js +320 -0
  142. package/09-assets/bar/demo.html +176 -0
  143. package/09-assets/echarts-adapter/demo.html +192 -0
  144. package/09-assets/echarts-adapter/echarts-adapter.js +277 -0
  145. package/09-assets/model-viewer/README.md +155 -0
  146. package/09-assets/model-viewer/demo.html +105 -0
  147. package/09-assets/model-viewer/model-viewer.css +143 -0
  148. package/09-assets/model-viewer/model-viewer.js +423 -0
  149. package/09-assets/scientific-plot/README.md +94 -0
  150. package/09-assets/scientific-plot/demo.html +252 -0
  151. package/09-assets/scientific-plot/scientific-plot.css +141 -0
  152. package/09-assets/scientific-plot/scientific-plot.js +610 -0
  153. package/09-assets/sparkline/README.md +153 -0
  154. package/09-assets/sparkline/demo.html +163 -0
  155. package/09-assets/sparkline/sparkline.css +158 -0
  156. package/09-assets/sparkline/sparkline.js +508 -0
  157. package/API.md +332 -0
  158. package/CHANGELOG.md +3138 -0
  159. package/CODE_OF_CONDUCT.md +64 -0
  160. package/CONTRIBUTING.md +89 -0
  161. package/ERRORS.md +1658 -0
  162. package/LICENSE +21 -0
  163. package/README.md +497 -2
  164. package/SECURITY.md +72 -0
  165. package/START-HERE.md +164 -0
  166. package/SUPPORT.md +109 -0
  167. package/adapters/presentation/README.md +113 -0
  168. package/adapters/presentation/check.js +101 -0
  169. package/adapters/presentation/deck.schema.json +74 -0
  170. package/adapters/presentation/to-doc.js +138 -0
  171. package/ai/START-HERE.md +104 -0
  172. package/ai/behaviors.json +380 -0
  173. package/ai/behaviors.schema.json +61 -0
  174. package/ai/capabilities.json +56 -0
  175. package/ai/cli.js +387 -0
  176. package/ai/components.json +1944 -0
  177. package/ai/components.meta.json +168 -0
  178. package/ai/components.schema.json +220 -0
  179. package/ai/contract.schema.json +147 -0
  180. package/ai/deprecations.json +55 -0
  181. package/ai/deprecations.schema.json +85 -0
  182. package/ai/motion-policy.json +22 -0
  183. package/ai/patch.js +323 -0
  184. package/ai/patch.schema.json +63 -0
  185. package/ai/profiles.json +92 -0
  186. package/ai/tokens.audience.json +55 -0
  187. package/ai/tokens.audience.schema.json +73 -0
  188. package/ai/tokens.json +762 -0
  189. package/ai/tokens.schema.json +58 -0
  190. package/ai/tokens.tree.json +752 -0
  191. package/ai/tokens.tree.schema.json +56 -0
  192. package/ai/validate.js +383 -0
  193. package/dist/01-tokens/behavior/dismissable.js +60 -0
  194. package/dist/01-tokens/behavior/emit.js +21 -0
  195. package/dist/01-tokens/behavior/focus-return.js +31 -0
  196. package/dist/01-tokens/behavior/roving.js +77 -0
  197. package/dist/01-tokens/behavior/typeahead.js +61 -0
  198. package/dist/01-tokens/focus-ring.css +1 -0
  199. package/dist/01-tokens/page.css +1 -0
  200. package/dist/01-tokens/polyfill.js +78 -0
  201. package/dist/01-tokens/scrollbar.css +1 -0
  202. package/dist/01-tokens/theme-toggle.js +61 -0
  203. package/dist/01-tokens/tokens.css +1 -0
  204. package/dist/01-tokens/typography.css +1 -0
  205. package/dist/02-primitives/badge/badge.css +1 -0
  206. package/dist/02-primitives/button/button.css +1 -0
  207. package/dist/02-primitives/card/card.css +1 -0
  208. package/dist/02-primitives/choice/choice.css +1 -0
  209. package/dist/02-primitives/combobox/combobox.css +1 -0
  210. package/dist/02-primitives/combobox/combobox.js +439 -0
  211. package/dist/02-primitives/date-range/date-range.css +1 -0
  212. package/dist/02-primitives/date-range/date-range.js +267 -0
  213. package/dist/02-primitives/input/input.css +1 -0
  214. package/dist/02-primitives/popover/popover.css +1 -0
  215. package/dist/02-primitives/popover/popover.js +257 -0
  216. package/dist/02-primitives/progress/progress.css +1 -0
  217. package/dist/02-primitives/select/select.css +1 -0
  218. package/dist/02-primitives/select/select.js +449 -0
  219. package/dist/02-primitives/separator/separator.css +1 -0
  220. package/dist/02-primitives/skeleton/skeleton.css +1 -0
  221. package/dist/02-primitives/switch/switch.css +1 -0
  222. package/dist/03-patterns/accordion/accordion.css +1 -0
  223. package/dist/03-patterns/accordion/accordion.js +219 -0
  224. package/dist/03-patterns/content/content.css +1 -0
  225. package/dist/03-patterns/drawer/drawer.css +1 -0
  226. package/dist/03-patterns/drawer/drawer.js +229 -0
  227. package/dist/03-patterns/dropdown/dropdown.css +1 -0
  228. package/dist/03-patterns/dropdown/dropdown.js +365 -0
  229. package/dist/03-patterns/form-validation/form-validation.css +1 -0
  230. package/dist/03-patterns/list/flip.js +117 -0
  231. package/dist/03-patterns/list/list.css +1 -0
  232. package/dist/03-patterns/nav/nav.css +1 -0
  233. package/dist/03-patterns/nav/nav.js +322 -0
  234. package/dist/03-patterns/nav/toc.js +76 -0
  235. package/dist/03-patterns/overlay/overlay.css +1 -0
  236. package/dist/03-patterns/overlay/overlay.js +398 -0
  237. package/dist/03-patterns/pagination/pagination.css +1 -0
  238. package/dist/03-patterns/pagination/pagination.js +273 -0
  239. package/dist/03-patterns/reveal/reveal.css +1 -0
  240. package/dist/03-patterns/reveal/reveal.js +138 -0
  241. package/dist/03-patterns/states/states.css +1 -0
  242. package/dist/03-patterns/tabs/tabs.css +1 -0
  243. package/dist/03-patterns/tabs/tabs.js +242 -0
  244. package/dist/03-patterns/tooltip/tooltip.css +1 -0
  245. package/dist/03-patterns/tooltip/tooltip.js +213 -0
  246. package/dist/03-patterns/tree/tree.css +1 -0
  247. package/dist/03-patterns/tree/tree.js +383 -0
  248. package/dist/04-recipes/analysis-report/analysis-report.css +1 -0
  249. package/dist/04-recipes/detail-page/detail-page.css +1 -0
  250. package/dist/04-recipes/report/report.css +1 -0
  251. package/dist/04-recipes/table/table.css +1 -0
  252. package/dist/04-recipes/tierA-tokens.css +1 -0
  253. package/dist/09-assets/bar/bar.css +1 -0
  254. package/dist/09-assets/bar/bar.js +222 -0
  255. package/dist/09-assets/echarts-adapter/echarts-adapter.js +185 -0
  256. package/dist/09-assets/model-viewer/model-viewer.css +1 -0
  257. package/dist/09-assets/model-viewer/model-viewer.js +320 -0
  258. package/dist/09-assets/scientific-plot/scientific-plot.css +1 -0
  259. package/dist/09-assets/scientific-plot/scientific-plot.js +568 -0
  260. package/dist/09-assets/sparkline/sparkline.css +1 -0
  261. package/dist/09-assets/sparkline/sparkline.js +265 -0
  262. package/dist/COSTS.md +56 -0
  263. package/docs/AI-CONTRACT.md +197 -0
  264. package/docs/BACKLOG.md +127 -0
  265. package/docs/BENCHMARK.md +252 -0
  266. package/docs/GUIDANCE.md +154 -0
  267. package/docs/INVARIANT.md +372 -0
  268. package/docs/LAYER-BASELINE.md +158 -0
  269. package/docs/RELEASING.md +311 -0
  270. package/docs/RFC-THEME-SCOPE.md +141 -0
  271. package/docs/ROADMAP.md +182 -0
  272. package/index.html +82 -0
  273. package/package.json +107 -4
  274. package/types/index.d.ts +310 -0
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * to-doc.js — deck → 核心契约文档
4
+ *
5
+ * ============================================================================
6
+ * 🔴 这个文件存在的全部意义
7
+ * ----------------------------------------------------------------------------
8
+ * 把「呈现语义」和「组件结构」**分开存放**:
9
+ *
10
+ * deck.json slide / layout / role —— 呈现形态的事,本层负责
11
+ * doc.json 节点 / 组件 / 插槽 —— 核心的事,核心负责
12
+ *
13
+ * 转换时,呈现语义被塞进每个节点的 `extensions.presentation`。
14
+ * ⇒ 核心校验器看到它:忽略(前向兼容,不判非法)
15
+ * ⇒ 本层看到它:知道这一页是第几页、这个节点是什么角色
16
+ *
17
+ * ⇒ **核心不需要知道 PPT 存在。** 这句话不是口号,是可以 grep 验证的:
18
+ * grep -ril 'slide\|deck' 01-tokens 02-primitives 03-patterns 04-recipes
19
+ * ⇒ 0 命中(由 05-audit/core-boundary-gate.py 守住)
20
+ *
21
+ * ============================================================================
22
+ * 用法
23
+ * ----------------------------------------------------------------------------
24
+ * node adapters/presentation/to-doc.js deck.json [-o doc.json]
25
+ * ============================================================================
26
+ */
27
+ 'use strict';
28
+
29
+ var fs = require('fs');
30
+ var path = require('path');
31
+
32
+ /**
33
+ * 读命令行开关。支持 `-o x` / `-o=x` / `--o=x` / `--o x` 四种写法。
34
+ * ⚠️ 第一版只认双横线 ⇒ `-o out.json` 被静默忽略,
35
+ * 结果文档被打印到 stdout 而**文件没写出来** ⇒ 下游 ENOENT(实测)。
36
+ * **参数没生效却不报错**,是最难查的一类失败。
37
+ */
38
+ function flag(name, def) {
39
+ for (var i = 0; i < process.argv.length; i++) {
40
+ var a = process.argv[i];
41
+ if (a === '-' + name || a === '--' + name) {
42
+ var v = process.argv[i + 1];
43
+ if (v !== undefined && v.charAt(0) !== '-') return v;
44
+ return def;
45
+ }
46
+ if (a.indexOf('-' + name + '=') === 0 || a.indexOf('--' + name + '=') === 0) {
47
+ return a.slice(a.indexOf('=') + 1);
48
+ }
49
+ }
50
+ return def;
51
+ }
52
+
53
+ function toDoc(deck) {
54
+ var nodes = {};
55
+ var root = [];
56
+
57
+ (deck.slides || []).forEach(function (slide, si) {
58
+ var slideId = 'slide-' + (slide.id || (si + 1));
59
+ var childIds = [];
60
+
61
+ (slide.nodes || []).forEach(function (n, ni) {
62
+ var id = n.id || (slideId + '-n' + (ni + 1));
63
+ var node = {
64
+ id: id,
65
+ kind: n.kind,
66
+ extensions: {
67
+ presentation: {
68
+ slide: si + 1,
69
+ slideId: slideId,
70
+ layout: slide.layout || null,
71
+ role: n.role || null
72
+ }
73
+ }
74
+ };
75
+ if (n.text !== undefined) node.text = n.text;
76
+ if (n.props) node.props = n.props;
77
+ if (n.children) node.children = n.children;
78
+ if (n.extensions) {
79
+ Object.keys(n.extensions).forEach(function (k) {
80
+ node.extensions[k] = n.extensions[k];
81
+ });
82
+ }
83
+ nodes[id] = node;
84
+ childIds.push(id);
85
+ });
86
+
87
+ nodes[slideId] = {
88
+ id: slideId,
89
+ kind: 'section',
90
+ children: childIds,
91
+ extensions: {
92
+ presentation: {
93
+ slide: si + 1,
94
+ layout: slide.layout || null,
95
+ title: slide.title || null
96
+ }
97
+ }
98
+ };
99
+ root.push(slideId);
100
+ });
101
+
102
+ return {
103
+ schemaVersion: '1.0.0',
104
+ profile: 'standard',
105
+ root: root,
106
+ nodes: nodes,
107
+ extensions: {
108
+ presentation: {
109
+ adapter: 'presentation',
110
+ adapterVersion: '1.0.0',
111
+ deckTitle: deck.title || null,
112
+ slideCount: (deck.slides || []).length
113
+ }
114
+ }
115
+ };
116
+ }
117
+
118
+ function main() {
119
+ var file = process.argv[2];
120
+ if (!file) {
121
+ process.stderr.write('用法:to-doc.js <deck.json> [-o doc.json]\n');
122
+ process.exit(1);
123
+ }
124
+ var deck = JSON.parse(fs.readFileSync(file, 'utf8'));
125
+ var doc = toDoc(deck);
126
+ var o = flag('o', null);
127
+ var txt = JSON.stringify(doc, null, 2) + '\n';
128
+ if (o) {
129
+ fs.writeFileSync(o, txt);
130
+ process.stdout.write(' 已写出 ' + o + '(' + (deck.slides || []).length +
131
+ ' 页 / ' + Object.keys(doc.nodes).length + ' 个节点)\n');
132
+ } else {
133
+ process.stdout.write(txt);
134
+ }
135
+ }
136
+
137
+ if (require.main === module) main();
138
+ module.exports = { toDoc: toDoc };
@@ -0,0 +1,104 @@
1
+ # AI 使用入口(frontend-lib)
2
+
3
+ > **本文件只做导航,不复制契约与组件文档。** 要细节就去它指的地方看。
4
+
5
+ ## 0 · 先记住一件事
6
+
7
+ **本库提供的是可选工程资产,不是所有 HTML/网站都必须遵守的统一规范。**
8
+
9
+ - 组件不适用时,用别的实现 —— **不要为满足本库的实现偏好而牺牲任务结果**。
10
+ - 修改已有网站时,**先看它原有的框架、组件和样式体系**,能沿用就沿用。
11
+ - PPT、文档、邮件等其他输出形态**不自动继承**本库的网页布局规则。
12
+ - 选组件看**实际实现、API、示例、适用场景**,不要只凭组件名称和成熟度字段判断。
13
+
14
+ ## 1 · 这个库提供什么
15
+
16
+ | 能力 | 位置 |
17
+ |---|---|
18
+ | 设计令牌(色/间距/字号/圆角,明暗双主题,纯 CSS 无需 JS) | `01-tokens/tokens.css` |
19
+ | 排版与页面骨架(**选配**,写在 `class="page"` 上才生效) | `01-tokens/typography.css`、`page.css` |
20
+ | 组件(CSS 为主 + 可选 JS) | `02-primitives/`、`03-patterns/` |
21
+ | 微行为核(Esc 关闭 / 焦点归还 / 方向键游走) | `01-tokens/behavior/` |
22
+ | 页面级示例 | `04-recipes/`(清单见下节) |
23
+ | 图表与可视化资产 | `09-assets/`(清单见下节) |
24
+ | 机器可读契约 + 命令行 | `ai/*.json`、`ai/cli.js` |
25
+
26
+ **没有的**(别找):图标、React/Vue 组件(只有 CSS 类)、构建配置。
27
+
28
+ > 🔴 下面这一段里的**数字与目录清单会漂移**(加一个组件就错一处),
29
+ > 所以它由 `05-audit/fix-start-here.py` 生成;手改会被 `npm run gate` 判为漂移。
30
+ > 它的值直接从 `ai/components.json` 与目录实际内容读出来 —— **不信上面的说法,信这个**。
31
+
32
+ <!-- ==== AI-INVENTORY-BEGIN ==== -->
33
+ - 组件 **35** 个(`beta` 4 · `stable` 31)
34
+ - `04-recipes/`(页面级示例):`analysis-report`(组合型研究报告:正文 + 辅助栏并排,窄屏退回单栏) · `data-showcase`(四种数据表达方式对照:我到底该用哪个) · `detail-page`(实体详情页骨架:字段齐全 / 部分缺失 / 无数据,三态同构(DOM 不变)) · `longform`(单栏长文排版与阅读节奏) · `report`(报告版式系统 v1:共享基础 + 三种版式取舍(杂志 / 科研技术 / 金融研究)) · `table`(专业数据表格:列级格式与单位,三种用途预设)
35
+ - `09-assets/`(图表与可视化):`bar`(柱状图,含 charter 13 图表规范的裁剪铁律) · `echarts-adapter`(把令牌喂给 ECharts,按需引入;本库不含 ECharts) · `model-viewer`(惰性加载的 3D 模型查看器) · `scientific-plot`(二维科学绘图:坐标轴 / 误差棒 / 置信区间带 / 对数轴) · `sparkline`(迷你趋势线,没有坐标轴的走势提示)
36
+ <!-- ==== AI-INVENTORY-END ==== -->
37
+
38
+ ## 2 · 什么时候值得用 / 什么时候别用
39
+
40
+ | 值得用 | 别用 |
41
+ |---|---|
42
+ | 从零写移动端页面,想要现成的暗色与无障碍基线 | 宿主已有成熟组件库(沿用它的) |
43
+ | 要弹层/标签页/折叠面板且要求键盘可达 | 只要一两个样式,引整个库不划算 |
44
+ | 单文件页不能外链 CSS(用 `04-recipes/tierA-tokens.css`) | 要 date-picker / calendar / upload 这类大而全控件 |
45
+
46
+ ## 3 · 怎么查
47
+
48
+ | 想查什么 | 去哪 |
49
+ |---|---|
50
+ | 有哪些组件、多大、JS 是否必需 | 根目录 `START-HERE.md`(组件表由 `05-audit/fix-start-here.py` 生成,不会漂移) |
51
+ | 组件清单与成熟度 | `node ai/cli.js components --maturity=stable` |
52
+ | 令牌名与取值 | `node ai/cli.js tokens --mode=dark`、`node ai/cli.js tree`(分层视图) |
53
+ | 组件真实长什么样 | 该组件目录下的 `demo.html` |
54
+ | 页面怎么搭 | `04-recipes/` 下的示例 |
55
+ | 令牌怎么改 | README「主题定制」(覆盖 CSS 变量,不需重新编译) |
56
+
57
+ **类名即 API**(`.btn`、`.btn--primary`)。改样式改**令牌**,不要改类名,
58
+ 也不要在页面里重写组件选择器(会被更高特异性静默盖掉,成为死声明)。
59
+
60
+ ## 4 · 怎么判断一项能力是否经过验证
61
+
62
+ | 信号 | 怎么看 |
63
+ |---|---|
64
+ | 成熟度 | `ai/components.json` 的 `maturity` 是**算出来的**(判据在 `ai/components.meta.json`),不是人写的 |
65
+ | 有没有 demo | 组件目录下有 `demo.html` 就能直接跑起来对照 |
66
+ | 有没有门禁守 | `05-audit/check-all.sh`(`npm run gate`)一次跑全,逐项打印 `PASS`/`FAIL`/`SKIP` |
67
+ | 浏览器支持 | README「浏览器支持」表:桌面 Chrome/Edge/Firefox 已验证;**iOS/Android WebView 未在真机验证** |
68
+
69
+ ⚠️ **未在真机验证的项就是没验证**,不要替它打包票。
70
+
71
+ ## 5 · 什么时候应当沿用宿主项目现有技术
72
+
73
+ - 宿主已有设计系统 / 组件库 ⇒ 用它的,本库只在确实缺一块时补。
74
+ - 宿主已有构建与样式方案 ⇒ 不要为引入本库改它的构建。
75
+ - 宿主页面既有布局能达成目标 ⇒ 改它的局部,不要套本库的页面骨架。
76
+ - 输出形态不是网页(PPT / 文档 / 邮件)⇒ 本库的网页布局规则**不适用**。
77
+
78
+ ## 6 · 怎么跑已有检查
79
+
80
+ ```bash
81
+ npm ci # 按锁文件安装(首次)
82
+ npm test # 单元测试
83
+ npm run test:types # 类型契约:正例必过 + 反例必挂
84
+ npm run gate:fast # 静态检查(约 45 秒,改代码时跑)
85
+ npm run gate # 全量检查(含浏览器,提交前跑)
86
+ node ai/cli.js check <doc.json> # 校验契约文档(读 JSON,不解析原始 HTML)
87
+ ```
88
+
89
+ 改动本库**自身**时的分层(决定该动哪一层):
90
+
91
+ | 层 | 文件 | 性质 |
92
+ |---|---|---|
93
+ | 不变式 | `docs/INVARIANT.md` | 客观事实,有门禁守边界 |
94
+ | 契约 | `ai/*.json` | 版本化约定 |
95
+ | 建议 | `docs/GUIDANCE.md` | 工作建议,可整份推翻 |
96
+
97
+ > `docs/GUIDANCE.md` 里「贴进 system prompt 的极简版」的适用范围是
98
+ > **维护 frontend-lib 自身或严格按本库范式写页面**,不是所有 HTML 任务的通用规则。
99
+
100
+ ## 7 · 三句话版本
101
+
102
+ 1. 这是**可选**资产;不适用就用别的,别硬套。
103
+ 2. 查组件去根目录 `START-HERE.md` 和组件自己的 `demo.html`,别猜。
104
+ 3. 改样式改令牌、保留类名;提交前跑 `npm run gate`。
@@ -0,0 +1,380 @@
1
+ {
2
+ "_comment": "行为覆盖矩阵:哪些组件必须有哪种行为。四种状态:core=已收编到核(门禁核实用了核)/ manual=有手写实现但未收编(必须写现状)/ gap=应当有但根本没实现(必须写理由,计入缺口预算)/ n/a=不适用(必须写理由)。⚠️ 不登记 = 红:不许靠省略跳过。manual 与 gap 的数量受 budget 棘轮约束,只能降不能升。",
3
+ "version": "0.6.2",
4
+ "behaviors": {
5
+ "dismissable": {
6
+ "coreFile": "01-tokens/behavior/dismissable.js",
7
+ "gate": "05-audit/dismissable-check.js",
8
+ "fn": "flDismissable",
9
+ "meaning": "Esc 关闭 + 点击浮层之外关闭"
10
+ },
11
+ "focus-return": {
12
+ "coreFile": "01-tokens/behavior/focus-return.js",
13
+ "gate": "05-audit/focus-return-check.js",
14
+ "fn": "flFocusReturn",
15
+ "meaning": "记住打开时的焦点,关闭时还回去"
16
+ },
17
+ "roving": {
18
+ "coreFile": "01-tokens/behavior/roving.js",
19
+ "gate": "05-audit/roving-check.js",
20
+ "fn": "flRoving",
21
+ "meaning": "方向键在一组项里移动 DOM 焦点(roving tabindex)"
22
+ },
23
+ "typeahead": {
24
+ "coreFile": "01-tokens/behavior/typeahead.js",
25
+ "gate": "05-audit/typeahead-check.js",
26
+ "fn": "flTypeahead",
27
+ "meaning": "打字母/汉字跳到匹配项(不是过滤)"
28
+ }
29
+ },
30
+ "budget": {
31
+ "manual": 2,
32
+ "gap": 2
33
+ },
34
+ "matrix": {
35
+ "dismissable": {
36
+ "combobox": [
37
+ "core",
38
+ "0.8.8 收编:为此给核加了**返回值语义**(onDismiss 返回 false ⇒ 核不preventDefault/stopPropagation),才能表达本组件的三级 Esc:① 关列表 ② 清输入 ③ 放弃(不干预,Esc 继续传给外层)。契约门禁「Esc 先关列表再清输入」实测通过。"
39
+ ],
40
+ "date-range": [
41
+ "n/a",
42
+ "不是浮层:内联表单(两个日期输入 + 预设 + 错误提示),没有打开/关闭状态"
43
+ ],
44
+ "popover": [
45
+ "core",
46
+ ""
47
+ ],
48
+ "select": [
49
+ "core",
50
+ "0.8.6 收编:删掉手写的 document click(冒泡阶段判定)与 keydown 里的 Esc 分支;Esc 的 stopPropagation(只关最内层)由核统一承担"
51
+ ],
52
+ "accordion": [
53
+ "n/a",
54
+ "展开/收起是内容显隐,没有'关闭'语义;Esc 不参与"
55
+ ],
56
+ "drawer": [
57
+ "manual",
58
+ "0.8.6 评估后**决定不收编**:drawer 已经是**模态**弹层,它的 dismissable 只含 Esc;点遮罩关闭是它自己的语义(overlay 负责遮罩)。核的 onDocClick 会把「点遮罩」当成 outside 触发,而 drawer 想忽略非Esc 的关闭原因 ⇒ 需要给核加\"忽略 outside\"的开关,属于改核而不是接线。暂不做。"
59
+ ],
60
+ "dropdown": [
61
+ "core",
62
+ ""
63
+ ],
64
+ "flip": [
65
+ "n/a",
66
+ "纯过渡工具(FLIP 动画),没有浮层"
67
+ ],
68
+ "toc": [
69
+ "n/a",
70
+ "目录导航,纯链接跳转,没有浮层"
71
+ ],
72
+ "nav": [
73
+ "core",
74
+ "0.11.2 收编:抽屉的「Esc 关闭」直接走核。⚠️ 遮罩**不能**写进 inside —— 写进去就等于声明\"点遮罩算内部\",那一句\"点遮罩关闭\"的注释会立刻变成谎话(实测过,关不掉)"
75
+ ],
76
+ "overlay": [
77
+ "manual",
78
+ "0.8.6 评估后**决定不收编**:dialog 是模态,**点外部不该关闭**(那是 modal 的定义)。核的 onDocClick 天然会处理 outside ⇒ 收编等于给 dialog 引入错误行为。overlay 只需 Esc 那一半,Esc 已在组件内正确实现(不依赖全局栈)。"
79
+ ],
80
+ "pagination": [
81
+ "n/a",
82
+ "分页控件常驻页面,没有浮层"
83
+ ],
84
+ "tabs": [
85
+ "n/a",
86
+ "面板切换不是浮层;Esc 无语义"
87
+ ],
88
+ "tooltip": [
89
+ "core",
90
+ "0.8.6 收编:手写的 document click(冒泡阶段)换成核的捕获阶段判定,顺带修掉\"点浮层内部也会关\""
91
+ ],
92
+ "tree": [
93
+ "n/a",
94
+ "常驻结构,没有'打开'状态;Esc 无语义"
95
+ ],
96
+ "bar": [
97
+ "n/a",
98
+ "图表:canvas 绘制,没有浮层"
99
+ ],
100
+ "echarts-adapter": [
101
+ "n/a",
102
+ "图表适配器:只做数据转换,没有浮层"
103
+ ],
104
+ "model-viewer": [
105
+ "n/a",
106
+ "三维查看器:canvas 交互,没有浮层"
107
+ ],
108
+ "sparkline": [
109
+ "n/a",
110
+ "迷你图:SVG 绘制,没有浮层"
111
+ ],
112
+ "scientific-plot": [
113
+ "n/a",
114
+ "科学绘图:SVG 绘制,没有浮层"
115
+ ],
116
+ "reveal": [
117
+ "n/a",
118
+ "不是浮层:入场由 IntersectionObserver 触发,没有打开/关闭状态"
119
+ ]
120
+ },
121
+ "focus-return": {
122
+ "combobox": [
123
+ "n/a",
124
+ "焦点从未离开输入框,无所谓归位"
125
+ ],
126
+ "date-range": [
127
+ "n/a",
128
+ "焦点一直在日期输入上"
129
+ ],
130
+ "popover": [
131
+ "core",
132
+ ""
133
+ ],
134
+ "select": [
135
+ "core",
136
+ "0.8.6 收编:open() 里 fr.save()、close() 里 fr.restore()(close(false) 的 Tab 场景不夺焦点,语义正好对上核的「记了才还」)"
137
+ ],
138
+ "accordion": [
139
+ "n/a",
140
+ "焦点一直在标题按钮上"
141
+ ],
142
+ "drawer": [
143
+ "core",
144
+ ""
145
+ ],
146
+ "dropdown": [
147
+ "core",
148
+ "0.8.6 收编:open() 里 fr.save()、close() 里 fr.restore(),替掉手写的 btn.focus() + document.contains 判存活"
149
+ ],
150
+ "flip": [
151
+ "n/a",
152
+ "动画工具,不涉及焦点"
153
+ ],
154
+ "toc": [
155
+ "n/a",
156
+ "链接跳转,焦点随链接走"
157
+ ],
158
+ "nav": [
159
+ "core",
160
+ "0.11.2 收编:焦点回给汉堡按钮。fallback 也指向汉堡 —— 抽屉是在它自己内部关掉的,此时\"打开前的焦点\"可能已经不可见(变宽自关路径)"
161
+ ],
162
+ "overlay": [
163
+ "core",
164
+ "0.8.6 收编并修掉真 bug:原来条件是 focusIsMine && ...,而 focusIsMine 在本文件里不存在 ⇒ 恒假 ⇒ 焦点从来没还过(门禁「关闭后焦点归位」一直靠这条假绿过关,反向控制确认判据有牙)"
165
+ ],
166
+ "pagination": [
167
+ "n/a",
168
+ "焦点常驻页码按钮"
169
+ ],
170
+ "tabs": [
171
+ "n/a",
172
+ "焦点一直在 tab 组内"
173
+ ],
174
+ "tooltip": [
175
+ "core",
176
+ "0.8.6 收编:show() 里fr.save() 记焦点、Esc 关闭时 restore(),不再手写 el.focus()(手写版在触发元素已被移除时 focus 一个不存在的元素)"
177
+ ],
178
+ "tree": [
179
+ "n/a",
180
+ "焦点一直在树内"
181
+ ],
182
+ "bar": [
183
+ "n/a",
184
+ "图表不涉及焦点"
185
+ ],
186
+ "echarts-adapter": [
187
+ "n/a",
188
+ "图表适配器不涉及焦点"
189
+ ],
190
+ "model-viewer": [
191
+ "n/a",
192
+ "三维查看器:canvas 交互,不涉及这组浮层焦点"
193
+ ],
194
+ "sparkline": [
195
+ "n/a",
196
+ "迷你图不涉及焦点"
197
+ ],
198
+ "scientific-plot": [
199
+ "n/a",
200
+ "科学绘图不涉及焦点"
201
+ ],
202
+ "reveal": [
203
+ "n/a",
204
+ "不改焦点、不接管键盘"
205
+ ]
206
+ },
207
+ "roving": {
208
+ "combobox": [
209
+ "n/a",
210
+ "aria-activedescendant 模式:焦点常驻 input,核靠 e.target 判断当前项 ⇒ 收不到"
211
+ ],
212
+ "date-range": [
213
+ "n/a",
214
+ "没有'一组项'"
215
+ ],
216
+ "popover": [
217
+ "n/a",
218
+ "浮层里没有项的集合"
219
+ ],
220
+ "select": [
221
+ "n/a",
222
+ "aria-activedescendant 模式:焦点常驻按钮"
223
+ ],
224
+ "accordion": [
225
+ "gap",
226
+ "APG 把方向键列为**可选**增强,本库未实现;要做就应走 roving 核,不该再手写一份"
227
+ ],
228
+ "drawer": [
229
+ "n/a",
230
+ "焦点陷阱(Tab 在首尾间循环)不是方向键游走"
231
+ ],
232
+ "dropdown": [
233
+ "core",
234
+ "tabindex:false —— APG 菜单的菜单项按规范全部 -1,核只接管步进"
235
+ ],
236
+ "flip": [
237
+ "n/a",
238
+ "动画工具,没有项集合"
239
+ ],
240
+ "toc": [
241
+ "n/a",
242
+ "目录是链接列表,按 Tab 逐个走是正确行为"
243
+ ],
244
+ "nav": [
245
+ "n/a",
246
+ "导航是一列链接,按 Tab 逐个走是正确行为(同 toc);APG 没有对导航列表要求方向键游走"
247
+ ],
248
+ "overlay": [
249
+ "n/a",
250
+ "焦点陷阱,不是方向键游走"
251
+ ],
252
+ "pagination": [
253
+ "n/a",
254
+ "←→/Home·End 是**翻页命令**,不是在一组项里移动焦点"
255
+ ],
256
+ "tabs": [
257
+ "core",
258
+ ""
259
+ ],
260
+ "tooltip": [
261
+ "n/a",
262
+ "没有项集合"
263
+ ],
264
+ "tree": [
265
+ "core",
266
+ ""
267
+ ],
268
+ "bar": [
269
+ "n/a",
270
+ "图表没有可聚焦的项集合"
271
+ ],
272
+ "echarts-adapter": [
273
+ "n/a",
274
+ "图表适配器没有项集合"
275
+ ],
276
+ "model-viewer": [
277
+ "n/a",
278
+ "方向键是**相机平移**(OrbitControls),不是 UI 项游走"
279
+ ],
280
+ "sparkline": [
281
+ "n/a",
282
+ "迷你图没有项集合"
283
+ ],
284
+ "scientific-plot": [
285
+ "n/a",
286
+ "科学绘图的坐标轴/刻度不是可游走的 UI 项集合"
287
+ ],
288
+ "reveal": [
289
+ "n/a",
290
+ "不是复合控件:没有一组可聚焦项要在其间移动"
291
+ ]
292
+ },
293
+ "typeahead": {
294
+ "combobox": [
295
+ "n/a",
296
+ "有输入框,**打字即过滤**;用 typeahead 会每打一个字就把焦点拽走"
297
+ ],
298
+ "date-range": [
299
+ "n/a",
300
+ "没有候选项集合"
301
+ ],
302
+ "popover": [
303
+ "n/a",
304
+ "没有候选项集合"
305
+ ],
306
+ "select": [
307
+ "core",
308
+ ""
309
+ ],
310
+ "accordion": [
311
+ "n/a",
312
+ "标题数量少,APG 未要求"
313
+ ],
314
+ "drawer": [
315
+ "n/a",
316
+ "没有候选项集合"
317
+ ],
318
+ "dropdown": [
319
+ "gap",
320
+ "APG 菜单支持'按首字母跳到菜单项'(可选增强),本库未实现;要做就走 typeahead 核"
321
+ ],
322
+ "flip": [
323
+ "n/a",
324
+ "动画工具"
325
+ ],
326
+ "toc": [
327
+ "n/a",
328
+ "目录是链接列表,浏览器自带链接查找"
329
+ ],
330
+ "nav": [
331
+ "n/a",
332
+ "导航列表没有候选项集合,也没有\"打首字母跳项\"的契约;浏览器自带链接查找"
333
+ ],
334
+ "overlay": [
335
+ "n/a",
336
+ "没有候选项集合"
337
+ ],
338
+ "pagination": [
339
+ "n/a",
340
+ "页码是数字,不适用首字母跳转"
341
+ ],
342
+ "tabs": [
343
+ "n/a",
344
+ "APG Tabs 未要求 typeahead"
345
+ ],
346
+ "tooltip": [
347
+ "n/a",
348
+ "没有候选项集合"
349
+ ],
350
+ "tree": [
351
+ "core",
352
+ ""
353
+ ],
354
+ "bar": [
355
+ "n/a",
356
+ "图表没有候选项集合"
357
+ ],
358
+ "echarts-adapter": [
359
+ "n/a",
360
+ "图表适配器没有候选项集合"
361
+ ],
362
+ "model-viewer": [
363
+ "n/a",
364
+ "没有候选项集合"
365
+ ],
366
+ "sparkline": [
367
+ "n/a",
368
+ "迷你图没有候选项集合"
369
+ ],
370
+ "scientific-plot": [
371
+ "n/a",
372
+ "科学绘图没有候选项集合"
373
+ ],
374
+ "reveal": [
375
+ "n/a",
376
+ "不是复合控件:没有可键入定位的集合"
377
+ ]
378
+ }
379
+ }
380
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://frontend-lib.dev/ai/behaviors.schema.json",
4
+ "title": "frontend-lib 行为覆盖矩阵",
5
+ "$comment": [
6
+ "描述 ai/behaviors.json 的形状:**哪些组件必须有哪种微行为**。",
7
+ "",
8
+ "🔴 为什么这份表要存在:四个微行为核抽完之后,『谁还没收编』『谁不适用』",
9
+ " 只写在人的脑子里 ⇒ 『不适用』和『忘了做』看起来一模一样。",
10
+ "",
11
+ "🔴 四种状态:",
12
+ " core 已收编到核(门禁会去源码里核实真的用了核)",
13
+ " manual 有手写实现但未收编(必须写现状)",
14
+ " gap 应当有但根本没实现(必须写理由,计入缺口预算)",
15
+ " n/a 不适用(必须写理由)",
16
+ "",
17
+ "⚠️ 不登记 = 门禁红:不许靠省略跳过。",
18
+ "⚠️ manual / gap 的数量受 budget 棘轮约束,只能降、不能升。",
19
+ "",
20
+ "⚠️ 本 schema 只用了 ai/validate.js 白名单里的关键字(propertyNames 不在",
21
+ " 白名单里 ⇒ 不能用;键名合法性由 behavior-matrix-gate.py 的第 ⑥ 条守)。"
22
+ ],
23
+ "type": "object",
24
+ "required": ["version", "behaviors", "budget", "matrix"],
25
+ "properties": {
26
+ "version": { "type": "string" },
27
+ "behaviors": {
28
+ "type": "object",
29
+ "additionalProperties": {
30
+ "type": "object",
31
+ "required": ["coreFile", "gate", "fn", "meaning"],
32
+ "properties": {
33
+ "coreFile": { "type": "string" },
34
+ "gate": { "type": "string" },
35
+ "fn": { "type": "string", "pattern": "^fl[A-Z]" },
36
+ "meaning": { "type": "string", "minLength": 1 }
37
+ }
38
+ }
39
+ },
40
+ "budget": {
41
+ "type": "object",
42
+ "required": ["manual", "gap"],
43
+ "properties": {
44
+ "manual": { "type": "integer", "minimum": 0 },
45
+ "gap": { "type": "integer", "minimum": 0 }
46
+ }
47
+ },
48
+ "matrix": {
49
+ "type": "object",
50
+ "additionalProperties": {
51
+ "type": "object",
52
+ "additionalProperties": {
53
+ "type": "array",
54
+ "minItems": 2,
55
+ "maxItems": 2,
56
+ "items": { "type": "string" }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }