@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
@@ -0,0 +1,2 @@
1
+ // kit: kb-metadata 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/kb-metadata.mjs';
@@ -13,12 +13,13 @@
13
13
  .icen-kb-trace { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
14
14
 
15
15
  /* 行:caret | kind 徽标(定宽对齐)| name | 耗时条 | elapsed;--depth×16px 缩进 */
16
+ /* 可点行 28px 节奏;hover 只抬底色不位移,按下用 pressed 档 */
16
17
  .icen-kb-span {
17
18
  display: grid;
18
19
  grid-template-columns: 14px 64px minmax(0, 1fr) minmax(48px, 128px) 56px;
19
20
  align-items: center;
20
21
  gap: 8px;
21
- min-height: 26px;
22
+ min-height: var(--icen-density-item-height);
22
23
  padding-block: 2px;
23
24
  /* 深度缩进沿 inline-start(RTL 下树向左侧生长) */
24
25
  padding-inline: calc(8px + var(--depth, 0) * 16px) 8px;
@@ -26,15 +27,18 @@
26
27
  background: none;
27
28
  border-radius: var(--icen-radius-sm);
28
29
  font: inherit;
29
- font-size: 12.5px;
30
+ font-size: var(--icen-font-size-control);
31
+ line-height: 1.4;
30
32
  color: var(--icen-token-text-muted);
31
33
  cursor: pointer;
32
34
  text-align: start;
33
35
  inline-size: 100%;
34
36
  position: relative;
37
+ transition: background-color var(--icen-tx-fast), color var(--icen-tx-fast);
35
38
  }
36
- .icen-kb-span:hover { background: var(--icen-token-bg-soft); color: var(--icen-token-text); }
37
- .icen-kb-span:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: -2px; }
39
+ .icen-kb-span:hover { background: var(--icen-token-fill-hover); color: var(--icen-token-text); }
40
+ .icen-kb-span:active { background: var(--icen-token-fill-pressed); }
41
+ .icen-kb-span:focus-visible { outline: none; box-shadow: var(--icen-ring); }
38
42
 
39
43
  /* 子 span 行前 1px 竖线(缩进连线,沿 inline-start,RTL 镜像) */
40
44
  .icen-kb-span--child::before {
@@ -53,24 +57,28 @@
53
57
  block-size: 12px;
54
58
  background: var(--icen-token-text-faint);
55
59
  mask: var(--icen-token-icon-chevron-right) center / contain no-repeat;
56
- transition: transform 0.16s ease-out;
60
+ transition: transform var(--icen-tx-fast);
57
61
  }
58
62
  .icen-kb-span[aria-expanded='true'] .icen-kb-span-caret { transform: rotate(90deg); }
59
63
 
60
- /* kind 徽标:中性线框;retrieval 为 accent 线框(证据域主角) */
64
+ /* kind 徽标:中性线框;retrieval 为 accent 线框(证据域主角);22px 徽标高度 + 11px 字 */
61
65
  .icen-kb-span-kind {
62
- font-size: 10.5px;
66
+ display: inline-flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ min-block-size: 22px;
70
+ padding: 0 8px;
71
+ font-size: var(--icen-density-font-size-xs);
63
72
  line-height: 1;
64
73
  letter-spacing: 0.3px;
65
74
  color: var(--icen-token-text-faint);
66
75
  border: 1px solid var(--icen-token-line-soft);
67
76
  border-radius: var(--icen-radius-full);
68
- padding: 2.5px 7px;
69
77
  white-space: nowrap;
70
78
  justify-self: start;
71
79
  }
72
80
  .icen-kb-span.is-retrieval .icen-kb-span-kind {
73
- color: var(--icen-token-accent);
81
+ color: var(--icen-token-accent-text); /* 11px 微字对 canvas 需 AA(裸 accent 3.76:1 不达) */
74
82
  border-color: color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
75
83
  }
76
84
 
@@ -80,7 +88,7 @@
80
88
  text-overflow: ellipsis;
81
89
  white-space: nowrap;
82
90
  color: var(--icen-token-text);
83
- font-size: 12.5px;
91
+ font-size: var(--icen-font-size-control);
84
92
  }
