@icen.ai/ui 0.10.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/AGENTS.md +79 -309
  2. package/LICENSE +21 -0
  3. package/README.md +43 -54
  4. package/dist/base.css +68 -22
  5. package/dist/behaviors/accordion.mjs +1 -1
  6. package/dist/behaviors/ai-branch.mjs +14 -0
  7. package/dist/behaviors/ai-chat.d.mts +2 -2
  8. package/dist/behaviors/ai-chat.mjs +66 -10
  9. package/dist/behaviors/ai-composer.d.mts +5 -5
  10. package/dist/behaviors/ai-composer.mjs +34 -10
  11. package/dist/behaviors/ai-core.mjs +14 -0
  12. package/dist/behaviors/ai-diff.mjs +14 -0
  13. package/dist/behaviors/ai-feedback.mjs +14 -0
  14. package/dist/behaviors/ai-panel.d.mts +2 -2
  15. package/dist/behaviors/ai-panel.mjs +14 -0
  16. package/dist/behaviors/ai-provider.d.mts +1 -1
  17. package/dist/behaviors/ai-provider.mjs +14 -0
  18. package/dist/behaviors/ai-threads.mjs +14 -0
  19. package/dist/behaviors/ai-tool.d.mts +1 -1
  20. package/dist/behaviors/ai-tool.mjs +299 -24
  21. package/dist/behaviors/ai-tools.mjs +1179 -28
  22. package/dist/behaviors/autocomplete.d.mts +1 -1
  23. package/dist/behaviors/autocomplete.mjs +14 -0
  24. package/dist/behaviors/back-top.mjs +14 -0
  25. package/dist/behaviors/carousel.mjs +21 -1
  26. package/dist/behaviors/cascader.mjs +27 -0
  27. package/dist/behaviors/charts.d.mts +12 -1
  28. package/dist/behaviors/charts.mjs +298 -20
  29. package/dist/behaviors/code-block.mjs +22 -1
  30. package/dist/behaviors/command-palette.mjs +3 -3
  31. package/dist/behaviors/context-menu.d.mts +2 -2
  32. package/dist/behaviors/context-menu.mjs +14 -0
  33. package/dist/behaviors/controls.d.mts +8 -8
  34. package/dist/behaviors/controls.mjs +50 -6
  35. package/dist/behaviors/copy.mjs +14 -0
  36. package/dist/behaviors/datatable.d.mts +3 -3
  37. package/dist/behaviors/datatable.mjs +89 -11
  38. package/dist/behaviors/date-picker.mjs +14 -0
  39. package/dist/behaviors/events.d.mts +10 -10
  40. package/dist/behaviors/events.mjs +11 -1
  41. package/dist/behaviors/form-validate.d.mts +10 -1
  42. package/dist/behaviors/form-validate.mjs +279 -4611
  43. package/dist/behaviors/i18n.d.mts +14 -0
  44. package/dist/behaviors/i18n.mjs +28 -0
  45. package/dist/behaviors/input.mjs +16 -0
  46. package/dist/behaviors/kb-access.d.mts +2 -2
  47. package/dist/behaviors/kb-access.mjs +21 -2
  48. package/dist/behaviors/kb-acl.d.mts +2 -2
  49. package/dist/behaviors/kb-acl.mjs +14 -0
  50. package/dist/behaviors/kb-answer.d.mts +2 -2
  51. package/dist/behaviors/kb-answer.mjs +298 -23
  52. package/dist/behaviors/kb-audit.d.mts +2 -2
  53. package/dist/behaviors/kb-audit.mjs +14 -0
  54. package/dist/behaviors/kb-canvas.d.mts +3 -3
  55. package/dist/behaviors/kb-canvas.mjs +14 -0
  56. package/dist/behaviors/kb-chain.d.mts +2 -2
  57. package/dist/behaviors/kb-chain.mjs +14 -0
  58. package/dist/behaviors/kb-checkpoint.d.mts +2 -2
  59. package/dist/behaviors/kb-checkpoint.mjs +14 -0
  60. package/dist/behaviors/kb-chunks.d.mts +2 -2
  61. package/dist/behaviors/kb-chunks.mjs +14 -0
  62. package/dist/behaviors/kb-citation.d.mts +2 -2
  63. package/dist/behaviors/kb-citation.mjs +33 -6
  64. package/dist/behaviors/kb-clarify.d.mts +2 -2
  65. package/dist/behaviors/kb-clarify.mjs +14 -0
  66. package/dist/behaviors/kb-conflict.d.mts +2 -2
  67. package/dist/behaviors/kb-conflict.mjs +14 -0
  68. package/dist/behaviors/kb-connector.d.mts +2 -2
  69. package/dist/behaviors/kb-connector.mjs +14 -0
  70. package/dist/behaviors/kb-core.d.mts +1 -1
  71. package/dist/behaviors/kb-core.mjs +14 -0
  72. package/dist/behaviors/kb-eval.d.mts +2 -2
  73. package/dist/behaviors/kb-eval.mjs +21 -2
  74. package/dist/behaviors/kb-explain.d.mts +2 -2
  75. package/dist/behaviors/kb-explain.mjs +26 -2
  76. package/dist/behaviors/kb-filter.d.mts +2 -2
  77. package/dist/behaviors/kb-filter.mjs +21 -2
  78. package/dist/behaviors/kb-gap.d.mts +2 -2
  79. package/dist/behaviors/kb-gap.mjs +14 -0
  80. package/dist/behaviors/kb-hittest.d.mts +2 -2
  81. package/dist/behaviors/kb-hittest.mjs +15 -1
  82. package/dist/behaviors/kb-metadata.mjs +19 -0
  83. package/dist/behaviors/kb-passage.d.mts +2 -2
  84. package/dist/behaviors/kb-passage.mjs +14 -0
  85. package/dist/behaviors/kb-pipeline.d.mts +2 -2
  86. package/dist/behaviors/kb-pipeline.mjs +14 -0
  87. package/dist/behaviors/kb-qa.mjs +14 -0
  88. package/dist/behaviors/kb-rerank.d.mts +2 -2
  89. package/dist/behaviors/kb-rerank.mjs +14 -0
  90. package/dist/behaviors/kb-retrieval.d.mts +2 -2
  91. package/dist/behaviors/kb-retrieval.mjs +31 -4
  92. package/dist/behaviors/kb-review.d.mts +2 -2
  93. package/dist/behaviors/kb-review.mjs +21 -2
  94. package/dist/behaviors/kb-sandbox.d.mts +2 -2
  95. package/dist/behaviors/kb-sandbox.mjs +20 -1
  96. package/dist/behaviors/kb-segment.d.mts +2 -2
  97. package/dist/behaviors/kb-segment.mjs +15 -1
  98. package/dist/behaviors/kb-select.mjs +21 -2
  99. package/dist/behaviors/kb-sources.d.mts +2 -2
  100. package/dist/behaviors/kb-sources.mjs +14 -0
  101. package/dist/behaviors/kb-sql.d.mts +2 -2
  102. package/dist/behaviors/kb-sql.mjs +14 -0
  103. package/dist/behaviors/kb-trace.d.mts +2 -2
  104. package/dist/behaviors/kb-trace.mjs +22 -3
  105. package/dist/behaviors/kb-visibility.d.mts +2 -2
  106. package/dist/behaviors/kb-visibility.mjs +14 -0
  107. package/dist/behaviors/kb-who-can.d.mts +2 -2
  108. package/dist/behaviors/kb-who-can.mjs +21 -2
  109. package/dist/behaviors/mentions.d.mts +1 -1
  110. package/dist/behaviors/mentions.mjs +14 -0
  111. package/dist/behaviors/modal.d.mts +1 -1
  112. package/dist/behaviors/modal.mjs +14 -0
  113. package/dist/behaviors/motion.d.mts +16 -0
  114. package/dist/behaviors/motion.mjs +39 -0
  115. package/dist/behaviors/notification.d.mts +2 -2
  116. package/dist/behaviors/notification.mjs +27 -3
  117. package/dist/behaviors/panel.mjs +14 -0
  118. package/dist/behaviors/scroll-area.d.mts +17 -0
  119. package/dist/behaviors/scroll-area.mjs +59 -0
  120. package/dist/behaviors/select.mjs +21 -2
  121. package/dist/behaviors/slider.mjs +3 -3
  122. package/dist/behaviors/split-pane.mjs +2 -0
  123. package/dist/behaviors/suggestions.mjs +14 -0
  124. package/dist/behaviors/tabs.mjs +10 -0
  125. package/dist/behaviors/tag-input.mjs +14 -0
  126. package/dist/behaviors/theme-switcher.d.mts +2 -2
  127. package/dist/behaviors/theme-switcher.mjs +30 -2
  128. package/dist/behaviors/theme.mjs +16 -2
  129. package/dist/behaviors/toast.d.mts +2 -2
  130. package/dist/behaviors/toast.mjs +14 -0
  131. package/dist/behaviors/tree-select.mjs +27 -0
  132. package/dist/behaviors/tree.mjs +4 -4
  133. package/dist/behaviors/upload.mjs +14 -0
  134. package/dist/behaviors/url-safety.d.mts +8 -0
  135. package/dist/behaviors/url-safety.mjs +11 -0
  136. package/dist/components/accordion.d.mts +2 -0
  137. package/dist/components/ai-branch.d.mts +2 -0
  138. package/dist/components/ai-chat.css +40 -33
  139. package/dist/components/ai-chat.d.mts +2 -0
  140. package/dist/components/ai-composer.d.mts +2 -0
  141. package/dist/components/ai-context.d.mts +2 -0
  142. package/dist/components/ai-context.mjs +1 -0
  143. package/dist/components/ai-diff.css +6 -6
  144. package/dist/components/ai-diff.d.mts +2 -0
  145. package/dist/components/ai-feedback.d.mts +2 -0
  146. package/dist/components/ai-files.d.mts +2 -0
  147. package/dist/components/ai-message.d.mts +2 -0
  148. package/dist/components/ai-panel.css +12 -10
  149. package/dist/components/ai-reasoning.d.mts +2 -0
  150. package/dist/components/ai-subagent.d.mts +2 -0
  151. package/dist/components/ai-subagent.mjs +1 -0
  152. package/dist/components/ai-threads.d.mts +2 -0
  153. package/dist/components/ai-todo.d.mts +2 -0
  154. package/dist/components/ai-todo.mjs +1 -0
  155. package/dist/components/ai-tool-call.d.mts +2 -0
  156. package/dist/components/ai-tool-call.mjs +1 -0
  157. package/dist/components/ai-tool.css +16 -16
  158. package/dist/components/ai-usage.d.mts +2 -0
  159. package/dist/components/alert.d.mts +2 -0
  160. package/dist/components/autocomplete.css +12 -12
  161. package/dist/components/autocomplete.d.mts +2 -0
  162. package/dist/components/avatar.d.mts +2 -0
  163. package/dist/components/back-top.css +47 -16
  164. package/dist/components/back-top.d.mts +2 -0
  165. package/dist/components/badge.css +1 -1
  166. package/dist/components/badge.d.mts +2 -0
  167. package/dist/components/breadcrumb.css +26 -8
  168. package/dist/components/breadcrumb.d.mts +2 -0
  169. package/dist/components/btn.css +67 -62
  170. package/dist/components/btn.d.mts +2 -0
  171. package/dist/components/card.css +22 -22
  172. package/dist/components/card.d.mts +2 -0
  173. package/dist/components/carousel.d.mts +2 -0
  174. package/dist/components/cascader.css +56 -35
  175. package/dist/components/cascader.d.mts +2 -0
  176. package/dist/components/chart-area.css +46 -0
  177. package/dist/components/chart-area.d.mts +2 -0
  178. package/dist/components/chart-bar.css +66 -19
  179. package/dist/components/chart-bar.d.mts +2 -0
  180. package/dist/components/chart-calendar.d.mts +2 -0
  181. package/dist/components/chart-gauge.css +23 -3
  182. package/dist/components/chart-gauge.d.mts +2 -0
  183. package/dist/components/chart-graph.css +15 -3
  184. package/dist/components/chart-graph.d.mts +2 -0
  185. package/dist/components/chart-heatmap.css +117 -95
  186. package/dist/components/chart-heatmap.d.mts +2 -0
  187. package/dist/components/chart-line.css +54 -0
  188. package/dist/components/chart-line.d.mts +2 -0
  189. package/dist/components/chart-map.d.mts +2 -0
  190. package/dist/components/chart-pie.css +29 -0
  191. package/dist/components/chart-pie.d.mts +2 -0
  192. package/dist/components/chart-radar.css +50 -1
  193. package/dist/components/chart-radar.d.mts +2 -0
  194. package/dist/components/chart-scatter.css +39 -2
  195. package/dist/components/chart-scatter.d.mts +2 -0
  196. package/dist/components/chart-sparkline.css +20 -0
  197. package/dist/components/chart-sparkline.d.mts +2 -0
  198. package/dist/components/chart-stack.css +16 -5
  199. package/dist/components/chart-stack.d.mts +2 -0
  200. package/dist/components/charts.css +109 -35
  201. package/dist/components/charts.d.mts +2 -0
  202. package/dist/components/code-block.css +10 -8
  203. package/dist/components/code-block.d.mts +2 -0
  204. package/dist/components/command-palette.css +45 -38
  205. package/dist/components/command-palette.d.mts +2 -0
  206. package/dist/components/content.css +62 -57
  207. package/dist/components/context-menu.d.mts +2 -0
  208. package/dist/components/copy.css +10 -10
  209. package/dist/components/copy.d.mts +2 -0
  210. package/dist/components/datatable.css +72 -59
  211. package/dist/components/datatable.d.mts +2 -0
  212. package/dist/components/date-picker.css +26 -26
  213. package/dist/components/date-picker.d.mts +2 -0
  214. package/dist/components/desc.d.mts +2 -0
  215. package/dist/components/dropdown.d.mts +2 -0
  216. package/dist/components/empty.css +16 -16
  217. package/dist/components/empty.d.mts +2 -0
  218. package/dist/components/feedback.css +31 -29
  219. package/dist/components/form-validate.css +20 -6
  220. package/dist/components/form-validate.d.mts +2 -0
  221. package/dist/components/form.css +17 -14
  222. package/dist/components/form.d.mts +2 -0
  223. package/dist/components/icon.css +21 -10
  224. package/dist/components/icon.d.mts +2 -0
  225. package/dist/components/input.css +22 -22
  226. package/dist/components/input.d.mts +2 -0
  227. package/dist/components/kb-access.d.mts +2 -0
  228. package/dist/components/kb-acl.d.mts +2 -0
  229. package/dist/components/kb-agent.css +134 -55
  230. package/dist/components/kb-answer.d.mts +2 -0
  231. package/dist/components/kb-audit.d.mts +2 -0
  232. package/dist/components/kb-canvas.d.mts +2 -0
  233. package/dist/components/kb-chain.d.mts +2 -0
  234. package/dist/components/kb-checkpoint.d.mts +2 -0
  235. package/dist/components/kb-chunks.d.mts +2 -0
  236. package/dist/components/kb-citation.d.mts +2 -0
  237. package/dist/components/kb-clarify.d.mts +2 -0
  238. package/dist/components/kb-conflict.d.mts +2 -0
  239. package/dist/components/kb-connector.d.mts +2 -0
  240. package/dist/components/kb-data.css +192 -80
  241. package/dist/components/kb-eval.d.mts +2 -0
  242. package/dist/components/kb-explain.d.mts +2 -0
  243. package/dist/components/kb-filter.d.mts +2 -0
  244. package/dist/components/kb-gap.d.mts +2 -0
  245. package/dist/components/kb-ground.css +165 -73
  246. package/dist/components/kb-hittest.d.mts +2 -0
  247. package/dist/components/kb-ingest.css +308 -113
  248. package/dist/components/kb-metadata.d.mts +2 -0
  249. package/dist/components/kb-ops.css +189 -75
  250. package/dist/components/kb-passage.d.mts +2 -0
  251. package/dist/components/kb-perm.css +158 -87
  252. package/dist/components/kb-pipeline.d.mts +2 -0
  253. package/dist/components/kb-qa.d.mts +2 -0
  254. package/dist/components/kb-rerank.d.mts +2 -0
  255. package/dist/components/kb-retrieval.d.mts +2 -0
  256. package/dist/components/kb-review.d.mts +2 -0
  257. package/dist/components/kb-sandbox.d.mts +2 -0
  258. package/dist/components/kb-search.css +353 -116
  259. package/dist/components/kb-segment.d.mts +2 -0
  260. package/dist/components/kb-sources.d.mts +2 -0
  261. package/dist/components/kb-sql.d.mts +2 -0
  262. package/dist/components/kb-trace.d.mts +2 -0
  263. package/dist/components/kb-visibility.d.mts +2 -0
  264. package/dist/components/kb-who-can.d.mts +2 -0
  265. package/dist/components/kb.css +60 -36
  266. package/dist/components/kb.d.mts +2 -0
  267. package/dist/components/kbd.d.mts +2 -0
  268. package/dist/components/layout.css +10 -10
  269. package/dist/components/layout.d.mts +2 -0
  270. package/dist/components/list.d.mts +2 -0
  271. package/dist/components/material-chinese.css +10 -0
  272. package/dist/components/material-soviet.css +10 -0
  273. package/dist/components/material.css +61 -18
  274. package/dist/components/media-card.d.mts +2 -0
  275. package/dist/components/media.css +22 -27
  276. package/dist/components/mentions.css +18 -17
  277. package/dist/components/mentions.d.mts +2 -0
  278. package/dist/components/menu.css +32 -28
  279. package/dist/components/modal.css +30 -27
  280. package/dist/components/modal.d.mts +2 -0
  281. package/dist/components/nav.css +48 -44
  282. package/dist/components/nav.d.mts +2 -0
  283. package/dist/components/notification.css +31 -25
  284. package/dist/components/notification.d.mts +2 -0
  285. package/dist/components/pagination.css +15 -13
  286. package/dist/components/pagination.d.mts +2 -0
  287. package/dist/components/panel.css +19 -20
  288. package/dist/components/panel.d.mts +2 -0
  289. package/dist/components/pill.css +8 -7
  290. package/dist/components/pill.d.mts +2 -0
  291. package/dist/components/popover.css +32 -23
  292. package/dist/components/popover.d.mts +2 -0
  293. package/dist/components/progress.d.mts +2 -0
  294. package/dist/components/rating.d.mts +2 -0
  295. package/dist/components/result.d.mts +2 -0
  296. package/dist/components/scroll-area.css +84 -112
  297. package/dist/components/scroll-area.d.mts +2 -0
  298. package/dist/components/scroll-area.mjs +1 -0
  299. package/dist/components/segmented.css +47 -29
  300. package/dist/components/segmented.d.mts +2 -0
  301. package/dist/components/select.css +80 -41
  302. package/dist/components/select.d.mts +2 -0
  303. package/dist/components/sidebar.css +42 -38
  304. package/dist/components/sidebar.d.mts +2 -0
  305. package/dist/components/skeleton.d.mts +2 -0
  306. package/dist/components/slider.css +26 -22
  307. package/dist/components/slider.d.mts +2 -0
  308. package/dist/components/spinner.d.mts +2 -0
  309. package/dist/components/split-pane.css +16 -7
  310. package/dist/components/split-pane.d.mts +2 -0
  311. package/dist/components/stat.css +17 -16
  312. package/dist/components/stat.d.mts +2 -0
  313. package/dist/components/steps.css +26 -26
  314. package/dist/components/steps.d.mts +2 -0
  315. package/dist/components/switch.css +78 -39
  316. package/dist/components/switch.d.mts +2 -0
  317. package/dist/components/table.css +54 -32
  318. package/dist/components/table.d.mts +2 -0
  319. package/dist/components/tabs.css +53 -32
  320. package/dist/components/tabs.d.mts +2 -0
  321. package/dist/components/tag-input.css +12 -8
  322. package/dist/components/tag-input.d.mts +2 -0
  323. package/dist/components/tag.css +20 -12
  324. package/dist/components/tag.d.mts +2 -0
  325. package/dist/components/theme-switcher.css +7 -7
  326. package/dist/components/theme-switcher.d.mts +2 -0
  327. package/dist/components/timeline.d.mts +2 -0
  328. package/dist/components/toast.css +34 -30
  329. package/dist/components/toast.d.mts +2 -0
  330. package/dist/components/toolbar.css +19 -18
  331. package/dist/components/toolbar.d.mts +2 -0
  332. package/dist/components/tooltip.css +9 -8
  333. package/dist/components/tooltip.d.mts +2 -0
  334. package/dist/components/tree-select.css +63 -40
  335. package/dist/components/tree-select.d.mts +2 -0
  336. package/dist/components/tree.d.mts +2 -0
  337. package/dist/components/upload.css +9 -11
  338. package/dist/components/upload.d.mts +2 -0
  339. package/dist/index.d.mts +85 -84
  340. package/dist/index.mjs +14644 -13935
  341. package/dist/react.d.mts +18 -18
  342. package/dist/react.mjs +377 -36
  343. package/dist/registry.json +797 -64
  344. package/dist/tokens/colors.css +6 -0
  345. package/dist/tokens/design.css +137 -31
  346. package/dist/tokens/dtcg.json +9592 -2008
  347. package/dist/tokens/figma.variables.json +7451 -2141
  348. package/dist/tokens/motion.css +51 -0
  349. package/dist/tokens/pixel.css +10 -0
  350. package/dist/tokens/scrollbars.css +40 -0
  351. package/dist/tokens/tokens-studio.json +8390 -1142
  352. package/dist/tokens/typography.css +33 -0
  353. package/dist/tokens.css +402 -82
  354. package/dist/ui.css +4196 -2163
  355. package/dist/vue.d.mts +17 -17
  356. package/dist/vue.mjs +371 -34
  357. package/docs/spec/charts-scale-a11y.md +115 -0
  358. package/docs/spec/design-philosophy.md +5 -5
  359. package/docs/spec/design-primitives.md +10 -10
  360. package/docs/spec/motion-typography.md +105 -0
  361. package/docs/spec/scrollbars.md +46 -0
  362. package/package.json +17 -3
