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
package/index.html ADDED
@@ -0,0 +1,82 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6
+ <meta name="color-scheme" content="light dark">
7
+ <title>frontend-lib · 演示</title>
8
+ <link rel="stylesheet" href="01-tokens/tokens.css">
9
+ <link rel="stylesheet" href="01-tokens/typography.css">
10
+ <link rel="stylesheet" href="01-tokens/page.css">
11
+ <style>
12
+ ul { list-style:none; padding:0; margin:0; }
13
+ li { padding: var(--sp-2) 0; border-bottom: 1px solid var(--border-decor); }
14
+ a { color: var(--accent); text-decoration: none; display: block; }
15
+ a:active { background: var(--surface-sunken); }
16
+ .first { background: var(--surface-sunken); border: 1px solid var(--border-control);
17
+ border-radius: var(--r-md); padding: var(--sp-4); margin: 0 0 var(--sp-5); }
18
+ .first a { font-weight: 600; }
19
+ </style>
20
+ <link rel="stylesheet" href="03-patterns/nav/nav.css">
21
+ </head>
22
+ <body class="page page">
23
+ <!-- 🔴 补(a11y-scan 报 landmark-one-main / region 两违规):
24
+ 入口页必须有 <main> 地标,并提供"跳到主内容"的 skip link
25
+ (WCAG 2.4.1 Bypass Blocks)—— 键盘用户按一次 Tab 就能跳过导航。
26
+ ⚠️ 这段必须写在**生成器**里,否则每次重新生成 index.html 都会被覆盖。 -->
27
+ <a href="#main" class="skip">跳到主内容</a>
28
+ <main id="main" class="wrap">
29
+ <h1>frontend-lib · 演示</h1>
30
+ <p class="lede">
31
+ 零依赖前端组件库。全部页面可点开,<strong>在手机上直接看也可以</strong>。
32
+ </p>
33
+
34
+ <div class="first">
35
+ <p style="margin:0 0 var(--sp-2)"><strong>建议先看这个</strong></p>
36
+ <a href="10-review/ios/index.html">iOS 验证页(十项,Safari 专用)</a>
37
+ <p class="note" style="margin:var(--sp-2) 0 0">
38
+ 按钮 / 输入框 / 开关 / 单选 / 标签页 / 折叠 / 弹窗 / 趋势图 / 徽章 / 暗色
39
+ —— 每节都写了「该看到什么」。
40
+ </p>
41
+
42
+ <h2 class="rule-top">全部页面</h2>
43
+ <ul>
44
+ <li><a href="02-primitives/badge/demo.html"><code>02-primitives/badge/demo.html</code></a></li>
45
+ <li><a href="02-primitives/button/demo.html"><code>02-primitives/button/demo.html</code></a></li>
46
+ <li><a href="02-primitives/card/demo.html"><code>02-primitives/card/demo.html</code></a></li>
47
+ <li><a href="02-primitives/choice/demo.html"><code>02-primitives/choice/demo.html</code></a></li>
48
+ <li><a href="02-primitives/combobox/demo.html"><code>02-primitives/combobox/demo.html</code></a></li>
49
+ <li><a href="02-primitives/date-range/demo.html"><code>02-primitives/date-range/demo.html</code></a></li>
50
+ <li><a href="02-primitives/input/demo.html"><code>02-primitives/input/demo.html</code></a></li>
51
+ <li><a href="02-primitives/popover/demo.html"><code>02-primitives/popover/demo.html</code></a></li>
52
+ <li><a href="02-primitives/progress/demo.html"><code>02-primitives/progress/demo.html</code></a></li>
53
+ <li><a href="02-primitives/select/demo.html"><code>02-primitives/select/demo.html</code></a></li>
54
+ <li><a href="02-primitives/separator/demo.html"><code>02-primitives/separator/demo.html</code></a></li>
55
+ <li><a href="02-primitives/skeleton/demo.html"><code>02-primitives/skeleton/demo.html</code></a></li>
56
+ <li><a href="02-primitives/switch/demo.html"><code>02-primitives/switch/demo.html</code></a></li>
57
+ <li><a href="03-patterns/accordion/demo.html"><code>03-patterns/accordion/demo.html</code></a></li>
58
+ <li><a href="03-patterns/content/demo.html"><code>03-patterns/content/demo.html</code></a></li>
59
+ <li><a href="03-patterns/drawer/demo.html"><code>03-patterns/drawer/demo.html</code></a></li>
60
+ <li><a href="03-patterns/dropdown/demo.html"><code>03-patterns/dropdown/demo.html</code></a></li>
61
+ <li><a href="03-patterns/form-validation/demo.html"><code>03-patterns/form-validation/demo.html</code></a></li>
62
+ <li><a href="03-patterns/list/demo.html"><code>03-patterns/list/demo.html</code></a></li>
63
+ <li><a href="03-patterns/nav/demo.html"><code>03-patterns/nav/demo.html</code></a></li>
64
+ <li><a href="03-patterns/overlay/demo.html"><code>03-patterns/overlay/demo.html</code></a></li>
65
+ <li><a href="03-patterns/pagination/demo.html"><code>03-patterns/pagination/demo.html</code></a></li>
66
+ <li><a href="03-patterns/states/demo.html"><code>03-patterns/states/demo.html</code></a></li>
67
+ <li><a href="03-patterns/tabs/demo.html"><code>03-patterns/tabs/demo.html</code></a></li>
68
+ <li><a href="03-patterns/tooltip/demo.html"><code>03-patterns/tooltip/demo.html</code></a></li>
69
+ <li><a href="03-patterns/tree/demo.html"><code>03-patterns/tree/demo.html</code></a></li>
70
+ <li><a href="04-recipes/table/demo.html"><code>04-recipes/table/demo.html</code></a></li>
71
+ <li><a href="09-assets/bar/demo.html"><code>09-assets/bar/demo.html</code></a></li>
72
+ <li><a href="09-assets/echarts-adapter/demo.html"><code>09-assets/echarts-adapter/demo.html</code></a></li>
73
+ <li><a href="09-assets/model-viewer/demo.html"><code>09-assets/model-viewer/demo.html</code></a></li>
74
+ <li><a href="09-assets/sparkline/demo.html"><code>09-assets/sparkline/demo.html</code></a></li>
75
+ <li><a href="10-review/composition/demo.html"><code>10-review/composition/demo.html</code></a></li>
76
+ <li><a href="10-review/ios/index.html"><code>10-review/ios/index.html</code></a></li>
77
+ <li><a href="examples/react-vite/index.html"><code>examples/react-vite/index.html</code></a></li>
78
+ </ul>
79
+ </div>
80
+ </main>
81
+ </body>
82
+ </html>
package/package.json CHANGED
@@ -1,6 +1,109 @@
1
1
  {
2
2
  "name": "agentcss",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.11.3",
4
+ "description": "移动 Web 组件库:CSS + 可选行为脚本,零第三方运行时依赖。样式用 bundler 引入,交互行为用 script 标签引入。",
5
+ "keywords": [
6
+ "css",
7
+ "components",
8
+ "mobile-web",
9
+ "webview",
10
+ "accessibility",
11
+ "dark-mode",
12
+ "rtl"
13
+ ],
14
+ "license": "MIT",
15
+ "type": "commonjs",
16
+ "bin": {
17
+ "agentcss": "./ai/cli.js"
18
+ },
19
+ "types": "./types/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./types/index.d.ts",
23
+ "default": "./index.html"
24
+ },
25
+ "./tokens.css": "./dist/01-tokens/tokens.css",
26
+ "./typography.css": "./dist/01-tokens/typography.css",
27
+ "./page.css": "./dist/01-tokens/page.css",
28
+ "./primitives/*": "./dist/02-primitives/*",
29
+ "./patterns/*": "./dist/03-patterns/*",
30
+ "./recipes/*": "./dist/04-recipes/*",
31
+ "./assets/*": "./dist/09-assets/*",
32
+ "./dist/*": "./dist/*",
33
+ "./src/*": "./*",
34
+ "./types": "./types/index.d.ts",
35
+ "./package.json": "./package.json"
36
+ },
37
+ "files": [
38
+ "ai/",
39
+ "!ai/surface.baseline.json",
40
+ "adapters/",
41
+ "!adapters/presentation/fixtures",
42
+ "types/",
43
+ "dist/",
44
+ "!dist/manifest.json",
45
+ "01-tokens/",
46
+ "02-primitives/",
47
+ "03-patterns/",
48
+ "04-recipes/",
49
+ "09-assets/",
50
+ "!09-assets/model-viewer/vendor",
51
+ "!09-assets/model-viewer/models",
52
+ "docs/",
53
+ "README.md",
54
+ "START-HERE.md",
55
+ "API.md",
56
+ "ERRORS.md",
57
+ "SUPPORT.md",
58
+ "SECURITY.md",
59
+ "CONTRIBUTING.md",
60
+ "CODE_OF_CONDUCT.md",
61
+ "CHANGELOG.md",
62
+ "LICENSE",
63
+ "index.html"
64
+ ],
65
+ "sideEffects": [
66
+ "*.css",
67
+ "*.js"
68
+ ],
69
+ "scripts": {
70
+ "test": "node --test 05-audit/unit.test.mjs 05-audit/behavior-cores.test.mjs",
71
+ "gate": "bash 05-audit/check-all.sh",
72
+ "gate:fast": "bash 05-audit/check-all.sh --fast",
73
+ "gate:timing": "bash 05-audit/check-all.sh --timing",
74
+ "size:record": "python3 05-audit/size-baseline.py --record",
75
+ "dist": "python3 05-audit/build-dist.py",
76
+ "dist:check": "python3 05-audit/build-dist.py --check && node 05-audit/dist-parity-check.js && python3 05-audit/dist-cost-gate.py",
77
+ "cost:update": "python3 05-audit/dist-cost-gate.py --update",
78
+ "prefix": "python3 05-audit/prefix-build.py",
79
+ "ai": "node ai/cli.js",
80
+ "benchmark": "node benchmark/run.js",
81
+ "test:types": "python3 05-audit/tsc-gate.py",
82
+ "publish:check": "bash 05-audit/check-all.sh --fast && bash 05-audit/pack-smoke.sh",
83
+ "prepublishOnly": "npm run publish:check"
84
+ },
85
+ "devDependencies": {
86
+ "axe-core": "^4.10.0",
87
+ "pixelmatch": "^5.3.0",
88
+ "playwright": "^1.49.1",
89
+ "pngjs": "^7.0.0",
90
+ "puppeteer-core": "^23.11.1",
91
+ "typescript": "^5.9.3",
92
+ "yaml": "^2.9.1"
93
+ },
94
+ "engines": {
95
+ "node": ">=18"
96
+ },
97
+ "repository": {
98
+ "type": "git",
99
+ "url": "git+https://github.com/owain323/frontend-lib.git"
100
+ },
101
+ "keywords_note": "零依赖是本库的核心约束:安装它不会给使用者的 node_modules 增加任何一个包",
102
+ "publishConfig": {
103
+ "access": "public"
104
+ },
105
+ "homepage": "https://github.com/owain323/frontend-lib",
106
+ "bugs": {
107
+ "url": "https://github.com/owain323/frontend-lib/issues"
108
+ }
109
+ }
@@ -0,0 +1,310 @@
1
+ /**
2
+ * frontend-lib — TypeScript 类型定义
3
+ *
4
+ * ============================================================================
5
+ * 为什么需要它
6
+ * ---------------------------------------------------------------------------
7
+ * 本库是**纯 JS + 零依赖**,但使用者接入时没有任何类型提示:
8
+ * 参数名写错、要传几个字段、返回值是什么 —— 全靠读源码。
9
+ * ⇒ 接入成本高,且类型错误只会在**运行时**暴露。
10
+ *
11
+ * ⭐ 解法:给有 JS API 的组件补 `.d.ts`。
12
+ * ⚠️ **不引入 TypeScript 作为运行时依赖** —— 这些声明文件是纯文本,
13
+ * TS 项目会自动读取,JS 项目完全无感。
14
+ *
15
+ * ============================================================================
16
+ * ⭐ 本文件的每一行都由门禁核对过(2026-10-06 起)
17
+ * ---------------------------------------------------------------------------
18
+ * 曾经的教训:类型里写满了 runtime 根本没有的 API,而门禁抓不到——
19
+ * 因为旧门禁只比对「方法名是否出现」,不比对「是方法还是属性」。
20
+ *
21
+ * 实际发生过的错误(全部已修,并由 `api-contract` 门禁防复发):
22
+ * ① Select.value 声明成 string[],实际是标量
23
+ * ② ComponentInstance.destroy() —— select/combobox/date-range 都没有
24
+ * ③ Combobox.tags 声明成方法(),实际是 getter
25
+ * ④ DateRange 实例声明了 iso/quarterOf 等**静态**函数
26
+ * ⑤ PresetName 列的 'today'/'week' 全部不存在
27
+ * ⑥ DateRange.onChange 签名是两个字符串,实际是 (对象, 布尔)
28
+ *
29
+ * ⇒ 改本文件前先跑:
30
+ * python3 05-audit/api-contract.py # 看 runtime 真实形状
31
+ * npx tsc --noEmit -p type-tests/ # 看类型自洽
32
+ *
33
+ * ============================================================================
34
+ * 怎么用
35
+ * ---------------------------------------------------------------------------
36
+ * // tsconfig.json
37
+ * { "compilerOptions": { "paths": { "agentcss": ["./types/index.d.ts"] } } }
38
+ *
39
+ * import { Select } from 'agentcss';
40
+ * const s = Select.create(el, { label: '口径', onChange: (v, text) => … });
41
+ * ^^^^^^^^^^^^^^ 参数名/个数写错会立刻报错
42
+ */
43
+
44
+ /* ============================================================================
45
+ * 基础形状
46
+ * ========================================================================== */
47
+
48
+ /**
49
+ * ⭐ **不再有一个统一的 ComponentInstance**。
50
+ *
51
+ * 之前所有组件都 `extends ComponentInstance`,而那个接口带 `destroy()`。
52
+ * 实测:只有 dropdown / tree / bar / sparkline 提供 destroy(),
53
+ * select / combobox / date-range / popover / tooltip **都没有**。
54
+ * ⇒ 一个共用接口必然对一部分组件说谎。
55
+ *
56
+ * ⇒ 改为:每个组件单独声明它**真实拥有**的成员。
57
+ * 需要销毁能力的组件自己带 `destroy()`(下面 accordion/dropdown 等)。
58
+ */
59
+ export interface Destroyable {
60
+ /** 销毁:移除监听、清空生成的 DOM */
61
+ destroy(): void;
62
+ }
63
+
64
+ /* ============================================================================
65
+ * select —— 单选下拉
66
+ * ========================================================================== */
67
+ export interface SelectOption {
68
+ value: string;
69
+ label: string;
70
+ /** 语义色(success / warning / danger / info /neutral) */
71
+ tone?: 'success' | 'warning' | 'danger' | 'info' | 'neutral';
72
+ disabled?: boolean;
73
+ }
74
+
75
+ export interface SelectOptions {
76
+ /** 无障碍名(读屏会读它) */
77
+ label: string;
78
+ options: SelectOption[];
79
+ /** 初始选中值 */
80
+ value?: string;
81
+ placeholder?: string;
82
+ disabled?: boolean;
83
+ /**
84
+ * ⭐ 变更回调。**两个参数**,不是数组。
85
+ * runtime:`opt.onChange(selected, 显示文本)`
86
+ *
87
+ * ⚠️ 本组件**只支持单选** —— 内部状态是标量。
88
+ * 早期类型里写过 `string[]` 与 `max`/`min`,实现从未支持,
89
+ * 属于「声明了却没有」⇒ 已移除。需要多选请用 combobox。
90
+ */
91
+ onChange?(value: string | null, text: string): void;
92
+ /**
93
+ * 打开/关闭。
94
+ * ⚠️ runtime 是 `opt.onOpen()`,**不传参数**。
95
+ * 想知道是开是关,请自己在 onChange 里判断,或观察 DOM。
96
+ */
97
+ onOpen?(): void;
98
+ }
99
+
100
+ /**
101
+ * ⭐ 与 `select.js` 的实际返回逐项对齐。
102
+ * runtime 返回:`{ open, close, get value(), set value(v) }`
103
+ * ⇒ 用 `value` 属性(getter/setter),**不是** getValue/setValue。
104
+ * ⇒ 没有 destroy():卸载请直接移除节点(组件无全局监听)。
105
+ */
106
+ export interface Select {
107
+ /** 展开下拉 */
108
+ open(): void;
109
+ /** 收起下拉 */
110
+ close(): void;
111
+ /** 当前值(可读写;写入会触发 onChange) */
112
+ value: string | null;
113
+ }
114
+
115
+ /* ============================================================================
116
+ * combobox —— 多选组合框
117
+ * ========================================================================== */
118
+ export interface ComboboxOptions {
119
+ label: string;
120
+ options: SelectOption[];
121
+ /**
122
+ * 最多可选几个 —— **硬上限**,不是"选满了就收起下拉"。
123
+ *
124
+ * ⭐ 三条入口都受它约束:点选项 / Enter 提交 / 公开 `add()`。
125
+ * (以前只在 `commitActive()` 里"加完发现满了才关列表",
126
+ * 公开 `add()` 和点击路径都能绕过 —— 2026-10-10 修。)
127
+ * 满了以后 `add()` 返回 `false`,标签数量不再变化。
128
+ */
129
+ max?: number;
130
+ placeholder?: string;
131
+ disabled?: boolean;
132
+ /** 变更回调(传已选的 value 数组) */
133
+ onChange?(values: string[]): void;
134
+ /**
135
+ * 自定义过滤(不传则用 label/value 的 includes 匹配)。
136
+ * ⚠️ **必须同步返回布尔值** —— 会被逐项调用,不能在里面做异步过滤。
137
+ */
138
+ filter?(input: string, opt: SelectOption): boolean;
139
+ }
140
+
141
+ /**
142
+ * ⭐ 与 `combobox.js` 实际返回对齐。
143
+ * runtime 返回:`{ get tags(), add, remove, setOptions, destroy }`
144
+ *
145
+ * ⚠️ `tags` 是**属性(getter)**,不是方法 —— 用 `c.tags`,不是 `c.tags()`。
146
+ * 早期类型写成方法,于是文档与实际用法对不上。
147
+ *
148
+ * 🔴 关于 `destroy()`(2026-10-10 修):
149
+ * 以前这里写"它**没有** destroy()" —— 那句话曾经是真的,
150
+ * 但组件注册了一个 **document 级** click 监听却没人摘,
151
+ * ⇒ 实例销毁后监听还活着(每个死掉的实例都握着一份 DOM 引用)。
152
+ * 现在有 `destroy()` 了,**卸载时必须调用**(或至少在移除节点前调用)。
153
+ */
154
+ export interface Combobox {
155
+ /** 已选中的 value 数组(只读快照,每次访问返回新数组) */
156
+ readonly tags: string[];
157
+ /**
158
+ * 追加一项。
159
+ * 返回 `false` 表示没加进去:空值 / 已存在 / **禁用项** / **已达 max**。
160
+ */
161
+ add(value: string): boolean;
162
+ /** 移除一项 */
163
+ remove(value: string): void;
164
+ /** 替换候选项 */
165
+ setOptions(options: SelectOption[]): void;
166
+ /**
167
+ * 解绑全部监听(含 document 级)并收起列表。**幂等**。
168
+ * ⚠️ 移除 DOM 之前请先调用它,否则监听会泄漏。
169
+ */
170
+ destroy(): void;
171
+ }
172
+
173
+ /* ============================================================================
174
+ * date-range —— 日期区间
175
+ * ========================================================================== */
176
+
177
+ /**
178
+ * ⭐ 内置预设区间名。
179
+ *
180
+ * ⚠️ 这五个是**实现里真实存在的全部值**,取自 `date-range.js` 的 PRESETS:
181
+ * thisQ(本季度) / lastQ(上季度) / lastM(上月)
182
+ * thisY(今年) / yoy(去年同期)
183
+ *
184
+ * 之前类型里写的是'today' / 'week' / 'month' / 'lastMonth' /
185
+ * 'thisYear' / 'lastYear' —— 这些 preset **一个都不存在**,
186
+ * 而类型却放它们过关 ⇒ TS 放行、runtime 静默无反应。
187
+ */
188
+ export type PresetName = 'thisQ' | 'lastQ' | 'lastM' | 'thisY' | 'yoy';
189
+
190
+ export interface DateRangeOptions {
191
+ label: string;
192
+ /**
193
+ * 要显示哪些快捷区间(取值为预设名)。
194
+ * ⚠️ 传了但 DOM 里没有对应 `data-dr-preset` 按钮的,会被静默忽略。
195
+ */
196
+ presets?: PresetName[];
197
+ /** 是否允许手动输入 */
198
+ editable?: boolean;
199
+ disabled?: boolean;
200
+ /**
201
+ * ⭐ 变更回调。**第一个参数是对象,第二个是布尔**。
202
+ * runtime:`opt.onChange({ from, to, valid }, valid)`
203
+ *
204
+ * 之前类型写成 `(from: string, to: string)` ——
205
+ * 调用方按类型写 `onChange: (from, to) => ...`,to 会拿到 undefined。
206
+ */
207
+ onChange?(value: { from: string; to: string; valid: boolean },
208
+ valid: boolean): void;
209
+ }
210
+
211
+ /**
212
+ * ⭐ 与 `date-range.js` 实际返回对齐:
213
+ * `{ get from(), get to(), get valid(), set, setPreset, clear }`
214
+ *
215
+ * ⚠️ **它没有** iso / quarterOf / quarterRange / addDays / addMonths ——
216
+ * 那些是 `DateRange` 命名空间上的**静态**函数,见 DateRangeStatics。
217
+ * 之前把它们声明成实例方法,于是 `dr.addDays(...)` 类型通过、
218
+ * 运行时 `dr.addDays is not a function`。
219
+ */
220
+ export interface DateRange {
221
+ /** 起始日(YYYY-MM-DD,只读) */
222
+ readonly from: string;
223
+ /** 结束日(YYYY-MM-DD,只读) */
224
+ readonly to: string;
225
+ /** 区间是否有效(from <= to) */
226
+ readonly valid: boolean;
227
+ /** 设置区间 */
228
+ set(from: string, to: string): void;
229
+ /**
230
+ * 套用预设。
231
+ * ⚠️ 参数是**预设名**(`thisQ` / `lastM` / …),不是日期区间。
232
+ * 之前类型写成 `setPreset(from, to)` ⇒ 完全错误的用法被类型放行。
233
+ * 传入未渲染的 preset 名会**静默无反应**(找不到对应按钮)。
234
+ */
235
+ setPreset(preset: PresetName): void;
236
+ /** 清空 */
237
+ clear(): void;
238
+ }
239
+
240
+ /* ============================================================================
241
+ * DateRange 命名空间上的静态函数(可脱离组件单独用)
242
+ * ========================================================================== */
243
+ export interface DateRangeStatics {
244
+ /** Date → 'YYYY-MM-DD'(**本地时区**,不用 toISOString,避免时区偏移) */
245
+ iso(d: Date): string;
246
+ /** 加天数(跨月/跨年/闰年都正确) */
247
+ addDays(isoStr: string, n: number): string;
248
+ /** 加月份,**月末夹取**(1/31 + 1 月 = 2/28 或 2/29) */
249
+ addMonths(isoStr: string, n: number): string;
250
+ /** 日期 → 季度。⚠️ 返回对象,`q` 是 **0-based**(0=Q1) */
251
+ quarterOf(date: Date): { y: number; q: number };
252
+ /** 季度 → 起止日。🔴 `q` **必须 0-3**,否则抛错 */
253
+ quarterRange(y: number, q: number): { from: string; to: string };
254
+ /** 挂载一个日期区间组件 */
255
+ create(root: HTMLElement, opt: DateRangeOptions): DateRange;
256
+ }
257
+
258
+ /* ============================================================================
259
+ * dropdown —— 下拉菜单(唯一带 destroy 的常用组件之一)
260
+ * ========================================================================== */
261
+ export interface Dropdown {
262
+ open(): void;
263
+ close(): void;
264
+ destroy(): void;
265
+ }
266
+
267
+ /* ============================================================================
268
+ * tree —— 树形导航
269
+ * ========================================================================== */
270
+ export interface TreeOptions {
271
+ /** 无障碍名(读屏会读它) */
272
+ label?: string;
273
+ }
274
+
275
+ /* ============================================================================
276
+ * tree —— 树形导航
277
+ * ========================================================================== */
278
+ export interface Tree {
279
+ /** 让第 n 项(按可见顺序)获得焦点 */
280
+ focusAt(n: number): void;
281
+ /**
282
+ * 当前选中项。
283
+ * ⚠️ 返回的是**列表项 DOM 元素**,不是 value 字符串
284
+ * (runtime:`list[cur]`,list 是可见项数组)。没有选中项时为 null。
285
+ */
286
+ readonly selected: HTMLElement | null;
287
+ destroy(): void;
288
+ }
289
+
290
+ /* ============================================================================
291
+ * 全局命名空间(组件脚本是 IIFE,挂到 window)
292
+ * ========================================================================== */
293
+ export interface FrontendLibGlobal {
294
+ DateRange: DateRangeStatics;
295
+ Select: { create(root: HTMLElement, opt: SelectOptions): Select };
296
+ Combobox: { create(root: HTMLElement, opt: ComboboxOptions): Combobox };
297
+ Dropdown: { create(root: HTMLElement, opt?: object): Dropdown };
298
+ Tree: { create(root: HTMLElement, opt?: TreeOptions): Tree };
299
+ }
300
+
301
+ declare global {
302
+ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
303
+ interface Window extends FrontendLibGlobal {}
304
+ }
305
+
306
+ export declare const Select: FrontendLibGlobal['Select'];
307
+ export declare const Combobox: FrontendLibGlobal['Combobox'];
308
+ export declare const DateRange: DateRangeStatics;
309
+ export declare const Dropdown: FrontendLibGlobal['Dropdown'];
310
+ export declare const Tree: FrontendLibGlobal['Tree'];