85
93
  .icen-kb-span.is-cancel { opacity: 0.6; }
86
94
 
@@ -91,7 +99,7 @@
91
99
  height: 4px;
92
100
  border-radius: 2px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
93
101
  background: var(--icen-token-line);
94
- transition: width 0.16s ease-out;
102
+ transition: width var(--icen-tx-fast);
95
103
  }
96
104
  .icen-kb-span.is-error .icen-kb-span-bar { background: var(--icen-token-error); }
97
105
  .icen-kb-span.is-running .icen-kb-span-bar {
@@ -115,12 +123,13 @@
115
123
  margin-inline-end: 8px;
116
124
  padding: 6px 10px;
117
125
  border-inline-start: 2px solid var(--icen-token-line-soft);
118
- font-size: 12px;
126
+ font-size: var(--icen-font-size-caption);
127
+ line-height: 1.6;
119
128
  color: var(--icen-token-text-muted);
120
129
  }
121
130
  .icen-kb-trace-detail { white-space: pre-wrap; word-break: break-word; line-height: 1.6; }
122
131
  .icen-kb-trace-usage { display: flex; flex-wrap: wrap; gap: 4px 12px; }
123
- .icen-kb-trace-error { color: var(--icen-token-error); font-size: 12px; word-break: break-word; }
132
+ .icen-kb-trace-error { color: var(--icen-token-error); font-size: var(--icen-font-size-caption); word-break: break-word; }
124
133
 
125
134
  /* retrieval span 内嵌迷你命中列表(rank + title + .icen-kb-score 序数条) */
126
135
  .icen-kb-trace-hits { display: flex; flex-direction: column; gap: 2px; }
@@ -129,11 +138,11 @@
129
138
  grid-template-columns: 18px minmax(0, 1fr) minmax(88px, 140px);
130
139
  align-items: center;
131
140
  gap: 8px;
132
- min-height: 22px;
141
+ min-height: 24px;
133
142
  }
134
143
  .icen-kb-trace-hit-rank { text-align: right; /* guard:allow-physical rank 是数字(LTR 文种),物理右对齐惯例,RTL 不镜像 */ color: var(--icen-token-text-faint); }
135
144
  .icen-kb-trace-hit-title {
136
- font-size: 12px;
145
+ font-size: var(--icen-font-size-caption);
137
146
  color: var(--icen-token-text-muted);
138
147
  overflow: hidden;
139
148
  text-overflow: ellipsis;
@@ -154,13 +163,13 @@
154
163
  .icen-kb-review {
155
164
  display: grid;
156
165
  grid-template-columns: 300px minmax(0, 1fr);
157
- gap: 16px;
166
+ gap: 12px;
158
167
  align-items: start;
159
168
  }
160
169
 
161
170
  /* 队列列表(起始缘列,RTL 镜像) */
162
171
  .icen-kb-review-queue { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
163
- .icen-kb-review-filter { display: flex; align-items: center; gap: 8px; font-size: 11.5px; color: var(--icen-token-text-faint); }
172
+ .icen-kb-review-filter { display: flex; align-items: center; gap: 8px; font-size: var(--icen-font-size-caption); color: var(--icen-token-text-faint); }
164
173
  /* 弹层选择器(icen-select)域钩子:面样式随 select.css,此处只管布局 */
165
174
  .icen-kb-review-filter-select { flex: 0 1 160px; }
166
175
  .icen-kb-review-assign { flex: 0 1 180px; }
@@ -171,23 +180,28 @@
171
180
  grid-template-columns: auto minmax(0, 1fr) auto auto;
172
181
  align-items: center;
173
182
  gap: 8px;
174
- min-height: 28px;
183
+ min-height: var(--icen-density-item-height);
175
184
  padding: 3px 8px;
176
185
  border: none;
177
186
  background: none;
178
187
  border-radius: var(--icen-radius-sm);
179
188
  font: inherit;
180
- font-size: 12.5px;
189
+ font-size: var(--icen-font-size-control);
181
190
  color: var(--icen-token-text-muted);
182
191
  cursor: pointer;
183
192
  text-align: start;
193
+ transition: background-color var(--icen-tx-fast), color var(--icen-tx-fast);
184
194
  }
185
- .icen-kb-review-item:hover { background: var(--icen-token-bg-soft); color: var(--icen-token-text); }
186
- .icen-kb-review-item:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: -2px; }
195
+ .icen-kb-review-item:hover { background: var(--icen-token-fill-hover); color: var(--icen-token-text); }
196
+ .icen-kb-review-item:active { background: var(--icen-token-fill-pressed); }
197
+ .icen-kb-review-item:focus-visible { outline: none; box-shadow: var(--icen-ring); }
198
+ /* 选中 = 持续 accent 底色(不加左侧竖条,避免与语义色条混淆) */
187
199
  .icen-kb-review-item.is-active {
188
- background: var(--icen-token-bg-soft);
200
+ background: var(--icen-token-fill-selected);
189
201
  color: var(--icen-token-text);
190
- box-shadow: inset 2px 0 0 var(--icen-token-accent); /* guard:allow-physical box-shadow 无逻辑属性(inset 起始缘描边),RTL 镜像规则换 -2px */
202
+ }
203
+ .icen-kb-review-item.is-active:hover {
204
+ background: color-mix(in srgb, var(--icen-token-fill-selected) 82%, var(--icen-token-fill-hover));
191
205
  }