@@ -21,6 +21,7 @@ var ICEN_LOCALE_ZH_CN = {
21
21
  "aiChat.roleTool": "\u5DE5",
22
22
  "aiChat.roleUser": "\u6211",
23
23
  "aiChat.thinking": "\u601D\u8003 {p0}",
24
+ "aiChat.thinkingNow": "\u6B63\u5728\u601D\u8003\u2026",
24
25
  /* ── aiComposer ── */
25
26
  "aiComposer.attachAgent": "\u4EE3\u7406",
26
27
  "aiComposer.library": "\u6DFB\u52A0\u4E0A\u4E0B\u6587\u4E0E\u547D\u4EE4",
@@ -203,6 +204,19 @@ var ICEN_LOCALE_ZH_CN = {
203
204
  "charts.noData": "\u6682\u65E0\u6570\u636E",
204
205
  "charts.resetZoom": "\u91CD\u7F6E\u7F29\u653E",
205
206
  "charts.sampled": "\u5DF2\u62BD\u6837 {p0}\u2192{p1} \u70B9",
207
+ "charts.a11y.keyboardHint": "\u65B9\u5411\u952E\u9010\u70B9\u6D4F\u89C8\uFF0CHome/End \u8DF3\u9996\u5C3E\uFF0CEsc \u91CD\u7F6E\u7F29\u653E",
208
+ "charts.a11y.max": "\u6700\u5927 {p0}\uFF08{p1}\uFF09",
209
+ "charts.a11y.min": "\u6700\u5C0F {p0}\uFF08{p1}\uFF09",
210
+ "charts.a11y.point": "{p0}\uFF1A{p1}\uFF0C\u7B2C {p2}/{p3} \u70B9",
211
+ "charts.a11y.pointSeries": "{p0} \xB7 {p1}\uFF1A{p2}\uFF0C\u7B2C {p3}/{p4} \u70B9",
212
+ "charts.a11y.range": "\u7C7B\u76EE {p0} \u81F3 {p1}",
213
+ "charts.a11y.scatterRange": "x \u8303\u56F4 {p0}\u2013{p1}\uFF0Cy \u8303\u56F4 {p2}\u2013{p3}",
214
+ "charts.a11y.seriesCount": "{p0} \u4E2A\u7CFB\u5217",
215
+ "charts.a11y.tableCaption": "{p0} \u6570\u636E\u8868",
216
+ "charts.a11y.trend": "\u9996\u7CFB\u5217\u8D8B\u52BF{p0}",
217
+ "charts.a11y.trendDown": "\u4E0B\u964D",
218
+ "charts.a11y.trendFlat": "\u6301\u5E73",
219
+ "charts.a11y.trendUp": "\u4E0A\u5347",
206
220
  "charts.type.area": "\u9762\u79EF\u56FE",
207
221
  "charts.type.donut": "\u73AF\u5F62\u56FE",
208
222
  "charts.type.gauge": "\u4EEA\u8868\u76D8",
@@ -1237,6 +1251,7 @@ function bindGlobalListeners() {
1237
1251
  document.addEventListener("pointerdown", onGlobalPointerDown);
1238
1252
  document.addEventListener("keydown", onGlobalKeyDown);
1239
1253
  }
1254
+ var activeSetups = /* @__PURE__ */ new Set();
1240
1255
  function bindOpenListeners() {
1241
1256
  window.addEventListener("scroll", onWindowChange, true);
1242
1257
  window.addEventListener("resize", onWindowChange);
@@ -1290,6 +1305,11 @@ function createTreeSelect(el, opts) {
1290
1305
  const valueEl = document.createElement("span");
1291
1306
  valueEl.className = "icen-tree-select-value";
1292
1307
  trigger.appendChild(valueEl);
1308
+ const triggerChevron = createIcon("chevron-down", { size: 12, className: "icen-tree-select-chevron" });
1309
+ if (triggerChevron) {
1310
+ triggerChevron.setAttribute("aria-hidden", "true");
1311
+ trigger.appendChild(triggerChevron);
1312
+ }
1293
1313
  let clearBtn = null;
1294
1314
  if (opts.clearable) {
1295
1315
  clearBtn = document.createElement("button");
@@ -1863,8 +1883,15 @@ function createTreeSelect(el, opts) {
1863
1883
  root.remove();
1864
1884
  el.textContent = "";
1865
1885
  if (instances.get(el) === destroy) instances.delete(el);
1886
+ activeSetups.delete(destroy);
1887
+ if (!activeSetups.size && globalBound) {
1888
+ document.removeEventListener("pointerdown", onGlobalPointerDown);
1889
+ document.removeEventListener("keydown", onGlobalKeyDown);
1890
+ globalBound = false;
1891
+ }
1866
1892
  }
1867
1893
  instances.set(el, destroy);
1894
+ activeSetups.add(destroy);
1868
1895
  return {
1869
1896
  getValue: () => selectedNodesInOrder().map((n) => n.value),
1870
1897
  getLabels: () => selectedNodesInOrder().map((n) => n.label),
@@ -25,8 +25,8 @@ function setup(tree) {
25
25
  if (target.closest(".icen-tree-toggle")) {
26
26
  if (!childUl) return;
27
27
  const toggle = node.querySelector(".icen-tree-toggle");
28
- const collapsed = childUl.hasAttribute("hidden");
29
- if (collapsed) {
28
+ const wasCollapsed = childUl.hasAttribute("hidden");
29
+ if (wasCollapsed) {
30
30
  childUl.removeAttribute("hidden");
31
31
  toggle?.classList.remove("is-collapsed");
32
32
  toggle?.setAttribute("aria-expanded", "true");
@@ -35,7 +35,7 @@ function setup(tree) {
35
35
  toggle?.classList.add("is-collapsed");
36
36
  toggle?.setAttribute("aria-expanded", "false");
37
37
  }
38
- emitIcen(tree, "icen:tree-toggle", { node: li, open: !collapsed });
38
+ emitIcen(tree, "icen:tree-toggle", { node: li, open: wasCollapsed });
39
39
  return;
40
40
  }
41
41
  if (childUl) return;
@@ -54,7 +54,7 @@ function setup(tree) {
54
54
  const node = target.closest(".icen-tree-node");
55
55
  if (!node || node.closest(".icen-tree") !== tree) return;
56
56
  if (node.classList.contains("is-disabled")) return;
57
- const allNodes = Array.from(tree.querySelectorAll(".icen-tree-node:not(.is-disabled)"));
57
+ const allNodes = Array.from(tree.querySelectorAll(".icen-tree-node:not(.is-disabled)")).filter((n) => !n.closest("ul[hidden]"));
58
58
  const idx = allNodes.indexOf(node);
59
59
  if (idx === -1) return;
60
60
  switch (kev.key) {
@@ -116,6 +116,7 @@ var ICEN_LOCALE_ZH_CN = {
116
116
  "aiChat.roleTool": "\u5DE5",
117
117
  "aiChat.roleUser": "\u6211",
118
118
  "aiChat.thinking": "\u601D\u8003 {p0}",
119
+ "aiChat.thinkingNow": "\u6B63\u5728\u601D\u8003\u2026",
119
120
  /* ── aiComposer ── */
120
121
  "aiComposer.attachAgent": "\u4EE3\u7406",
121
122
  "aiComposer.library": "\u6DFB\u52A0\u4E0A\u4E0B\u6587\u4E0E\u547D\u4EE4",
@@ -298,6 +299,19 @@ var ICEN_LOCALE_ZH_CN = {
298
299
  "charts.noData": "\u6682\u65E0\u6570\u636E",
299
300
  "charts.resetZoom": "\u91CD\u7F6E\u7F29\u653E",
300
301
  "charts.sampled": "\u5DF2\u62BD\u6837 {p0}\u2192{p1} \u70B9",
302
+ "charts.a11y.keyboardHint": "\u65B9\u5411\u952E\u9010\u70B9\u6D4F\u89C8\uFF0CHome/End \u8DF3\u9996\u5C3E\uFF0CEsc \u91CD\u7F6E\u7F29\u653E",
303
+ "charts.a11y.max": "\u6700\u5927 {p0}\uFF08{p1}\uFF09",
304
+ "charts.a11y.min": "\u6700\u5C0F {p0}\uFF08{p1}\uFF09",
305
+ "charts.a11y.point": "{p0}\uFF1A{p1}\uFF0C\u7B2C {p2}/{p3} \u70B9",
306
+ "charts.a11y.pointSeries": "{p0} \xB7 {p1}\uFF1A{p2}\uFF0C\u7B2C {p3}/{p4} \u70B9",
307
+ "charts.a11y.range": "\u7C7B\u76EE {p0} \u81F3 {p1}",
308
+ "charts.a11y.scatterRange": "x \u8303\u56F4 {p0}\u2013{p1}\uFF0Cy \u8303\u56F4 {p2}\u2013{p3}",
309
+ "charts.a11y.seriesCount": "{p0} \u4E2A\u7CFB\u5217",
310
+ "charts.a11y.tableCaption": "{p0} \u6570\u636E\u8868",
311
+ "charts.a11y.trend": "\u9996\u7CFB\u5217\u8D8B\u52BF{p0}",
312
+ "charts.a11y.trendDown": "\u4E0B\u964D",
313
+ "charts.a11y.trendFlat": "\u6301\u5E73",
314
+ "charts.a11y.trendUp": "\u4E0A\u5347",
301
315
  "charts.type.area": "\u9762\u79EF\u56FE",
302
316
  "charts.type.donut": "\u73AF\u5F62\u56FE",
303
317
  "charts.type.gauge": "\u4EEA\u8868\u76D8",
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 不可信 URL → 可落成 href/src 的串;被判危险则返回 undefined(调用方跳过渲染该槽位)。
3
+ * 归一只用于判定,返回的仍是原始 uri——浏览器解析时会做出同样的归一,不会出现
4
+ * 「守卫看归一后、浏览器看原文」的判定分裂。
5
+ */
6
+ declare function safeUrl(uri: string): string | undefined;
7
+
8
+ export { safeUrl };
@@ -0,0 +1,11 @@
1
+ // src/behaviors/url-safety.ts
2
+ function safeUrl(uri) {
3
+ const s = uri.replace(/[\t\n\r\0-\x1f\x7f]/g, "").trim().toLowerCase();
4
+ if (!s) return void 0;
5
+ if (s.startsWith("javascript:") || s.startsWith("vbscript:")) return void 0;
6
+ if (/^data:\s*text\/html/.test(s)) return void 0;
7
+ return uri;
8
+ }
9
+ export {
10
+ safeUrl
11
+ };
@@ -0,0 +1,2 @@
1
+ // kit: accordion 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/accordion.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-branch 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-branch.mjs';
@@ -53,7 +53,7 @@
53
53
  * 状态机 7 态 .is-* 中的 streaming/done 在本文件消费;running 脉冲点等条目态见 ai-tool.css(.icen-ai-item 基元)。
54
54
  * data-icen-density:summary 档隐藏 meta、默认折叠 reasoning(纯 CSS);
55
55
  * tool/system 类次要消息在 summary 档压淡。verbose 与 normal 目前同视觉(透明度两档生效)。
56
- * 流式光标复用 tokens 的 blink keyframes(.icen-animate-blink 同款);reasoning shimmer 时长走
56
+ * 流式光标复用 base.css 的 icen-blink keyframes;reasoning shimmer 时长走
57
57
  * --ai-shimmer-duration 局部变量(默认值 1.6s)。
58
58
  */
59
59
 
@@ -134,29 +134,29 @@
134
134
  display: grid;
135
135
  grid-template-columns: auto 1fr;
136
136
  gap: var(--icen-density-space-sm);
137
- padding: var(--icen-density-space-sm) var(--icen-density-space-md);
138
- border-radius: var(--icen-radius-md);
137
+ padding: 6px var(--icen-density-space-xs);
138
+ border-radius: var(--icen-control-radius-lg);
139
139
  animation: icen-pop-in var(--ai-msg-enter-duration, var(--icen-duration-normal)) var(--icen-ease-out);
140
140
  }
141
141
 
142
142
  .icen-ai-msg-avatar {
143
- width: 28px;
144
- height: 28px;
143
+ width: 26px;
144
+ height: 26px;
145
145
  flex-shrink: 0;
146
146
  display: inline-flex;
147
147
  align-items: center;
148
148
  justify-content: center;
149
- border-radius: var(--icen-radius-sm);
149
+ border-radius: var(--icen-radius-xs);
150
150
  background: var(--icen-token-fill-2);
151
151
  color: var(--icen-token-text-muted);
152
152
  font-family: var(--icen-font-mono);
153
153
  font-size: var(--icen-density-font-size-2xs);
154
- letter-spacing: 0.04em;
154
+ letter-spacing: 0.03em;
155
155
  user-select: none;
156
156
  }
157
157
  .icen-ai-msg--user .icen-ai-msg-avatar {
158
158
  background: color-mix(in srgb, var(--icen-token-accent) 14%, transparent);
159
- color: var(--icen-token-accent);
159
+ color: var(--icen-token-accent-text);
160
160
  }
161
161
  .icen-ai-msg--assistant .icen-ai-msg-avatar {
162
162
  background: color-mix(in srgb, var(--icen-token-success) 12%, transparent);
@@ -174,19 +174,21 @@
174
174
  .icen-ai-msg-body {
175
175
  min-width: 0;
176
176
  min-height: 1.6em; /* 流式从空开始时占住一行高度,不塌 */
177
- font-size: var(--icen-density-font-size-md);
177
+ font-size: var(--icen-font-size-control);
178
178
  line-height: 1.6;
179
179
  white-space: pre-wrap;
180
180
  word-break: break-word;
181
181
  }
182
182
 
183
- /* 流式光标(▍闪烁,复用 tokens 的 blink keyframes,同 .icen-animate-blink) */
183
+ /* 流式光标(▍闪烁,共享 base.css 的 icen-blink keyframes);
184
+ .icen-ai-msg-text 命中库内自带绑定的 stream() 节点(createAiStream 挂 .is-streaming) */
184
185
  .icen-ai-msg-body.is-streaming::after,
186
+ .icen-ai-msg-text.is-streaming::after,
185
187
  .icen-ai-reasoning-body.is-streaming::after {
186
188
  content: '▍';
187
189
  margin-inline-start: 1px;
188
190
  color: var(--icen-token-accent);
189
- animation: blink 1s step-end infinite;
191
+ animation: icen-blink 1s step-end infinite;
190
192
  }
191
193
 
192
194
  /* 消息操作:hover / focus-within 才出现(键盘可达等价) */
@@ -394,14 +396,10 @@
394
396
  font-variant-numeric: tabular-nums;
395
397
  }
396
398
 
397
- /* 流式中:耗时位换成 shimmer「正在思考…」(时长走局部变量) */
399
+ /* 流式中:耗时位显示 shimmer「正在思考…」——文案由 createAiStream 写入(i18n),
400
+ 此处只做视觉(shimmer 渐变 + 透明填充),不再用 CSS content 冻死中文 */
398
401
  .icen-ai-reasoning.is-streaming .icen-ai-reasoning-time {
399
- display: none;
400
- }
401
- .icen-ai-reasoning.is-streaming .icen-ai-reasoning-head::after {
402
- content: '正在思考…';
403
- margin-inline-start: auto;
404
- font-size: var(--icen-density-font-size-2xs);
402
+ font-variant-numeric: normal;
405
403
  background: linear-gradient(
406
404
  90deg,
407
405
  var(--icen-token-text-faint) 25%,
@@ -436,18 +434,19 @@
436
434
  gap: var(--icen-density-space-xs);
437
435
  min-inline-size: 0;
438
436
  padding: var(--icen-density-space-sm);
439
- border: 1px solid var(--icen-token-line);
440
- border-radius: var(--icen-radius-lg);
437
+ border: 1px solid var(--icen-token-control-border);
438
+ border-radius: var(--icen-control-radius-lg);
441
439
  background: var(--icen-token-surface);
442
- box-shadow: var(--icen-token-shadow-card);
440
+ box-shadow: var(--icen-token-shadow-field);
443
441
  transition: border-color var(--icen-tx-fast), box-shadow var(--icen-tx-fast);
444
442
  }
445
443
  .icen-ai-composer:focus-within {
446
- border-color: var(--icen-hover-border, var(--icen-token-accent));
444
+ border-color: var(--icen-control-focus-border);
445
+ box-shadow: var(--icen-token-shadow-field), 0 0 0 3px color-mix(in srgb, var(--icen-token-accent) 16%, transparent);
447
446
  }
448
447
  .icen-ai-composer:has(.icen-ai-composer-input:focus-visible) {
449
448
  border-color: var(--icen-control-focus-border);
450
- box-shadow: var(--icen-token-shadow-card), 0 0 0 2px color-mix(in srgb, var(--icen-token-accent) 12%, transparent);
449
+ box-shadow: var(--icen-token-shadow-field), 0 0 0 3px color-mix(in srgb, var(--icen-token-accent) 16%, transparent);
451
450
  }
452
451
 
453
452
  /* 排队 / 引用 / 附件 chips 行 */
@@ -469,11 +468,11 @@
469
468
  align-items: center;
470
469
  gap: 4px;
471
470
  max-inline-size: min(100%, 280px);
472
- min-block-size: 30px;
473
- padding: 2px 4px 2px 6px; /* guard:allow-physical symmetric chip padding */
474
- border: 1px solid var(--icen-token-line-soft);
475
- border-radius: var(--icen-radius-sm);
476
- background: var(--icen-token-fill-1);
471
+ min-block-size: 26px;
472
+ padding: 2px 4px 2px 7px; /* guard:allow-physical symmetric chip padding */
473
+ border: 1px solid var(--icen-token-separator-soft);
474
+ border-radius: var(--icen-radius-xs);
475
+ background: var(--icen-token-fill-hover);
477
476
  color: var(--icen-token-text);
478
477
  font-size: var(--icen-density-font-size-xs);
479
478
  line-height: 1.4;
@@ -520,10 +519,10 @@
520
519
  flex-wrap: wrap;
521
520
  align-items: flex-end;
522
521
  gap: var(--icen-density-space-sm);
523
- padding: var(--icen-density-space-xs) var(--icen-density-space-sm);
522
+ padding: 4px var(--icen-field-padding-inline);
524
523
  min-inline-size: 0;
525
524
  border: 0;
526
- border-radius: var(--icen-radius-md);
525
+ border-radius: var(--icen-control-radius);
527
526
  background: transparent;
528
527
  box-shadow: none;
529
528
  }
@@ -531,14 +530,14 @@
531
530
  .icen-ai-composer-input {
532
531
  flex: 1;
533
532
  min-inline-size: 0;
534
- min-block-size: 64px;
533
+ min-block-size: 56px;
535
534
  padding: var(--icen-density-space-xs) 0;
536
535
  border: 0;
537
536
  outline: none;
538
537
  background: transparent;
539
538
  resize: none;
540
539
  font-family: inherit;
541
- font-size: var(--icen-density-font-size-md);
540
+ font-size: var(--icen-font-size-control);
542
541
  line-height: 1.5;
543
542
  max-height: 12em;
544
543
  overflow-y: auto;
@@ -991,13 +990,21 @@
991
990
  }
992
991
  }
993
992
 
994
- /* 触屏无 hover:消息操作常显(否则不可达) */
993
+ /* 触屏无 hover:消息操作常显(否则不可达);动作钮抬到 44px 触达面
994
+ (copy/retry、分支切换、线程操作原为 20-22px,低于 WCAG 2.5.8 下限) */
995
995
  @media (pointer: coarse) {
996
996
  .icen-ai-msg-actions {
997
997
  opacity: 1;
998
998
  visibility: visible;
999
999
  transform: none;
1000
1000
  }
1001
+ .icen-ai-msg-actions [data-icen-ai-msg-action],
1002
+ .icen-ai-branch-prev,
1003
+ .icen-ai-branch-next,
1004
+ .icen-ai-thread-action {
1005
+ min-inline-size: 44px;
1006
+ min-block-size: 44px;
1007
+ }
1001
1008
  }
1002
1009
 
1003
1010
  /* 实时待办 chip(setComposerTodo:业界模式——plan 状态挂输入区,不进对话流) */
@@ -0,0 +1,2 @@
1
+ // kit: ai-chat 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-chat.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-composer 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-composer.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-context 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-panel.mjs';
@@ -1,2 +1,3 @@
1
1
  // @icen.ai/ui — kit: ai-context(CSS + behavior 一行入口;构建产物,勿手改)
2
2
  import './ai-panel.css';
3
+ export * from '../behaviors/ai-panel.mjs';
@@ -62,8 +62,8 @@
62
62
  }
63
63
 
64
64
  .icen-ai-diff-file {
65
- border: 1px solid var(--icen-token-line-soft);
66
- border-radius: var(--icen-radius-md);
65
+ border: 1px solid var(--icen-token-separator-soft);
66
+ border-radius: var(--icen-control-radius-lg);
67
67
  background: var(--icen-token-surface);
68
68
  overflow: hidden;
69
69
  min-width: 0;
@@ -71,10 +71,10 @@
71
71
  }
72
72
 
73
73
  /* 文件头状态色边(inset 色条避免 border 宽差导致布局抖动) */
74
- .icen-ai-diff-file.is-added { box-shadow: inset 3px 0 0 var(--icen-token-success); }
75
- .icen-ai-diff-file.is-modified { box-shadow: inset 3px 0 0 var(--icen-token-accent); }
76
- .icen-ai-diff-file.is-deleted { box-shadow: inset 3px 0 0 var(--icen-token-error); }
77
- .icen-ai-diff-file.is-renamed { box-shadow: inset 3px 0 0 var(--icen-token-info); }
74
+ .icen-ai-diff-file.is-added { box-shadow: inset 2px 0 0 var(--icen-token-success); }
75
+ .icen-ai-diff-file.is-modified { box-shadow: inset 2px 0 0 var(--icen-token-accent); }
76
+ .icen-ai-diff-file.is-deleted { box-shadow: inset 2px 0 0 var(--icen-token-error); }
77
+ .icen-ai-diff-file.is-renamed { box-shadow: inset 2px 0 0 var(--icen-token-info); }
78
78
 
79
79
  /* 决策后淡化(状态章配色见 .icen-ai-diff-verdict) */
80
80
  .icen-ai-diff-file.is-accepted,
@@ -0,0 +1,2 @@
1
+ // kit: ai-diff 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-diff.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-feedback 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-feedback.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-files 类型面(构建产物,勿手改)
2
+ export { renderAiDiff } from '../behaviors/ai-diff.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-message 类型面(构建产物,勿手改)
2
+ export { renderAiMessage, createAiStream, initAiChat } from '../behaviors/ai-chat.mjs';
@@ -52,7 +52,7 @@
52
52
  * 同页面共存时后加载者覆盖同款属性,视觉不冲突。
53
53
  * - keyframes ai-status-pulse 为组件局部定义(等同 pill.css 的 pill-pulse),
54
54
  * 时长走 var(--pill-pulse-duration, 1.5s):pill.css 在场时与其同步,否则自洽。
55
- * - blink keyframes 来自 tokens/colors.css(.icen-animate-blink 同款,共享复用)。
55
+ * - icen-blink keyframes 来自 base.css(共享复用)。
56
56
  * - base.css:--icen-z-chrome / --icen-tx-* / --icen-ring。只消费 --icen-token-* / --icen-density-* / --icen-radius-*。
57
57
  */
58
58
 
@@ -208,13 +208,13 @@
208
208
  height: 4px;
209
209
  border-radius: var(--icen-radius-full);
210
210
  overflow: hidden;
211
- background: color-mix(in srgb, var(--icen-token-line-soft) 40%, transparent);
211
+ background: var(--icen-token-fill-2);
212
212
  }
213
213
  .icen-ai-todo-bar > i {
214
214
  display: block;
215
215
  height: 100%;
216
216
  border-radius: var(--icen-radius-full);
217
- background: var(--icen-token-accent);
217
+ background: var(--icen-token-accent-strong);
218
218
  transition: width var(--icen-tx-slow);
219
219
  }
220
220
  .icen-ai-todo.is-complete .icen-ai-todo-bar > i {
@@ -236,7 +236,7 @@
236
236
  transition: background-color var(--icen-tx-fast);
237
237
  }
238
238
  .icen-ai-todo-item[role='button']:hover {
239
- background: var(--icen-token-fill-1);
239
+ background: var(--icen-token-fill-hover);
240
240
  }
241
241
  .icen-ai-todo-item:focus-visible {
242
242
  outline: none;
@@ -436,7 +436,7 @@
436
436
  display: flex;
437
437
  flex-direction: column;
438
438
  background: var(--icen-token-surface);
439
- border-inline-start: 1px solid var(--icen-token-line-soft);
439
+ border-inline-start: 1px solid var(--icen-token-separator);
440
440
  box-shadow: var(--icen-token-shadow-overlay);
441
441
  transform: translateX(100%); /* guard:allow-physical 隐藏位沿物理右缘滑出(LTR 抽屉侧),RTL 镜像规则翻为 translateX(-100%) */
442
442
  transition: transform var(--ai-context-duration, var(--icen-duration-normal)) var(--icen-ease-out);
@@ -457,9 +457,9 @@
457
457
  z-index: auto;
458
458
  transform: none;
459
459
  transition: none;
460
- border: 1px solid var(--icen-token-line-soft);
461
- border-radius: var(--icen-radius-md);
462
- box-shadow: var(--icen-token-shadow-elevated);
460
+ border: 1px solid var(--icen-token-separator-soft);
461
+ border-radius: var(--icen-control-radius-lg);
462
+ box-shadow: none;
463
463
  overflow-y: visible;
464
464
  }
465
465
 
@@ -471,8 +471,10 @@
471
471
  align-items: center;
472
472
  justify-content: space-between;
473
473
  gap: var(--icen-density-space-sm);
474
- padding: var(--icen-density-space-sm) var(--icen-density-space-md);
475
- background: var(--icen-token-surface);
474
+ min-block-size: 42px;
475
+ padding: 8px 12px;
476
+ background: var(--icen-token-surface-chrome);
477
+ border-bottom: 1px solid var(--icen-token-separator-soft);
476
478
  border-bottom: 1px solid var(--icen-token-line-soft);
477
479
  font-size: var(--icen-density-font-size-sm);
478
480
  font-weight: 600;
@@ -0,0 +1,2 @@
1
+ // kit: ai-reasoning 类型面(构建产物,勿手改)
2
+ export { createAiStream, initAiChat } from '../behaviors/ai-chat.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-subagent 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-tool.mjs';
@@ -1,2 +1,3 @@
1
1
  // @icen.ai/ui — kit: ai-subagent(CSS + behavior 一行入口;构建产物,勿手改)
2
2
  import './ai-tool.css';
3
+ export * from '../behaviors/ai-tool.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-threads 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-threads.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-todo 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-panel.mjs';
@@ -1,2 +1,3 @@
1
1
  // @icen.ai/ui — kit: ai-todo(CSS + behavior 一行入口;构建产物,勿手改)
2
2
  import './ai-panel.css';
3
+ export * from '../behaviors/ai-panel.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: ai-tool-call 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/ai-tool.mjs';
@@ -1,2 +1,3 @@
1
1
  // @icen.ai/ui — kit: ai-tool-call(CSS + behavior 一行入口;构建产物,勿手改)
2
2
  import './ai-tool.css';
3
+ export * from '../behaviors/ai-tool.mjs';
@@ -102,7 +102,7 @@
102
102
  display: flex;
103
103
  flex-wrap: wrap;
104
104
  align-items: center;
105
- gap: var(--icen-density-space-sm);
105
+ gap: var(--icen-control-gap);
106
106
  min-width: 0;
107
107
  align-self: stretch; /* 宽度自稳定:宿主 flex/grid 居中时不 shrink-wrap(width:100% 会塌成 min-content,禁用) */
108
108
  }
@@ -112,16 +112,16 @@
112
112
  align-items: center;
113
113
  justify-content: center;
114
114
  flex-shrink: 0;
115
- inline-size: 28px;
116
- block-size: 28px;
117
- border-radius: var(--icen-radius-sm);
115
+ inline-size: 24px;
116
+ block-size: 24px;
117
+ border-radius: var(--icen-radius-xs);
118
118
  background: color-mix(in srgb, var(--ai-item-tint) 8%, var(--icen-token-surface));
119
119
  color: var(--ai-item-tint);
120
120
  transition: color var(--icen-tx-fast);
121
121
  }
122
122
  .icen-ai-item-icon > svg {
123
- width: 16px;
124
- height: 16px;
123
+ width: 15px;
124
+ height: 15px;
125
125
  }
126
126
 
127
127
  .icen-ai-item-main {
@@ -132,7 +132,7 @@
132
132
  gap: 1px;
133
133
  }
134
134
  .icen-ai-item-title {
135
- font-size: var(--icen-density-font-size-md);
135
+ font-size: var(--icen-font-size-control);
136
136
  line-height: 1.4;
137
137
  color: var(--icen-token-text);
138
138
  overflow: hidden;
@@ -196,13 +196,13 @@
196
196
  50% { opacity: 0.4; transform: scale(0.7); }
197
197
  }
198
198
 
199
- /* 流式中:▍光标闪烁(复用 colors.css 的 blink keyframes,animate-blink 同款) */
199
+ /* 流式中:▍光标闪烁(共享 base.css 的 icen-blink keyframes) */
200
200
  :is(.icen-ai-item, .icen-ai-tool, .icen-ai-subagent).is-streaming .icen-ai-item-status {
201
201
  width: 3px;
202
202
  height: 12px;
203
203
  border-radius: 1px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
204
204
  background: var(--ai-item-tint);
205
- animation: blink var(--ai-item-blink-duration) step-end infinite;
205
+ animation: icen-blink var(--ai-item-blink-duration) step-end infinite;
206
206
  }
207
207
 
208
208
  /* 待人确认:warning 点 + 外环 */
@@ -243,8 +243,8 @@
243
243
  .icen-ai-tool {
244
244
  --ai-item-tint: var(--icen-token-accent);
245
245
  align-self: stretch; /* 宽度自稳定:宿主 flex/grid 居中时不 shrink-wrap */
246
- border: 1px solid var(--icen-token-line-soft);
247
- border-radius: var(--icen-radius-md);
246
+ border: 1px solid var(--icen-token-separator-soft);
247
+ border-radius: var(--icen-control-radius-lg);
248
248
  background: var(--icen-token-surface);
249
249
  }
250
250
 
@@ -276,9 +276,9 @@
276
276
  .icen-ai-subagent-head {
277
277
  display: flex;
278
278
  align-items: center;
279
- gap: var(--icen-density-space-sm);
279
+ gap: var(--icen-control-gap-sm);
280
280
  width: 100%;
281
- padding: var(--icen-density-space-xs) var(--icen-density-space-sm);
281
+ padding: 4px var(--icen-density-space-sm);
282
282
  border: none;
283
283
  border-radius: inherit; /* hover 底色不戳破卡片圆角 */
284
284
  background: transparent;
@@ -291,7 +291,7 @@
291
291
  }
292
292
  .icen-ai-tool-head:hover,
293
293
  .icen-ai-subagent-head:hover {
294
- background: var(--icen-token-fill-1);
294
+ background: var(--icen-token-fill-hover);
295
295
  }
296
296
  .icen-ai-tool-head:focus-visible,
297
297
  .icen-ai-subagent-head:focus-visible {
@@ -303,9 +303,9 @@
303
303
  .icen-ai-tool-body {
304
304
  display: flex;
305
305
  flex-direction: column;
306
- gap: var(--icen-density-space-sm);
306
+ gap: var(--icen-control-gap-sm);
307
307
  padding: var(--icen-density-space-sm);
308
- border-top: 1px solid var(--icen-token-line-soft);
308
+ border-top: 1px solid var(--icen-token-separator-soft);
309
309
  animation: icen-pop-in var(--icen-tx-fast);
310
310
  }
311
311
  .icen-ai-tool-body[hidden],
@@ -0,0 +1,2 @@
1
+ // kit: ai-usage 类型面(构建产物,勿手改)
2
+ export { renderAiUsage, renderAiUsageRing, renderAiAudit } from '../behaviors/ai-panel.mjs';
@@ -0,0 +1,2 @@
1
+ // kit: alert 类型面(构建产物,勿手改)
2
+ export {};
@@ -12,11 +12,11 @@
12
12
  z-index: var(--icen-z-popover);
13
13
  overflow-y: auto;
14
14
  overscroll-behavior: contain;
15
- padding: 4px;
16
- background: var(--icen-token-card-strong);
17
- border: 1px solid var(--icen-token-outline);
18
- border-radius: var(--icen-radius-md);
19
- box-shadow: var(--icen-token-shadow-overlay);
15
+ padding: var(--icen-density-space-xs);
16
+ background: var(--icen-token-surface);
17
+ border: 1px solid var(--icen-token-material-edge);
18
+ border-radius: var(--icen-radius-lg);
19
+ box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated);
20
20
  transform-origin: top center;
21
21
  animation: icen-pop-in var(--icen-tx-fast);
22
22
  }
@@ -25,20 +25,20 @@
25
25
  .icen-autocomplete-option {
26
26
  display: flex;
27
27
  align-items: center;
28
- gap: var(--icen-density-space-xs);
29
- padding: 6px var(--icen-density-space-sm);
30
- font-size: var(--icen-density-font-size-sm);
28
+ gap: var(--icen-control-gap-sm);
29
+ padding: 4px var(--icen-density-space-sm);
30
+ font-size: var(--icen-font-size-control);
31
31
  color: var(--icen-token-text);
32
- border-radius: var(--icen-radius-sm);
32
+ border-radius: var(--icen-radius-xs);
33
33
  cursor: pointer;
34
- min-block-size: var(--icen-density-input-height-sm);
34
+ min-block-size: var(--icen-control-height-sm);
35
35
  overflow-wrap: anywhere;
36
36
  transition:
37
37
  background-color var(--icen-tx-fast),
38
38
  color var(--icen-tx-fast);
39
39
  }
40
- .icen-autocomplete-option:hover { background: var(--icen-token-fill-1); }
41
- .icen-autocomplete-option.is-active { background: var(--icen-token-fill-2); }
40
+ .icen-autocomplete-option:hover { background: var(--icen-token-fill-hover); }
41
+ .icen-autocomplete-option.is-active { background: var(--icen-token-fill-selected); }
42
42
 
43
43
  /* 命中片段高亮(behavior 以 <mark> 包裹 query 命中,大小写不敏感) */
44
44
  .icen-autocomplete-option mark {