192
206
  .icen-kb-review-item.is-done .icen-kb-review-item-title { color: var(--icen-token-text-faint); }
193
207
  .icen-kb-review-item-title {
@@ -197,15 +211,19 @@
197
211
  white-space: nowrap;
198
212
  }
199
213
  .icen-kb-review-item-kind {
200
- font-size: 10.5px;
214
+ display: inline-flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ min-block-size: 22px;
218
+ padding: 0 7px;
219
+ font-size: var(--icen-density-font-size-xs);
201
220
  line-height: 1;
202
221
  color: var(--icen-token-text-faint);
203
222
  border: 1px solid var(--icen-token-line-soft);
204
223
  border-radius: var(--icen-radius-full);
205
- padding: 2px 6px;
206
224
  white-space: nowrap;
207
225
  }
208
- .icen-kb-review-item-assignee { font-size: 11px; color: var(--icen-token-text-faint); white-space: nowrap; }
226
+ .icen-kb-review-item-assignee { font-size: var(--icen-density-font-size-xs); color: var(--icen-token-text-faint); white-space: nowrap; }
209
227
 
210
228
  /* 行内末端列:审查卡(全键盘流挂载点,RTL 镜像) */
211
229
  .icen-kb-review-card {
@@ -218,15 +236,19 @@
218
236
  border-radius: var(--icen-radius-md);
219
237
  background: var(--icen-token-surface);
220
238
  }
221
- .icen-kb-review-card:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: -2px; }
239
+ .icen-kb-review-card:focus-visible { outline: none; box-shadow: var(--icen-ring); }
222
240
  .icen-kb-review-card-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
223
241
  .icen-kb-review-card-kind {
224
- font-size: 10.5px;
242
+ display: inline-flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ min-block-size: 22px;
246
+ padding: 0 7px;
247
+ font-size: var(--icen-density-font-size-xs);
225
248
  line-height: 1;
226
249
  color: var(--icen-token-text-faint);
227
250
  border: 1px solid var(--icen-token-line-soft);
228
251
  border-radius: var(--icen-radius-full);
229
- padding: 2.5px 7px;
230
252
  white-space: nowrap;
231
253
  }
232
254
  .icen-kb-review-card-title {
@@ -235,13 +257,13 @@
235
257
  overflow: hidden;
236
258
  text-overflow: ellipsis;
237
259
  white-space: nowrap;
238
- font-size: 13px;
260
+ font-size: var(--icen-density-font-size-md);
239
261
  font-weight: 600;
240
262
  color: var(--icen-token-text);
241
263
  }
242
264
 
243
265
  /* rubric 行:categorical chips / numeric 滑杆 */
244
- .icen-kb-review-rubrics { display: flex; flex-direction: column; gap: 10px; }
266
+ .icen-kb-review-rubrics { display: flex; flex-direction: column; gap: 12px; }
245
267
  .icen-kb-review-rubric {
246
268
  display: flex;
247
269
  flex-direction: column;
@@ -250,27 +272,32 @@
250
272
  background: var(--icen-token-bg-soft);
251
273
  border-radius: var(--icen-radius-sm);
252
274
  }
253
- .icen-kb-review-rubric-name { font-size: 12.5px; font-weight: 500; color: var(--icen-token-text); }
254
- .icen-kb-review-rubric-desc { font-size: 11.5px; font-weight: 400; color: var(--icen-token-text-faint); margin-inline-start: 6px; }
275
+ .icen-kb-review-rubric-name { font-size: var(--icen-font-size-control); font-weight: 500; color: var(--icen-token-text); }
276
+ .icen-kb-review-rubric-desc { font-size: var(--icen-font-size-caption); font-weight: 400; color: var(--icen-token-text-faint); margin-inline-start: 6px; }
255
277
 
256
278
  .icen-kb-review-chips { display: flex; flex-wrap: wrap; gap: 6px; }
257
279
  .icen-kb-review-chip {
258
280
  display: inline-flex;
259
281
  align-items: center;
282
+ justify-content: center;
260
283
  gap: 6px;
284
+ min-block-size: 24px;
285
+ padding: 0 10px;
261
286
  font: inherit;
262
- font-size: 12px;
287
+ font-size: var(--icen-density-font-size-xs);
288
+ line-height: 1;
263
289
  color: var(--icen-token-text-muted);
264
290
  background: var(--icen-token-bg);
265
291
  border: 1px solid var(--icen-token-line-soft);
266
292
  border-radius: var(--icen-radius-full);
267
- padding: 3px 10px;
268
293
  cursor: pointer;
294
+ transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast), border-color var(--icen-tx-fast);
269
295
  }
270
- .icen-kb-review-chip:hover { border-color: var(--icen-token-line); color: var(--icen-token-text); }
271
- .icen-kb-review-chip:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 1px; }
296
+ .icen-kb-review-chip:hover { border-color: var(--icen-token-line); background: var(--icen-token-fill-hover); color: var(--icen-token-text); }
297
+ .icen-kb-review-chip:active { background: var(--icen-token-fill-pressed); }
298
+ .icen-kb-review-chip:focus-visible { outline: none; box-shadow: var(--icen-ring); }
272
299
  .icen-kb-review-chip.is-on {
273
- color: var(--icen-token-accent);
300
+ color: var(--icen-token-accent-text); /* accent 叠 accent-subtle 浅色 ~3.5:1,chip 字 11px 低于 AA,用可读变体 */
274
301
  border-color: color-mix(in srgb, var(--icen-token-accent) 50%, transparent);
275
302
  background: var(--icen-token-accent-subtle);
276
303
  }
@@ -284,19 +311,24 @@
284
311
  .icen-kb-review-submit {
285
312
  display: inline-flex;
286
313
  align-items: center;
314
+ justify-content: center;
287
315
  gap: 8px;
316
+ min-block-size: var(--icen-density-item-height);
317
+ padding: 0 12px;
288
318
  font: inherit;
289
- font-size: 12.5px;
319
+ font-size: var(--icen-font-size-control);
320
+ line-height: 1;
290
321
  color: var(--icen-token-on-accent);
291
322
  background: var(--icen-token-accent-strong);
292
323
  border: none;
293
324
  border-radius: var(--icen-radius-sm);
294
- padding: 6px 14px;
295
325
  cursor: pointer;
326
+ transition: background-color var(--icen-tx-fast), box-shadow var(--icen-tx-fast);
296
327
  }
297
- .icen-kb-review-submit:hover { background: var(--icen-token-accent-deep); }
298
- .icen-kb-review-submit:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 2px; }
299
- .icen-kb-review-hint { font-size: 11.5px; color: var(--icen-token-text-faint); }
328
+ .icen-kb-review-submit:hover { background: color-mix(in srgb, var(--icen-token-accent-strong) 92%, var(--icen-token-text)); }
329
+ .icen-kb-review-submit:active { background: color-mix(in srgb, var(--icen-token-accent-strong) 84%, var(--icen-token-text)); }
330
+ .icen-kb-review-submit:focus-visible { outline: none; box-shadow: var(--icen-ring); }
331
+ .icen-kb-review-hint { font-size: var(--icen-font-size-caption); color: var(--icen-token-text-faint); }
300
332
 
301
333
  /* 快捷键小浮层(? 切换;复用 .icen-kb-key 键位帽;钉在卡片行内末端上角) */
302
334
  .icen-kb-review-keys {
@@ -309,12 +341,12 @@
309
341
  gap: 6px;
310
342
  padding: 10px 12px;
311
343
  min-width: 208px;
312
- background: var(--icen-token-surface);
344
+ background: var(--icen-token-surface-raised);
313
345
  border: 1px solid var(--icen-token-line-soft);
314
346
  border-radius: var(--icen-radius-md);
315
347
  box-shadow: var(--icen-token-shadow-elevated);
316
348
  }
317
- .icen-kb-review-keys-row { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--icen-token-text-muted); }
349
+ .icen-kb-review-keys-row { display: flex; align-items: center; gap: 8px; font-size: var(--icen-font-size-caption); color: var(--icen-token-text-muted); }
318
350
  .icen-kb-review-keys-row .icen-kb-key { flex: 0 0 auto; }
319
351
 
320
352
  /* ═══════════════ kb-gap:无答案分析 ═══════════════ */
@@ -336,6 +368,7 @@
336
368
  background: var(--icen-token-line);
337
369
  border-radius: 2px 2px 0 0; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
338
370
  align-self: flex-end;
371
+ transition: background-color var(--icen-tx-fast);
339
372
  }
340
373
  .icen-kb-gap-bar:hover { background: var(--icen-token-accent); }
341
374
 
@@ -347,19 +380,20 @@
347
380
  align-items: center;
348
381
  gap: 10px;
349
382
  min-height: 32px;
350
- padding: 3px 8px;
383
+ padding: 2px 8px;
351
384
  border-bottom: 1px solid var(--icen-token-line-soft);
352
385
  }
353
386
  .icen-kb-gap-row:last-child { border-bottom: none; }
354
387
  .icen-kb-gap-row--head {
355
- min-height: 28px;
356
- font-size: 11px;
388
+ min-height: var(--icen-density-item-height);
389
+ font-size: var(--icen-density-font-size-xs);
390
+ letter-spacing: 0.3px;
357
391
  color: var(--icen-token-text-faint);
358
392
  border-bottom: 1px solid var(--icen-token-line);
359
393
  }
360
394
  .icen-kb-gap-query {
361
395
  font-family: var(--icen-font-mono);
362
- font-size: 12px;
396
+ font-size: var(--icen-density-font-size-xs);
363
397
  color: var(--icen-token-text);
364
398
  overflow: hidden;
365
399
  text-overflow: ellipsis;
@@ -370,45 +404,55 @@
370
404
  /* 口径注释:「零点击 ≠ 失败」(小字 + title tooltip;不上告警色) */
371
405
  .icen-kb-gap-note {
372
406
  margin-inline-start: 6px;
373
- font-size: 10.5px;
407
+ font-size: var(--icen-density-font-size-xs);
374
408
  color: var(--icen-token-text-faint);
375
409
  border-bottom: 1px dashed var(--icen-token-line-soft);
376
410
  cursor: help;
377
411
  }
378
- .icen-kb-gap-lastseen { font-size: 11.5px; color: var(--icen-token-text-faint); text-align: end; white-space: nowrap; }
412
+ .icen-kb-gap-lastseen { font-size: var(--icen-font-size-caption); color: var(--icen-token-text-faint); text-align: end; white-space: nowrap; }
379
413
  .icen-kb-gap-actions { display: inline-flex; gap: 6px; justify-self: end; }
380
414
  .icen-kb-gap-action {
415
+ display: inline-flex;
416
+ align-items: center;
417
+ justify-content: center;
418
+ min-block-size: var(--icen-density-item-height);
419
+ padding: 0 10px;
381
420
  font: inherit;
382
- font-size: 11.5px;
421
+ font-size: var(--icen-density-font-size-xs);
422
+ line-height: 1;
383
423
  color: var(--icen-token-text-muted);
384
424
  background: none;
385
425
  border: 1px solid var(--icen-token-line-soft);
386
426
  border-radius: var(--icen-radius-sm);
387
- padding: 2px 8px;
388
427
  cursor: pointer;
389
428
  white-space: nowrap;
429
+ transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast), border-color var(--icen-tx-fast);
390
430
  }
391
- .icen-kb-gap-action:hover { color: var(--icen-token-text); border-color: var(--icen-token-line); }
392
- .icen-kb-gap-action:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 1px; }
431
+ .icen-kb-gap-action:hover { color: var(--icen-token-text); border-color: var(--icen-token-line); background: var(--icen-token-fill-hover); }
432
+ .icen-kb-gap-action:active { background: var(--icen-token-fill-pressed); }
433
+ .icen-kb-gap-action:focus-visible { outline: none; box-shadow: var(--icen-ring); }
393
434
 
394
435
  /* ═══════════════ kb-eval:评估对比 ═══════════════ */
395
436
 
396
437
  .icen-kb-eval { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
397
438
 
398
- .icen-kb-eval-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 12px; color: var(--icen-token-text-faint); }
439
+ .icen-kb-eval-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: var(--icen-font-size-caption); color: var(--icen-token-text-faint); }
399
440
  /* 弹层选择器(icen-select)域钩子:面样式随 select.css,此处只管布局 */
400
441
  .icen-kb-eval-run { flex: 0 1 220px; }
401
442
 
402
443
  /* Summary 判级行(告警才上色:improvement 绿 / regression 红 / tradeoff 警示 / tie 中性) */
403
- .icen-kb-eval-summary { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 12.5px; color: var(--icen-token-text-muted); }
444
+ .icen-kb-eval-summary { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: var(--icen-font-size-control); color: var(--icen-token-text-muted); }
404
445
  .icen-kb-eval-grade {
405
446
  display: inline-flex;
406
447
  align-items: center;
448
+ justify-content: center;
407
449
  gap: 6px;
408
- font-size: 11.5px;
450
+ min-block-size: 22px;
451
+ padding: 0 9px;
452
+ font-size: var(--icen-density-font-size-xs);
453
+ line-height: 1;
409
454
  border: 1px solid var(--icen-token-line-soft);
410
455
  border-radius: var(--icen-radius-full);
411
- padding: 2.5px 9px;
412
456
  color: var(--icen-token-text-faint);
413
457
  }
414
458
  .icen-kb-eval-grade.is-improvement {
@@ -428,20 +472,27 @@
428
472
  }
429
473
 
430
474
  .icen-kb-eval-filter {
475
+ display: inline-flex;
476
+ align-items: center;
477
+ justify-content: center;
478
+ min-block-size: 24px;
479
+ padding: 0 10px;
431
480
  font: inherit;
432
- font-size: 11.5px;
481
+ font-size: var(--icen-density-font-size-xs);
482
+ line-height: 1;
433
483
  color: var(--icen-token-text-muted);
434
484
  background: none;
435
485
  border: 1px solid var(--icen-token-line-soft);
436
486
  border-radius: var(--icen-radius-full);
437
- padding: 2px 10px;
438
487
  cursor: pointer;
439
488
  white-space: nowrap;
489
+ transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast), border-color var(--icen-tx-fast);
440
490
  }
441
- .icen-kb-eval-filter:hover { color: var(--icen-token-text); border-color: var(--icen-token-line); }
442
- .icen-kb-eval-filter:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 1px; }
491
+ .icen-kb-eval-filter:hover { color: var(--icen-token-text); border-color: var(--icen-token-line); background: var(--icen-token-fill-hover); }
492
+ .icen-kb-eval-filter:active { background: var(--icen-token-fill-pressed); }
493
+ .icen-kb-eval-filter:focus-visible { outline: none; box-shadow: var(--icen-ring); }
443
494
  .icen-kb-eval-filter.is-on {
444
- color: var(--icen-token-accent);
495
+ color: var(--icen-token-accent-text); /* 同 review-chip:小字走可读变体 */
445
496
  border-color: color-mix(in srgb, var(--icen-token-accent) 50%, transparent);
446
497
  background: var(--icen-token-accent-subtle);
447
498
  }
@@ -456,7 +507,8 @@
456
507
  }
457
508
  .icen-kb-eval-grid--head { border-bottom: 1px solid var(--icen-token-line); }
458
509
  .icen-kb-eval-h {
459
- font-size: 11px;
510
+ font-size: var(--icen-density-font-size-xs);
511
+ letter-spacing: 0.3px;
460
512
  color: var(--icen-token-text-faint);
461
513
  padding: 4px 8px;
462
514
  white-space: nowrap;
@@ -466,15 +518,16 @@
466
518
  .icen-kb-eval-h--group { text-align: center; border-inline-start: 1px solid var(--icen-token-line-soft); }
467
519
  .icen-kb-eval-h--sub { text-align: right; /* guard:allow-physical 指标子列头是数值口径(LTR 文种),物理右对齐惯例,RTL 不镜像 */ border-inline-start: 1px solid var(--icen-token-line-soft); }
468
520
 
469
- .icen-kb-eval-rowline { border-bottom: 1px solid var(--icen-token-line-soft); cursor: pointer; }
470
- .icen-kb-eval-rowline:hover { background: var(--icen-token-bg-soft); }
471
- .icen-kb-eval-rowline:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: -2px; }
521
+ .icen-kb-eval-rowline { min-block-size: var(--icen-density-item-height); border-bottom: 1px solid var(--icen-token-line-soft); cursor: pointer; transition: background-color var(--icen-tx-fast); }
522
+ .icen-kb-eval-rowline:hover { background: var(--icen-token-fill-hover); }
523
+ .icen-kb-eval-rowline:active { background: var(--icen-token-fill-pressed); }
524
+ .icen-kb-eval-rowline:focus-visible { outline: none; box-shadow: var(--icen-ring); }
472
525
  .icen-kb-eval-item:last-child .icen-kb-eval-rowline { border-bottom: none; }
473
526
 
474
527
  .icen-kb-eval-cell {
475
528
  min-width: 0;
476
529
  padding: 4px 8px;
477
- font-size: 12px;
530
+ font-size: var(--icen-font-size-caption);
478
531
  color: var(--icen-token-text-muted);
479
532
  overflow: hidden;
480
533
  text-overflow: ellipsis;
@@ -483,7 +536,7 @@
483
536
  .icen-kb-eval-cell--input { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
484
537
  .icen-kb-eval-key {
485
538
  font-family: var(--icen-font-mono);
486
- font-size: 10.5px;
539
+ font-size: var(--icen-density-font-size-xs);
487
540
  color: var(--icen-token-text-faint);
488
541
  overflow: hidden;
489
542
  text-overflow: ellipsis;
@@ -504,11 +557,11 @@
504
557
  border-radius: var(--icen-radius-sm);
505
558
  }
506
559
  .icen-kb-eval-detail-col { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
507
- .icen-kb-eval-detail-label { font-size: 11px; color: var(--icen-token-text-faint); }
560
+ .icen-kb-eval-detail-label { font-size: var(--icen-density-font-size-xs); letter-spacing: 0.3px; color: var(--icen-token-text-faint); }
508
561
  .icen-kb-eval-detail-pre {
509
562
  margin: 0;
510
563
  font-family: var(--icen-font-mono);
511
- font-size: 12px;
564
+ font-size: var(--icen-font-size-caption);
512
565
  line-height: 1.6;
513
566
  white-space: pre-wrap;
514
567
  word-break: break-word;
@@ -535,12 +588,31 @@
535
588
  .icen-kb-eval-item[hidden],
536
589
  .icen-kb-gap-row[hidden] { display: none; }
537
590
 
591
+ /* ═══════════════ 密度档(compact:收紧行距,可点面不低于 24px) ═══════════════ */
592
+
593
+ [data-icen-density='compact'] .icen-kb-span { min-height: var(--icen-density-item-height); padding-block: 1px; }
594
+ [data-icen-density='compact'] .icen-kb-trace-hit { min-height: 22px; }
595
+ [data-icen-density='compact'] .icen-kb-review { gap: 10px; }
596
+ [data-icen-density='compact'] .icen-kb-review-item { min-height: var(--icen-density-item-height); padding-block: 1px; }
597
+ [data-icen-density='compact'] .icen-kb-review-rubric { padding: 6px 8px; }
598
+ [data-icen-density='compact'] .icen-kb-gap-row { min-height: var(--icen-density-item-height); }
599
+ [data-icen-density='compact'] .icen-kb-gap-action { min-block-size: 24px; }
600
+ [data-icen-density='compact'] .icen-kb-eval-rowline { min-block-size: 24px; }
601
+ [data-icen-density='compact'] .icen-kb-eval-cell { padding-block: 2px; }
602
+
538
603
  /* ═══════════════ 动效退化(reduced-motion:瞬时) ═══════════════ */
539
604
 
540
605
  @media (prefers-reduced-motion: reduce) {
606
+ .icen-kb-span,
541
607
  .icen-kb-span-caret,
542
608
  .icen-kb-span-bar,
543
- .icen-kb-gap-bar { transition: none; }
609
+ .icen-kb-review-item,
610
+ .icen-kb-review-chip,
611
+ .icen-kb-review-submit,
612
+ .icen-kb-gap-bar,
613
+ .icen-kb-gap-action,
614
+ .icen-kb-eval-filter,
615
+ .icen-kb-eval-rowline { transition: none; }
544
616
  .icen-kb-span.is-running .icen-kb-span-bar { animation: none; }
545
617
  }
546
618
 
@@ -548,7 +620,49 @@
548
620
  /* trace 树 caret:共享 chevron mask 经 scaleX(-1) 翻转向左 */
549
621
  :is([dir='rtl']) .icen-kb-span-caret { transform: scaleX(-1); }
550
622
  :is([dir='rtl']) .icen-kb-span[aria-expanded='true'] .icen-kb-span-caret { transform: rotate(90deg) scaleX(-1); }
551
- /* review 队列激活描边:box-shadow 无逻辑属性,inset 起始缘 2px 在 RTL 下取负 */
552
- :is([dir='rtl']) .icen-kb-review-item.is-active { box-shadow: inset -2px 0 0 var(--icen-token-accent); }
623
+
624
+ /* ═══════════════ 高对比模式:状态与可点边界不依赖底色差 ═══════════════ */
625
+
626
+ @media (forced-colors: active) {
627
+ .icen-kb-span-kind,
628
+ .icen-kb-review-item-kind,
629
+ .icen-kb-review-card-kind,
630
+ .icen-kb-review-chip,
631
+ .icen-kb-eval-grade,
632
+ .icen-kb-eval-filter,
633
+ .icen-kb-gap-action,
634
+ .icen-kb-review-submit { border: 1px solid CanvasText; }
635
+ .icen-kb-span-bar,
636
+ .icen-kb-gap-bar { background: CanvasText; }
637
+ .icen-kb-trace-body { border-inline-start-color: CanvasText; }
638
+ .icen-kb-eval-rowline:hover,
639
+ .icen-kb-review-item:hover { background: Highlight; color: HighlightText; }
640
+ .icen-kb-review-item.is-active {
641
+ background: Canvas;
642
+ color: CanvasText;
643
+ outline: 2px solid Highlight;
644
+ outline-offset: -2px;
645
+ }
646
+ .icen-kb-review-chip.is-on,
647
+ .icen-kb-eval-filter.is-on {
648
+ background: Canvas;
649
+ color: CanvasText;
650
+ border-color: Highlight;
651
+ }
652
+ .icen-kb-review-submit { background: Highlight; color: HighlightText; border-color: Highlight; }
653
+ .icen-kb-review-keys { background: Canvas; border-color: CanvasText; box-shadow: none; }
654
+ .icen-kb-span:focus-visible,
655
+ .icen-kb-review-item:focus-visible,
656
+ .icen-kb-review-card:focus-visible,
657
+ .icen-kb-review-chip:focus-visible,
658
+ .icen-kb-review-submit:focus-visible,
659
+ .icen-kb-gap-action:focus-visible,
660
+ .icen-kb-eval-filter:focus-visible,
661
+ .icen-kb-eval-rowline:focus-visible {
662
+ outline: 2px solid Highlight;
663
+ outline-offset: -2px;
664
+ box-shadow: none;
665
+ }
666
+ }
553
667
 
554
668
  }
@@ -0,0 +1,2 @@
1
+ // kit: kb-passage 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/kb-passage.mjs';