@icen.ai/ui 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/AGENTS.md +82 -254
  2. package/LICENSE +21 -0
  3. package/README.md +60 -96
  4. package/dist/base.css +258 -188
  5. package/dist/behaviors/accordion.mjs +8 -8
  6. package/dist/behaviors/ai-branch.d.mts +1 -1
  7. package/dist/behaviors/ai-branch.mjs +1011 -94
  8. package/dist/behaviors/ai-chat.d.mts +9 -9
  9. package/dist/behaviors/ai-chat.mjs +1122 -169
  10. package/dist/behaviors/ai-composer.d.mts +47 -15
  11. package/dist/behaviors/ai-composer.mjs +2018 -534
  12. package/dist/behaviors/ai-core.d.mts +1 -1
  13. package/dist/behaviors/ai-core.mjs +1017 -107
  14. package/dist/behaviors/ai-diff.mjs +1020 -127
  15. package/dist/behaviors/ai-feedback.d.mts +1 -1
  16. package/dist/behaviors/ai-feedback.mjs +1036 -126
  17. package/dist/behaviors/ai-panel.d.mts +10 -10
  18. package/dist/behaviors/ai-panel.mjs +1285 -266
  19. package/dist/behaviors/ai-provider.d.mts +1 -1
  20. package/dist/behaviors/ai-provider.mjs +1004 -101
  21. package/dist/behaviors/ai-threads.d.mts +1 -1
  22. package/dist/behaviors/ai-threads.mjs +1069 -154
  23. package/dist/behaviors/ai-tool.d.mts +3 -3
  24. package/dist/behaviors/ai-tool.mjs +2087 -413
  25. package/dist/behaviors/ai-tools.d.mts +89 -16
  26. package/dist/behaviors/ai-tools.mjs +5365 -380
  27. package/dist/behaviors/autocomplete.d.mts +53 -0
  28. package/dist/behaviors/autocomplete.mjs +1601 -0
  29. package/dist/behaviors/back-top.d.mts +1 -1
  30. package/dist/behaviors/back-top.mjs +952 -14
  31. package/dist/behaviors/carousel.d.mts +1 -1
  32. package/dist/behaviors/carousel.mjs +914 -12
  33. package/dist/behaviors/cascader.d.mts +48 -0
  34. package/dist/behaviors/cascader.mjs +1867 -0
  35. package/dist/behaviors/charts.d.mts +72 -8
  36. package/dist/behaviors/charts.mjs +1953 -272
  37. package/dist/behaviors/code-block.d.mts +36 -0
  38. package/dist/behaviors/code-block.mjs +1619 -0
  39. package/dist/behaviors/command-palette.d.mts +9 -6
  40. package/dist/behaviors/command-palette.mjs +164 -62
  41. package/dist/behaviors/context-menu.d.mts +10 -9
  42. package/dist/behaviors/context-menu.mjs +1113 -44
  43. package/dist/behaviors/controls.d.mts +21 -21
  44. package/dist/behaviors/controls.mjs +1024 -134
  45. package/dist/behaviors/copy.d.mts +21 -2
  46. package/dist/behaviors/copy.mjs +1207 -42
  47. package/dist/behaviors/datatable.d.mts +55 -5
  48. package/dist/behaviors/datatable.mjs +2033 -212
  49. package/dist/behaviors/date-picker.d.mts +0 -1
  50. package/dist/behaviors/date-picker.mjs +1341 -293
  51. package/dist/behaviors/design.d.mts +54 -0
  52. package/dist/behaviors/design.mjs +109 -0
  53. package/dist/behaviors/dropdown.d.mts +5 -6
  54. package/dist/behaviors/dropdown.mjs +262 -110
  55. package/dist/behaviors/events.d.mts +127 -10
  56. package/dist/behaviors/events.mjs +58 -3
  57. package/dist/behaviors/feedback.d.mts +30 -0
  58. package/dist/behaviors/feedback.mjs +296 -0
  59. package/dist/behaviors/focus.d.mts +8 -0
  60. package/dist/behaviors/focus.mjs +24 -0
  61. package/dist/behaviors/form-validate.d.mts +111 -0
  62. package/dist/behaviors/form-validate.mjs +1746 -0
  63. package/dist/behaviors/i18n.d.mts +790 -0
  64. package/dist/behaviors/i18n.mjs +1713 -0
  65. package/dist/behaviors/icons.d.mts +93 -0
  66. package/dist/behaviors/icons.mjs +113 -0
  67. package/dist/behaviors/input.d.mts +9 -1
  68. package/dist/behaviors/input.mjs +1059 -60
  69. package/dist/behaviors/kb-access.d.mts +3 -3
  70. package/dist/behaviors/kb-access.mjs +2135 -239
  71. package/dist/behaviors/kb-acl.d.mts +8 -8
  72. package/dist/behaviors/kb-acl.mjs +1120 -179
  73. package/dist/behaviors/kb-answer.d.mts +2 -2
  74. package/dist/behaviors/kb-answer.mjs +2120 -435
  75. package/dist/behaviors/kb-audit.d.mts +3 -3
  76. package/dist/behaviors/kb-audit.mjs +1077 -154
  77. package/dist/behaviors/kb-canvas.d.mts +3 -3
  78. package/dist/behaviors/kb-canvas.mjs +1101 -177
  79. package/dist/behaviors/kb-chain.d.mts +2 -2
  80. package/dist/behaviors/kb-chain.mjs +1023 -100
  81. package/dist/behaviors/kb-checkpoint.d.mts +3 -3
  82. package/dist/behaviors/kb-checkpoint.mjs +1320 -169
  83. package/dist/behaviors/kb-chunks.d.mts +2 -2
  84. package/dist/behaviors/kb-chunks.mjs +1153 -213
  85. package/dist/behaviors/kb-citation.d.mts +3 -3
  86. package/dist/behaviors/kb-citation.mjs +1221 -185
  87. package/dist/behaviors/kb-clarify.d.mts +2 -2
  88. package/dist/behaviors/kb-clarify.mjs +1059 -130
  89. package/dist/behaviors/kb-conflict.d.mts +2 -2
  90. package/dist/behaviors/kb-conflict.mjs +1042 -119
  91. package/dist/behaviors/kb-connector.d.mts +2 -2
  92. package/dist/behaviors/kb-connector.mjs +1105 -176
  93. package/dist/behaviors/kb-core.d.mts +7 -2
  94. package/dist/behaviors/kb-core.mjs +1078 -162
  95. package/dist/behaviors/kb-eval.d.mts +2 -2
  96. package/dist/behaviors/kb-eval.mjs +1977 -144
  97. package/dist/behaviors/kb-explain.d.mts +3 -3
  98. package/dist/behaviors/kb-explain.mjs +1037 -104
  99. package/dist/behaviors/kb-filter.d.mts +2 -2
  100. package/dist/behaviors/kb-filter.mjs +2014 -178
  101. package/dist/behaviors/kb-gap.d.mts +3 -3
  102. package/dist/behaviors/kb-gap.mjs +1044 -121
  103. package/dist/behaviors/kb-hittest.d.mts +3 -3
  104. package/dist/behaviors/kb-hittest.mjs +1095 -151
  105. package/dist/behaviors/kb-metadata.mjs +1058 -130
  106. package/dist/behaviors/kb-passage.d.mts +4 -4
  107. package/dist/behaviors/kb-passage.mjs +1102 -161
  108. package/dist/behaviors/kb-pipeline.d.mts +4 -4
  109. package/dist/behaviors/kb-pipeline.mjs +1083 -162
  110. package/dist/behaviors/kb-qa.mjs +1089 -160
  111. package/dist/behaviors/kb-rerank.d.mts +2 -2
  112. package/dist/behaviors/kb-rerank.mjs +1048 -114
  113. package/dist/behaviors/kb-retrieval.d.mts +2 -2
  114. package/dist/behaviors/kb-retrieval.mjs +2079 -226
  115. package/dist/behaviors/kb-review.d.mts +2 -2
  116. package/dist/behaviors/kb-review.mjs +1996 -159
  117. package/dist/behaviors/kb-sandbox.d.mts +3 -3
  118. package/dist/behaviors/kb-sandbox.mjs +1033 -105
  119. package/dist/behaviors/kb-segment.d.mts +2 -2
  120. package/dist/behaviors/kb-segment.mjs +1112 -179
  121. package/dist/behaviors/kb-select.d.mts +24 -0
  122. package/dist/behaviors/kb-select.mjs +1995 -0
  123. package/dist/behaviors/kb-sources.d.mts +3 -3
  124. package/dist/behaviors/kb-sources.mjs +1085 -170
  125. package/dist/behaviors/kb-sql.d.mts +3 -3
  126. package/dist/behaviors/kb-sql.mjs +1144 -226
  127. package/dist/behaviors/kb-trace.d.mts +3 -3
  128. package/dist/behaviors/kb-trace.mjs +1051 -131
  129. package/dist/behaviors/kb-visibility.d.mts +2 -2
  130. package/dist/behaviors/kb-visibility.mjs +1087 -158
  131. package/dist/behaviors/kb-who-can.d.mts +2 -2
  132. package/dist/behaviors/kb-who-can.mjs +1980 -137
  133. package/dist/behaviors/mentions.d.mts +93 -0
  134. package/dist/behaviors/mentions.mjs +2153 -0
  135. package/dist/behaviors/modal.d.mts +4 -3
  136. package/dist/behaviors/modal.mjs +1056 -33
  137. package/dist/behaviors/nav.d.mts +1 -1
  138. package/dist/behaviors/nav.mjs +6 -6
  139. package/dist/behaviors/notification.d.mts +16 -8
  140. package/dist/behaviors/notification.mjs +1629 -268
  141. package/dist/behaviors/panel.d.mts +4 -0
  142. package/dist/behaviors/panel.mjs +995 -0
  143. package/dist/behaviors/popover.d.mts +28 -5
  144. package/dist/behaviors/popover.mjs +225 -24
  145. package/dist/behaviors/scroll-area.d.mts +17 -0
  146. package/dist/behaviors/scroll-area.mjs +59 -0
  147. package/dist/behaviors/select.d.mts +5 -2
  148. package/dist/behaviors/select.mjs +1416 -117
  149. package/dist/behaviors/sidebar.d.mts +1 -1
  150. package/dist/behaviors/sidebar.mjs +13 -13
  151. package/dist/behaviors/slider.d.mts +1 -1
  152. package/dist/behaviors/slider.mjs +12 -12
  153. package/dist/behaviors/split-pane.d.mts +1 -1
  154. package/dist/behaviors/split-pane.mjs +9 -7
  155. package/dist/behaviors/suggestions.d.mts +27 -0
  156. package/dist/behaviors/suggestions.mjs +1090 -0
  157. package/dist/behaviors/svg-parse.d.mts +14 -0
  158. package/dist/behaviors/svg-parse.mjs +37 -0
  159. package/dist/behaviors/tabs.d.mts +2 -2
  160. package/dist/behaviors/tabs.mjs +35 -25
  161. package/dist/behaviors/tag-input.d.mts +23 -5
  162. package/dist/behaviors/tag-input.mjs +1360 -104
  163. package/dist/behaviors/theme-switcher.d.mts +24 -0
  164. package/dist/behaviors/theme-switcher.mjs +1996 -0
  165. package/dist/behaviors/theme.d.mts +15 -8
  166. package/dist/behaviors/theme.mjs +406 -30
  167. package/dist/behaviors/toast.d.mts +24 -25
  168. package/dist/behaviors/toast.mjs +1267 -88
  169. package/dist/behaviors/tooltip.d.mts +4 -0
  170. package/dist/behaviors/tooltip.mjs +378 -0
  171. package/dist/behaviors/tree-select.d.mts +69 -0
  172. package/dist/behaviors/tree-select.mjs +1921 -0
  173. package/dist/behaviors/tree.d.mts +1 -1
  174. package/dist/behaviors/tree.mjs +18 -18
  175. package/dist/behaviors/upload.d.mts +3 -2
  176. package/dist/behaviors/upload.mjs +1077 -66
  177. package/dist/behaviors/url-safety.d.mts +8 -0
  178. package/dist/behaviors/url-safety.mjs +11 -0
  179. package/dist/cli.mjs +5 -6
  180. package/dist/components/accordion.d.mts +2 -0
  181. package/dist/components/ai-branch.d.mts +2 -0
  182. package/dist/components/ai-chat.css +682 -582
  183. package/dist/components/ai-chat.d.mts +2 -0
  184. package/dist/components/ai-composer.d.mts +2 -0
  185. package/dist/components/ai-context.d.mts +2 -0
  186. package/dist/components/ai-context.mjs +1 -0
  187. package/dist/components/ai-diff.css +153 -132
  188. package/dist/components/ai-diff.d.mts +2 -0
  189. package/dist/components/ai-feedback.d.mts +2 -0
  190. package/dist/components/ai-files.d.mts +2 -0
  191. package/dist/components/ai-message.d.mts +2 -0
  192. package/dist/components/ai-panel.css +353 -343
  193. package/dist/components/ai-reasoning.d.mts +2 -0
  194. package/dist/components/ai-subagent.d.mts +2 -0
  195. package/dist/components/ai-subagent.mjs +1 -0
  196. package/dist/components/ai-threads.d.mts +2 -0
  197. package/dist/components/ai-todo.d.mts +2 -0
  198. package/dist/components/ai-todo.mjs +1 -0
  199. package/dist/components/ai-tool-call.d.mts +2 -0
  200. package/dist/components/ai-tool-call.mjs +1 -0
  201. package/dist/components/ai-tool.css +397 -242
  202. package/dist/components/ai-usage.d.mts +2 -0
  203. package/dist/components/alert.d.mts +2 -0
  204. package/dist/components/autocomplete.css +61 -0
  205. package/dist/components/autocomplete.d.mts +2 -0
  206. package/dist/components/autocomplete.mjs +3 -0
  207. package/dist/components/avatar.d.mts +2 -0
  208. package/dist/components/back-top.css +74 -40
  209. package/dist/components/back-top.d.mts +2 -0
  210. package/dist/components/badge.css +44 -41
  211. package/dist/components/badge.d.mts +2 -0
  212. package/dist/components/breadcrumb.css +85 -46
  213. package/dist/components/breadcrumb.d.mts +2 -0
  214. package/dist/components/btn.css +105 -94
  215. package/dist/components/btn.d.mts +2 -0
  216. package/dist/components/card.css +124 -113
  217. package/dist/components/card.d.mts +2 -0
  218. package/dist/components/carousel.d.mts +2 -0
  219. package/dist/components/cascader.css +332 -0
  220. package/dist/components/cascader.d.mts +2 -0
  221. package/dist/components/cascader.mjs +3 -0
  222. package/dist/components/chart-area.css +54 -2
  223. package/dist/components/chart-area.d.mts +2 -0
  224. package/dist/components/chart-bar.css +147 -38
  225. package/dist/components/chart-bar.d.mts +2 -0
  226. package/dist/components/chart-calendar.d.mts +2 -0
  227. package/dist/components/chart-gauge.css +36 -13
  228. package/dist/components/chart-gauge.d.mts +2 -0
  229. package/dist/components/chart-graph.css +35 -20
  230. package/dist/components/chart-graph.d.mts +2 -0
  231. package/dist/components/chart-heatmap.css +67 -39
  232. package/dist/components/chart-heatmap.d.mts +2 -0
  233. package/dist/components/chart-line.css +62 -3
  234. package/dist/components/chart-line.d.mts +2 -0
  235. package/dist/components/chart-map.d.mts +2 -0
  236. package/dist/components/chart-pie.css +38 -6
  237. package/dist/components/chart-pie.d.mts +2 -0
  238. package/dist/components/chart-radar.css +57 -5
  239. package/dist/components/chart-radar.d.mts +2 -0
  240. package/dist/components/chart-scatter.css +47 -7
  241. package/dist/components/chart-scatter.d.mts +2 -0
  242. package/dist/components/chart-sparkline.css +25 -2
  243. package/dist/components/chart-sparkline.d.mts +2 -0
  244. package/dist/components/chart-stack.css +27 -13
  245. package/dist/components/chart-stack.d.mts +2 -0
  246. package/dist/components/charts.css +220 -84
  247. package/dist/components/charts.d.mts +2 -0
  248. package/dist/components/code-block.css +420 -0
  249. package/dist/components/code-block.d.mts +2 -0
  250. package/dist/components/code-block.mjs +4 -0
  251. package/dist/components/command-palette.css +150 -122
  252. package/dist/components/command-palette.d.mts +2 -0
  253. package/dist/components/content.css +274 -263
  254. package/dist/components/context-menu.d.mts +2 -0
  255. package/dist/components/copy.css +73 -45
  256. package/dist/components/copy.d.mts +2 -0
  257. package/dist/components/datatable.css +457 -202
  258. package/dist/components/datatable.d.mts +2 -0
  259. package/dist/components/date-picker.css +136 -105
  260. package/dist/components/date-picker.d.mts +2 -0
  261. package/dist/components/desc.d.mts +2 -0
  262. package/dist/components/dropdown.d.mts +2 -0
  263. package/dist/components/empty.css +72 -69
  264. package/dist/components/empty.d.mts +2 -0
  265. package/dist/components/feedback.css +211 -191
  266. package/dist/components/form-validate.css +134 -0
  267. package/dist/components/form-validate.d.mts +2 -0
  268. package/dist/components/form-validate.mjs +3 -0
  269. package/dist/components/form.css +157 -131
  270. package/dist/components/form.d.mts +2 -0
  271. package/dist/components/icon.css +113 -0
  272. package/dist/components/icon.d.mts +2 -0
  273. package/dist/components/icon.mjs +3 -0
  274. package/dist/components/input.css +163 -108
  275. package/dist/components/input.d.mts +2 -0
  276. package/dist/components/kb-access.d.mts +2 -0
  277. package/dist/components/kb-acl.d.mts +2 -0
  278. package/dist/components/kb-agent.css +300 -206
  279. package/dist/components/kb-answer.d.mts +2 -0
  280. package/dist/components/kb-audit.d.mts +2 -0
  281. package/dist/components/kb-canvas.d.mts +2 -0
  282. package/dist/components/kb-chain.d.mts +2 -0
  283. package/dist/components/kb-checkpoint.d.mts +2 -0
  284. package/dist/components/kb-chunks.d.mts +2 -0
  285. package/dist/components/kb-citation.d.mts +2 -0
  286. package/dist/components/kb-clarify.d.mts +2 -0
  287. package/dist/components/kb-conflict.d.mts +2 -0
  288. package/dist/components/kb-connector.d.mts +2 -0
  289. package/dist/components/kb-data.css +431 -315
  290. package/dist/components/kb-eval.d.mts +2 -0
  291. package/dist/components/kb-explain.d.mts +2 -0
  292. package/dist/components/kb-filter.d.mts +2 -0
  293. package/dist/components/kb-gap.d.mts +2 -0
  294. package/dist/components/kb-ground.css +333 -229
  295. package/dist/components/kb-hittest.d.mts +2 -0
  296. package/dist/components/kb-ingest.css +613 -434
  297. package/dist/components/kb-metadata.d.mts +2 -0
  298. package/dist/components/kb-ops.css +422 -302
  299. package/dist/components/kb-passage.d.mts +2 -0
  300. package/dist/components/kb-perm.css +374 -314
  301. package/dist/components/kb-pipeline.d.mts +2 -0
  302. package/dist/components/kb-qa.d.mts +2 -0
  303. package/dist/components/kb-rerank.d.mts +2 -0
  304. package/dist/components/kb-retrieval.d.mts +2 -0
  305. package/dist/components/kb-review.d.mts +2 -0
  306. package/dist/components/kb-sandbox.d.mts +2 -0
  307. package/dist/components/kb-search.css +653 -459
  308. package/dist/components/kb-segment.d.mts +2 -0
  309. package/dist/components/kb-sources.d.mts +2 -0
  310. package/dist/components/kb-sql.d.mts +2 -0
  311. package/dist/components/kb-trace.d.mts +2 -0
  312. package/dist/components/kb-visibility.d.mts +2 -0
  313. package/dist/components/kb-who-can.d.mts +2 -0
  314. package/dist/components/kb.css +170 -135
  315. package/dist/components/kb.d.mts +2 -0
  316. package/dist/components/kbd.d.mts +2 -0
  317. package/dist/components/layout.css +86 -83
  318. package/dist/components/layout.d.mts +2 -0
  319. package/dist/components/list.d.mts +2 -0
  320. package/dist/components/material-chinese.css +83 -0
  321. package/dist/components/material-soviet.css +86 -0
  322. package/dist/components/material.css +318 -0
  323. package/dist/components/media-card.d.mts +2 -0
  324. package/dist/components/media.css +225 -176
  325. package/dist/components/mentions.css +190 -0
  326. package/dist/components/mentions.d.mts +2 -0
  327. package/dist/components/mentions.mjs +3 -0
  328. package/dist/components/menu.css +121 -109
  329. package/dist/components/modal.css +116 -118
  330. package/dist/components/modal.d.mts +2 -0
  331. package/dist/components/nav.css +136 -129
  332. package/dist/components/nav.d.mts +2 -0
  333. package/dist/components/notification.css +247 -177
  334. package/dist/components/notification.d.mts +2 -0
  335. package/dist/components/pagination.css +62 -57
  336. package/dist/components/pagination.d.mts +2 -0
  337. package/dist/components/panel.css +70 -68
  338. package/dist/components/panel.d.mts +2 -0
  339. package/dist/components/panel.mjs +1 -0
  340. package/dist/components/pill.css +83 -72
  341. package/dist/components/pill.d.mts +2 -0
  342. package/dist/components/popover.css +80 -57
  343. package/dist/components/popover.d.mts +2 -0
  344. package/dist/components/progress.d.mts +2 -0
  345. package/dist/components/rating.d.mts +2 -0
  346. package/dist/components/result.d.mts +2 -0
  347. package/dist/components/scroll-area.css +29 -54
  348. package/dist/components/scroll-area.d.mts +2 -0
  349. package/dist/components/scroll-area.mjs +1 -0
  350. package/dist/components/segmented.css +167 -146
  351. package/dist/components/segmented.d.mts +2 -0
  352. package/dist/components/select.css +250 -191
  353. package/dist/components/select.d.mts +2 -0
  354. package/dist/components/sidebar.css +157 -143
  355. package/dist/components/sidebar.d.mts +2 -0
  356. package/dist/components/skeleton.d.mts +2 -0
  357. package/dist/components/slider.css +135 -128
  358. package/dist/components/slider.d.mts +2 -0
  359. package/dist/components/spinner.d.mts +2 -0
  360. package/dist/components/split-pane.css +120 -108
  361. package/dist/components/split-pane.d.mts +2 -0
  362. package/dist/components/stat.css +116 -109
  363. package/dist/components/stat.d.mts +2 -0
  364. package/dist/components/steps.css +114 -108
  365. package/dist/components/steps.d.mts +2 -0
  366. package/dist/components/switch.css +192 -149
  367. package/dist/components/switch.d.mts +2 -0
  368. package/dist/components/table.css +158 -112
  369. package/dist/components/table.d.mts +2 -0
  370. package/dist/components/tabs.css +143 -116
  371. package/dist/components/tabs.d.mts +2 -0
  372. package/dist/components/tag-input.css +52 -133
  373. package/dist/components/tag-input.d.mts +2 -0
  374. package/dist/components/tag.css +90 -72
  375. package/dist/components/tag.d.mts +2 -0
  376. package/dist/components/theme-switcher.css +105 -0
  377. package/dist/components/theme-switcher.d.mts +2 -0
  378. package/dist/components/theme-switcher.mjs +3 -0
  379. package/dist/components/timeline.d.mts +2 -0
  380. package/dist/components/toast.css +115 -97
  381. package/dist/components/toast.d.mts +2 -0
  382. package/dist/components/toolbar.css +47 -43
  383. package/dist/components/toolbar.d.mts +2 -0
  384. package/dist/components/tooltip.css +103 -43
  385. package/dist/components/tooltip.d.mts +2 -0
  386. package/dist/components/tooltip.mjs +1 -0
  387. package/dist/components/tree-select.css +439 -0
  388. package/dist/components/tree-select.d.mts +2 -0
  389. package/dist/components/tree-select.mjs +3 -0
  390. package/dist/components/tree.d.mts +2 -0
  391. package/dist/components/upload.css +138 -97
  392. package/dist/components/upload.d.mts +2 -0
  393. package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
  394. package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
  395. package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
  396. package/dist/fonts/OFL.txt +96 -0
  397. package/dist/fonts/README.md +14 -0
  398. package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
  399. package/dist/index.d.mts +85 -70
  400. package/dist/index.mjs +17330 -5773
  401. package/dist/react.d.mts +91 -0
  402. package/dist/react.mjs +8307 -0
  403. package/dist/registry.json +918 -70
  404. package/dist/tokens/chinese.css +44 -0
  405. package/dist/tokens/colors.css +371 -1222
  406. package/dist/tokens/design.css +209 -0
  407. package/dist/tokens/dtcg.json +15926 -0
  408. package/dist/tokens/figma.variables.json +10779 -0
  409. package/dist/tokens/icon-masks.css +78 -0
  410. package/dist/tokens/pixel.css +53 -0
  411. package/dist/tokens/scrollbars.css +40 -0
  412. package/dist/tokens/soviet.css +44 -0
  413. package/dist/tokens/style-profiles.css +36 -547
  414. package/dist/tokens/themes.json +308 -0
  415. package/dist/tokens/tokens-studio.json +11648 -0
  416. package/dist/tokens/typography.css +21 -18
  417. package/dist/tokens.css +1783 -1806
  418. package/dist/ui.css +14796 -10750
  419. package/dist/vue.d.mts +344 -0
  420. package/dist/vue.mjs +7876 -0
  421. package/docs/spec/ai-input-experience.md +75 -0
  422. package/docs/spec/ai-native.md +238 -147
  423. package/docs/spec/design-philosophy.md +189 -0
  424. package/docs/spec/design-primitives.md +196 -0
  425. package/docs/spec/kb-family.md +147 -115
  426. package/docs/spec/scrollbars.md +46 -0
  427. package/package.json +56 -8
  428. package/dist/retro-effects.css +0 -255
  429. package/dist/tokens/retro-effects.css +0 -255
  430. package/docs/research/2026-10-03-ai-kb-components.md +0 -392
  431. package/docs/research/2026-10-03-kb-permissions.md +0 -992
@@ -1,548 +1,668 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — kb-ops.css(治理域:kb-trace / kb-review / kb-gap / kb-eval)
3
- * 共享原语在 kb.css(.kb-row/.kb-num/.kb-score/.kb-dot/.kb-chip/.kb-key/.kb-empty…),
4
+ * 共享原语在 kb.css(.icen-kb-row/.icen-kb-num/.icen-kb-score/.icen-kb-dot/.icen-kb-chip/.icen-kb-key/.icen-kb-empty…),
4
5
  * 本文件只做本域专属结构。DOM 契约见 docs/spec/kb-family.md §5.19–5.22 与各 behavior 头注释。
5
6
  *
6
- * 治理域纪律(spec §2):整体 muted,告警才 warning/error;数字一律 .kb-num;
7
- * 动效 ≤240ms ease-out、流式脉冲 1.6s;只用 --token-* 与 kb.css 原语。
7
+ * 治理域纪律(spec §2):整体 muted,告警才 warning/error;数字一律 .icen-kb-num;
8
+ * 动效 ≤240ms ease-out、流式脉冲 1.6s;只用 --icen-token-* 与 kb.css 原语。
8
9
  */
9
10
 
10
11
  /* ═══════════════ kb-trace:span 树 ═══════════════ */
11
12
 
12
- .kb-trace { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
13
+ .icen-kb-trace { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
13
14
 
14
15
  /* 行:caret | kind 徽标(定宽对齐)| name | 耗时条 | elapsed;--depth×16px 缩进 */
15
- .kb-span {
16
+ /* 可点行 28px 节奏;hover 只抬底色不位移,按下用 pressed 档 */
17
+ .icen-kb-span {
16
18
  display: grid;
17
19
  grid-template-columns: 14px 64px minmax(0, 1fr) minmax(48px, 128px) 56px;
18
20
  align-items: center;
19
21
  gap: 8px;
20
- min-height: 26px;
21
- padding: 2px 8px 2px calc(8px + var(--depth, 0) * 16px);
22
+ min-height: var(--icen-density-item-height);
23
+ padding-block: 2px;
24
+ /* 深度缩进沿 inline-start(RTL 下树向左侧生长) */
25
+ padding-inline: calc(8px + var(--depth, 0) * 16px) 8px;
22
26
  border: none;
23
27
  background: none;
24
- border-radius: var(--radius-sm, 6px);
28
+ border-radius: var(--icen-radius-sm);
25
29
  font: inherit;
26
- font-size: 12.5px;
27
- color: var(--token-text-muted);
30
+ font-size: var(--icen-font-size-control);
31
+ line-height: 1.4;
32
+ color: var(--icen-token-text-muted);
28
33
  cursor: pointer;
29
- text-align: left;
30
- width: 100%;
34
+ text-align: start;
35
+ inline-size: 100%;
31
36
  position: relative;
37
+ transition: background-color var(--icen-tx-fast), color var(--icen-tx-fast);
32
38
  }
33
- .kb-span:hover { background: var(--token-bg-soft); color: var(--token-text); }
34
- .kb-span:focus-visible { outline: 2px solid var(--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); }
35
42
 
36
- /* 子 span 行前 1px 竖线(缩进连线) */
37
- .kb-span--child::before {
43
+ /* 子 span 行前 1px 竖线(缩进连线,沿 inline-start,RTL 镜像) */
44
+ .icen-kb-span--child::before {
38
45
  content: '';
39
46
  position: absolute;
40
- left: calc(var(--depth, 1) * 16px - 4px);
47
+ inset-inline-start: calc(var(--depth, 1) * 16px - 4px);
41
48
  top: 0;
42
49
  bottom: 0;
43
50
  width: 1px;
44
- background: var(--token-line-soft);
51
+ background: var(--icen-token-line-soft);
45
52
  }
46
53
 
47
- /* caret(有子才显;hidden 占位保持列对齐):CSS 三角,展开旋转 90° */
48
- .kb-span-caret {
49
- width: 0;
50
- height: 0;
51
- border-left: 4px solid var(--token-text-faint);
52
- border-top: 3px solid transparent;
53
- border-bottom: 3px solid transparent;
54
- transition: transform 0.16s ease-out;
54
+ /* caret(有子才显;hidden 占位保持列对齐):共享 chevron-right mask 指向行进方向,展开旋转 90°;RTL 经 scaleX(-1) 镜像 */
55
+ .icen-kb-span-caret {
56
+ inline-size: 12px;
57
+ block-size: 12px;
58
+ background: var(--icen-token-text-faint);
59
+ mask: var(--icen-token-icon-chevron-right) center / contain no-repeat;
60
+ transition: transform var(--icen-tx-fast);
55
61
  }
56
- .kb-span[aria-expanded='true'] .kb-span-caret { transform: rotate(90deg); }
62
+ .icen-kb-span[aria-expanded='true'] .icen-kb-span-caret { transform: rotate(90deg); }
57
63
 
58
- /* kind 徽标:中性线框;retrieval 为 accent 线框(证据域主角) */
59
- .kb-span-kind {
60
- font-size: 10.5px;
64
+ /* kind 徽标:中性线框;retrieval 为 accent 线框(证据域主角);22px 徽标高度 + 11px 字 */
65
+ .icen-kb-span-kind {
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);
61
72
  line-height: 1;
62
73
  letter-spacing: 0.3px;
63
- color: var(--token-text-faint);
64
- border: 1px solid var(--token-line-soft);
65
- border-radius: 999px;
66
- padding: 2.5px 7px;
74
+ color: var(--icen-token-text-faint);
75
+ border: 1px solid var(--icen-token-line-soft);
76
+ border-radius: var(--icen-radius-full);
67
77
  white-space: nowrap;
68
78
  justify-self: start;
69
79
  }
70
- .kb-span.is-retrieval .kb-span-kind {
71
- color: var(--token-accent);
72
- border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
80
+ .icen-kb-span.is-retrieval .icen-kb-span-kind {
81
+ color: var(--icen-token-accent-text); /* 11px 微字对 canvas 需 AA(裸 accent 3.76:1 不达) */
82
+ border-color: color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
73
83
  }
74
84
 
75
- .kb-span-name {
76
- min-width: 0;
85
+ .icen-kb-span-name {
86
+ min-inline-size: 0;
77
87
  overflow: hidden;
78
88
  text-overflow: ellipsis;
79
89
  white-space: nowrap;
80
- color: var(--token-text);
81
- font-size: 12.5px;
90
+ color: var(--icen-token-text);
91
+ font-size: var(--icen-font-size-control);
82
92
  }
83
- .kb-span.is-cancel { opacity: 0.6; }
93
+ .icen-kb-span.is-cancel { opacity: 0.6; }
84
94
 
85
95
  /* 耗时条:宽度 = elapsedMs / 同级最大(行内 style);error 红 / running 脉冲 */
86
- .kb-span-bar {
96
+ .icen-kb-span-bar {
87
97
  justify-self: start;
88
98
  width: 0%;
89
99
  height: 4px;
90
- border-radius: 2px;
91
- background: var(--token-line);
92
- transition: width 0.16s ease-out;
100
+ border-radius: 2px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
101
+ background: var(--icen-token-line);
102
+ transition: width var(--icen-tx-fast);
93
103
  }
94
- .kb-span.is-error .kb-span-bar { background: var(--token-danger, var(--token-error)); }
95
- .kb-span.is-running .kb-span-bar {
96
- background: var(--token-accent);
104
+ .icen-kb-span.is-error .icen-kb-span-bar { background: var(--icen-token-error); }
105
+ .icen-kb-span.is-running .icen-kb-span-bar {
106
+ background: var(--icen-token-accent);
97
107
  animation: kb-ops-pulse 1.6s ease-in-out infinite;
98
108
  }
99
- .kb-span > .kb-num { justify-self: end; }
109
+ .icen-kb-span > .icen-kb-num { justify-self: end; }
100
110
 
101
111
  @keyframes kb-ops-pulse {
102
112
  0%, 100% { opacity: 1; }
103
113
  50% { opacity: 0.35; }
104
114
  }
105
115
 
106
- /* 展开体(.kb-fold-body 语义同构):缩进 depth+1、左侧 2px 证据线由 border 承担 */
107
- .kb-trace-body {
116
+ /* 展开体(.kb-fold-body 语义同构):缩进 depth+1、起始缘 2px 证据线由 border 承担(RTL 镜像) */
117
+ .icen-kb-trace-body {
108
118
  display: flex;
109
119
  flex-direction: column;
110
120
  gap: 6px;
111
- margin: 0 8px 2px calc(16px + (var(--depth, 0) + 1) * 16px);
121
+ margin-block: 0 2px;
122
+ margin-inline-start: calc(16px + (var(--depth, 0) + 1) * 16px);
123
+ margin-inline-end: 8px;
112
124
  padding: 6px 10px;
113
- border-left: 2px solid var(--token-line-soft);
114
- font-size: 12px;
115
- color: var(--token-text-muted);
125
+ border-inline-start: 2px solid var(--icen-token-line-soft);
126
+ font-size: var(--icen-font-size-caption);
127
+ line-height: 1.6;
128
+ color: var(--icen-token-text-muted);
116
129
  }
117
- .kb-trace-detail { white-space: pre-wrap; word-break: break-word; line-height: 1.6; }
118
- .kb-trace-usage { display: flex; flex-wrap: wrap; gap: 4px 12px; }
119
- .kb-trace-error { color: var(--token-danger, var(--token-error)); font-size: 12px; word-break: break-word; }
130
+ .icen-kb-trace-detail { white-space: pre-wrap; word-break: break-word; line-height: 1.6; }
131
+ .icen-kb-trace-usage { display: flex; flex-wrap: wrap; gap: 4px 12px; }
132
+ .icen-kb-trace-error { color: var(--icen-token-error); font-size: var(--icen-font-size-caption); word-break: break-word; }
120
133
 
121
- /* retrieval span 内嵌迷你命中列表(rank + title + .kb-score 序数条) */
122
- .kb-trace-hits { display: flex; flex-direction: column; gap: 2px; }
123
- .kb-trace-hit {
134
+ /* retrieval span 内嵌迷你命中列表(rank + title + .icen-kb-score 序数条) */
135
+ .icen-kb-trace-hits { display: flex; flex-direction: column; gap: 2px; }
136
+ .icen-kb-trace-hit {
124
137
  display: grid;
125
138
  grid-template-columns: 18px minmax(0, 1fr) minmax(88px, 140px);
126
139
  align-items: center;
127
140
  gap: 8px;
128
- min-height: 22px;
141
+ min-height: 24px;
129
142
  }
130
- .kb-trace-hit-rank { text-align: right; color: var(--token-text-faint); }
131
- .kb-trace-hit-title {
132
- font-size: 12px;
133
- color: var(--token-text-muted);
143
+ .icen-kb-trace-hit-rank { text-align: right; /* guard:allow-physical rank 是数字(LTR 文种),物理右对齐惯例,RTL 不镜像 */ color: var(--icen-token-text-faint); }
144
+ .icen-kb-trace-hit-title {
145
+ font-size: var(--icen-font-size-caption);
146
+ color: var(--icen-token-text-muted);
134
147
  overflow: hidden;
135
148
  text-overflow: ellipsis;
136
149
  white-space: nowrap;
137
150
  }
151
+ /* 分数条固定轨道(分数条纪律,与 kb-search.css 同规):bar 定宽 64px、不参与 flex 伸缩,
152
+ i 定量不缩——跨行条长与百分比严格成比例,禁止轨道随容器/数值文本伸缩 */
153
+ .icen-kb-trace-hit .icen-kb-score-bar {
154
+ display: block;
155
+ flex: 0 0 64px;
156
+ width: 64px;
157
+ min-width: 0;
158
+ }
159
+ .icen-kb-trace-hit .icen-kb-score-bar > i { display: block; flex: 0 0 auto; }
138
160
 
139
161
  /* ═══════════════ kb-review:标注队列 ═══════════════ */
140
162
 
141
- .kb-review {
163
+ .icen-kb-review {
142
164
  display: grid;
143
165
  grid-template-columns: 300px minmax(0, 1fr);
144
- gap: 16px;
166
+ gap: 12px;
145
167
  align-items: start;
146
168
  }
147
169
 
148
- /* 左:队列列表 */
149
- .kb-review-queue { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
150
- .kb-review-filter { display: flex; align-items: center; gap: 8px; font-size: 11.5px; color: var(--token-text-faint); }
151
- .kb-review-filter-select,
152
- .kb-review-assign {
153
- font: inherit;
154
- font-size: 12px;
155
- color: var(--token-text);
156
- background: var(--token-bg-soft);
157
- border: 1px solid var(--token-line-soft);
158
- border-radius: var(--radius-sm, 6px);
159
- padding: 2px 6px;
160
- max-width: 180px;
161
- }
162
- .kb-review-list { display: flex; flex-direction: column; gap: 2px; max-height: 420px; overflow-y: auto; }
170
+ /* 队列列表(起始缘列,RTL 镜像) */
171
+ .icen-kb-review-queue { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
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); }
173
+ /* 弹层选择器(icen-select)域钩子:面样式随 select.css,此处只管布局 */
174
+ .icen-kb-review-filter-select { flex: 0 1 160px; }
175
+ .icen-kb-review-assign { flex: 0 1 180px; }
176
+ .icen-kb-review-list { display: flex; flex-direction: column; gap: 2px; max-height: 420px; overflow-y: auto; }
163
177
 
164
- .kb-review-item {
178
+ .icen-kb-review-item {
165
179
  display: grid;
166
180
  grid-template-columns: auto minmax(0, 1fr) auto auto;
167
181
  align-items: center;
168
182
  gap: 8px;
169
- min-height: 28px;
183
+ min-height: var(--icen-density-item-height);
170
184
  padding: 3px 8px;
171
185
  border: none;
172
186
  background: none;
173
- border-radius: var(--radius-sm, 6px);
187
+ border-radius: var(--icen-radius-sm);
174
188
  font: inherit;
175
- font-size: 12.5px;
176
- color: var(--token-text-muted);
189
+ font-size: var(--icen-font-size-control);
190
+ color: var(--icen-token-text-muted);
177
191
  cursor: pointer;
178
- text-align: left;
179
- }
180
- .kb-review-item:hover { background: var(--token-bg-soft); color: var(--token-text); }
181
- .kb-review-item:focus-visible { outline: 2px solid var(--token-accent); outline-offset: -2px; }
182
- .kb-review-item.is-active {
183
- background: var(--token-bg-soft);
184
- color: var(--token-text);
185
- box-shadow: inset 2px 0 0 var(--token-accent);
186
- }
187
- .kb-review-item.is-done .kb-review-item-title { color: var(--token-text-faint); }
188
- .kb-review-item-title {
192
+ text-align: start;
193
+ transition: background-color var(--icen-tx-fast), color var(--icen-tx-fast);
194
+ }
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 底色(不加左侧竖条,避免与语义色条混淆) */
199
+ .icen-kb-review-item.is-active {
200
+ background: var(--icen-token-fill-selected);
201
+ color: var(--icen-token-text);
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));
205
+ }
206
+ .icen-kb-review-item.is-done .icen-kb-review-item-title { color: var(--icen-token-text-faint); }
207
+ .icen-kb-review-item-title {
189
208
  min-width: 0;
190
209
  overflow: hidden;
191
210
  text-overflow: ellipsis;
192
211
  white-space: nowrap;
193
212
  }
194
- .kb-review-item-kind {
195
- font-size: 10.5px;
213
+ .icen-kb-review-item-kind {
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);
196
220
  line-height: 1;
197
- color: var(--token-text-faint);
198
- border: 1px solid var(--token-line-soft);
199
- border-radius: 999px;
200
- padding: 2px 6px;
221
+ color: var(--icen-token-text-faint);
222
+ border: 1px solid var(--icen-token-line-soft);
223
+ border-radius: var(--icen-radius-full);
201
224
  white-space: nowrap;
202
225
  }
203
- .kb-review-item-assignee { font-size: 11px; color: var(--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; }
204
227
 
205
- /* 右:审查卡(全键盘流挂载点) */
206
- .kb-review-card {
228
+ /* 行内末端列:审查卡(全键盘流挂载点,RTL 镜像) */
229
+ .icen-kb-review-card {
207
230
  position: relative;
208
231
  display: flex;
209
232
  flex-direction: column;
210
233
  gap: 12px;
211
234
  padding: 14px;
212
- border: 1px solid var(--token-line-soft);
213
- border-radius: var(--radius-md, 8px);
214
- background: var(--token-surface, var(--token-bg));
215
- }
216
- .kb-review-card:focus-visible { outline: 2px solid var(--token-accent); outline-offset: -2px; }
217
- .kb-review-card-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
218
- .kb-review-card-kind {
219
- font-size: 10.5px;
235
+ border: 1px solid var(--icen-token-line-soft);
236
+ border-radius: var(--icen-radius-md);
237
+ background: var(--icen-token-surface);
238
+ }
239
+ .icen-kb-review-card:focus-visible { outline: none; box-shadow: var(--icen-ring); }
240
+ .icen-kb-review-card-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
241
+ .icen-kb-review-card-kind {
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);
220
248
  line-height: 1;
221
- color: var(--token-text-faint);
222
- border: 1px solid var(--token-line-soft);
223
- border-radius: 999px;
224
- padding: 2.5px 7px;
249
+ color: var(--icen-token-text-faint);
250
+ border: 1px solid var(--icen-token-line-soft);
251
+ border-radius: var(--icen-radius-full);
225
252
  white-space: nowrap;
226
253
  }
227
- .kb-review-card-title {
254
+ .icen-kb-review-card-title {
228
255
  flex: 1 1 auto;
229
256
  min-width: 0;
230
257
  overflow: hidden;
231
258
  text-overflow: ellipsis;
232
259
  white-space: nowrap;
233
- font-size: 13px;
260
+ font-size: var(--icen-density-font-size-md);
234
261
  font-weight: 600;
235
- color: var(--token-text);
262
+ color: var(--icen-token-text);
236
263
  }
237
264
 
238
265
  /* rubric 行:categorical chips / numeric 滑杆 */
239
- .kb-review-rubrics { display: flex; flex-direction: column; gap: 10px; }
240
- .kb-review-rubric {
266
+ .icen-kb-review-rubrics { display: flex; flex-direction: column; gap: 12px; }
267
+ .icen-kb-review-rubric {
241
268
  display: flex;
242
269
  flex-direction: column;
243
270
  gap: 6px;
244
271
  padding: 8px 10px;
245
- background: var(--token-bg-soft);
246
- border-radius: var(--radius-sm, 6px);
272
+ background: var(--icen-token-bg-soft);
273
+ border-radius: var(--icen-radius-sm);
247
274
  }
248
- .kb-review-rubric-name { font-size: 12.5px; font-weight: 500; color: var(--token-text); }
249
- .kb-review-rubric-desc { font-size: 11.5px; font-weight: 400; color: var(--token-text-faint); margin-left: 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; }
250
277
 
251
- .kb-review-chips { display: flex; flex-wrap: wrap; gap: 6px; }
252
- .kb-review-chip {
278
+ .icen-kb-review-chips { display: flex; flex-wrap: wrap; gap: 6px; }
279
+ .icen-kb-review-chip {
253
280
  display: inline-flex;
254
281
  align-items: center;
282
+ justify-content: center;
255
283
  gap: 6px;
284
+ min-block-size: 24px;
285
+ padding: 0 10px;
256
286
  font: inherit;
257
- font-size: 12px;
258
- color: var(--token-text-muted);
259
- background: var(--token-bg);
260
- border: 1px solid var(--token-line-soft);
261
- border-radius: 999px;
262
- padding: 3px 10px;
287
+ font-size: var(--icen-density-font-size-xs);
288
+ line-height: 1;
289
+ color: var(--icen-token-text-muted);
290
+ background: var(--icen-token-bg);
291
+ border: 1px solid var(--icen-token-line-soft);
292
+ border-radius: var(--icen-radius-full);
263
293
  cursor: pointer;
294
+ transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast), border-color var(--icen-tx-fast);
264
295
  }
265
- .kb-review-chip:hover { border-color: var(--token-line); color: var(--token-text); }
266
- .kb-review-chip:focus-visible { outline: 2px solid var(--token-accent); outline-offset: 1px; }
267
- .kb-review-chip.is-on {
268
- color: var(--token-accent);
269
- border-color: color-mix(in srgb, var(--token-accent) 50%, transparent);
270
- background: var(--token-accent-subtle, transparent);
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); }
299
+ .icen-kb-review-chip.is-on {
300
+ color: var(--icen-token-accent-text); /* accent 叠 accent-subtle 浅色 ~3.5:1,chip 字 11px 低于 AA,用可读变体 */
301
+ border-color: color-mix(in srgb, var(--icen-token-accent) 50%, transparent);
302
+ background: var(--icen-token-accent-subtle);
271
303
  }
272
304
 
273
- .kb-review-slider-row { display: flex; align-items: center; gap: 10px; }
274
- .kb-review-slider { flex: 1 1 auto; accent-color: var(--token-accent); }
275
- .kb-review-slider-value { min-width: 34px; text-align: right; }
305
+ .icen-kb-review-slider-row { display: flex; align-items: center; gap: 10px; }
306
+ .icen-kb-review-slider { flex: 1 1 auto; accent-color: var(--icen-token-accent); }
307
+ .icen-kb-review-slider-value { min-inline-size: 34px; text-align: right; /* guard:allow-physical 数值物理右对齐惯例(数字是 LTR 文种),RTL 不镜像 */ }
276
308
 
277
309
  /* 底部:唯一的 accent 级主行动(一屏一个主行动纪律) */
278
- .kb-review-foot { display: flex; align-items: center; gap: 10px; }
279
- .kb-review-submit {
310
+ .icen-kb-review-foot { display: flex; align-items: center; gap: 10px; }
311
+ .icen-kb-review-submit {
280
312
  display: inline-flex;
281
313
  align-items: center;
314
+ justify-content: center;
282
315
  gap: 8px;
316
+ min-block-size: var(--icen-density-item-height);
317
+ padding: 0 12px;
283
318
  font: inherit;
284
- font-size: 12.5px;
285
- color: var(--token-on-accent, #fff);
286
- background: var(--token-accent);
319
+ font-size: var(--icen-font-size-control);
320
+ line-height: 1;
321
+ color: var(--icen-token-on-accent);
322
+ background: var(--icen-token-accent-strong);
287
323
  border: none;
288
- border-radius: var(--radius-sm, 6px);
289
- padding: 6px 14px;
324
+ border-radius: var(--icen-radius-sm);
290
325
  cursor: pointer;
326
+ transition: background-color var(--icen-tx-fast), box-shadow var(--icen-tx-fast);
291
327
  }
292
- .kb-review-submit:hover { background: var(--token-accent-deep, var(--token-accent)); }
293
- .kb-review-submit:focus-visible { outline: 2px solid var(--token-accent); outline-offset: 2px; }
294
- .kb-review-hint { font-size: 11.5px; color: var(--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); }
295
332
 
296
- /* 快捷键小浮层(? 切换;复用 .kb-key 键位帽) */
297
- .kb-review-keys {
333
+ /* 快捷键小浮层(? 切换;复用 .icen-kb-key 键位帽;钉在卡片行内末端上角) */
334
+ .icen-kb-review-keys {
298
335
  position: absolute;
299
336
  top: 8px;
300
- right: 8px;
337
+ inset-inline-end: 8px;
301
338
  z-index: 2;
302
339
  display: flex;
303
340
  flex-direction: column;
304
341
  gap: 6px;
305
342
  padding: 10px 12px;
306
343
  min-width: 208px;
307
- background: var(--token-surface, var(--token-bg));
308
- border: 1px solid var(--token-line-soft);
309
- border-radius: var(--radius-md, 8px);
310
- box-shadow: var(--token-shadow-elevated, none);
344
+ background: var(--icen-token-surface-raised);
345
+ border: 1px solid var(--icen-token-line-soft);
346
+ border-radius: var(--icen-radius-md);
347
+ box-shadow: var(--icen-token-shadow-elevated);
311
348
  }
312
- .kb-review-keys-row { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--token-text-muted); }
313
- .kb-review-keys-row .kb-key { flex: 0 0 auto; }
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); }
350
+ .icen-kb-review-keys-row .icen-kb-key { flex: 0 0 auto; }
314
351
 
315
352
  /* ═══════════════ kb-gap:无答案分析 ═══════════════ */
316
353
 
317
- .kb-gap { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
354
+ .icen-kb-gap { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
318
355
 
319
356
  /* 迷你趋势:纯 div/i 柱(高度行内 %;不依赖 charts) */
320
- .kb-gap-trend {
357
+ .icen-kb-gap-trend {
321
358
  display: flex;
322
359
  align-items: flex-end;
323
360
  gap: 4px;
324
361
  height: 40px;
325
362
  padding: 2px 2px 0;
326
363
  }
327
- .kb-gap-bar {
364
+ .icen-kb-gap-bar {
328
365
  flex: 1 1 0;
329
366
  min-width: 4px;
330
367
  max-width: 28px;
331
- background: var(--token-line);
332
- border-radius: 2px 2px 0 0;
368
+ background: var(--icen-token-line);
369
+ border-radius: 2px 2px 0 0; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
333
370
  align-self: flex-end;
371
+ transition: background-color var(--icen-tx-fast);
334
372
  }
335
- .kb-gap-bar:hover { background: var(--token-accent); }
373
+ .icen-kb-gap-bar:hover { background: var(--icen-token-accent); }
336
374
 
337
375
  /* 表:query(mono)| 次数 | 占比 | 零点击率 | 最近出现 | 行动钮 */
338
- .kb-gap-table { display: flex; flex-direction: column; min-width: 0; }
339
- .kb-gap-row {
376
+ .icen-kb-gap-table { display: flex; flex-direction: column; min-width: 0; }
377
+ .icen-kb-gap-row {
340
378
  display: grid;
341
379
  grid-template-columns: minmax(180px, 1fr) 56px 64px 72px 96px auto;
342
380
  align-items: center;
343
381
  gap: 10px;
344
382
  min-height: 32px;
345
- padding: 3px 8px;
346
- border-bottom: 1px solid var(--token-line-soft);
347
- }
348
- .kb-gap-row:last-child { border-bottom: none; }
349
- .kb-gap-row--head {
350
- min-height: 28px;
351
- font-size: 11px;
352
- color: var(--token-text-faint);
353
- border-bottom: 1px solid var(--token-line);
354
- }
355
- .kb-gap-query {
356
- font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
357
- font-size: 12px;
358
- color: var(--token-text);
383
+ padding: 2px 8px;
384
+ border-bottom: 1px solid var(--icen-token-line-soft);
385
+ }
386
+ .icen-kb-gap-row:last-child { border-bottom: none; }
387
+ .icen-kb-gap-row--head {
388
+ min-height: var(--icen-density-item-height);
389
+ font-size: var(--icen-density-font-size-xs);
390
+ letter-spacing: 0.3px;
391
+ color: var(--icen-token-text-faint);
392
+ border-bottom: 1px solid var(--icen-token-line);
393
+ }
394
+ .icen-kb-gap-query {
395
+ font-family: var(--icen-font-mono);
396
+ font-size: var(--icen-density-font-size-xs);
397
+ color: var(--icen-token-text);
359
398
  overflow: hidden;
360
399
  text-overflow: ellipsis;
361
400
  white-space: nowrap;
362
401
  }
363
- .kb-gap-num { text-align: right; }
364
- .kb-gap-head-zero { white-space: nowrap; }
402
+ .icen-kb-gap-num { text-align: right; /* guard:allow-physical 数字物理右对齐惯例(LTR 文种),RTL 不镜像 */ }
403
+ .icen-kb-gap-head-zero { white-space: nowrap; }
365
404
  /* 口径注释:「零点击 ≠ 失败」(小字 + title tooltip;不上告警色) */
366
- .kb-gap-note {
367
- margin-left: 6px;
368
- font-size: 10.5px;
369
- color: var(--token-text-faint);
370
- border-bottom: 1px dashed var(--token-line-soft);
405
+ .icen-kb-gap-note {
406
+ margin-inline-start: 6px;
407
+ font-size: var(--icen-density-font-size-xs);
408
+ color: var(--icen-token-text-faint);
409
+ border-bottom: 1px dashed var(--icen-token-line-soft);
371
410
  cursor: help;
372
411
  }
373
- .kb-gap-lastseen { font-size: 11.5px; color: var(--token-text-faint); text-align: right; white-space: nowrap; }
374
- .kb-gap-actions { display: inline-flex; gap: 6px; justify-self: end; }
375
- .kb-gap-action {
412
+ .icen-kb-gap-lastseen { font-size: var(--icen-font-size-caption); color: var(--icen-token-text-faint); text-align: end; white-space: nowrap; }
413
+ .icen-kb-gap-actions { display: inline-flex; gap: 6px; justify-self: end; }
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;
376
420
  font: inherit;
377
- font-size: 11.5px;
378
- color: var(--token-text-muted);
421
+ font-size: var(--icen-density-font-size-xs);
422
+ line-height: 1;
423
+ color: var(--icen-token-text-muted);
379
424
  background: none;
380
- border: 1px solid var(--token-line-soft);
381
- border-radius: var(--radius-sm, 6px);
382
- padding: 2px 8px;
425
+ border: 1px solid var(--icen-token-line-soft);
426
+ border-radius: var(--icen-radius-sm);
383
427
  cursor: pointer;
384
428
  white-space: nowrap;
429
+ transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast), border-color var(--icen-tx-fast);
385
430
  }
386
- .kb-gap-action:hover { color: var(--token-text); border-color: var(--token-line); }
387
- .kb-gap-action:focus-visible { outline: 2px solid var(--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); }
388
434
 
389
435
  /* ═══════════════ kb-eval:评估对比 ═══════════════ */
390
436
 
391
- .kb-eval { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
437
+ .icen-kb-eval { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
392
438
 
393
- .kb-eval-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 12px; color: var(--token-text-faint); }
394
- .kb-eval-run {
395
- font: inherit;
396
- font-size: 12px;
397
- color: var(--token-text);
398
- background: var(--token-bg-soft);
399
- border: 1px solid var(--token-line-soft);
400
- border-radius: var(--radius-sm, 6px);
401
- padding: 2px 8px;
402
- max-width: 220px;
403
- }
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); }
440
+ /* 弹层选择器(icen-select)域钩子:面样式随 select.css,此处只管布局 */
441
+ .icen-kb-eval-run { flex: 0 1 220px; }
404
442
 
405
443
  /* Summary 判级行(告警才上色:improvement 绿 / regression 红 / tradeoff 警示 / tie 中性) */
406
- .kb-eval-summary { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 12.5px; color: var(--token-text-muted); }
407
- .kb-eval-grade {
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); }
445
+ .icen-kb-eval-grade {
408
446
  display: inline-flex;
409
447
  align-items: center;
448
+ justify-content: center;
410
449
  gap: 6px;
411
- font-size: 11.5px;
412
- border: 1px solid var(--token-line-soft);
413
- border-radius: 999px;
414
- padding: 2.5px 9px;
415
- color: var(--token-text-faint);
450
+ min-block-size: 22px;
451
+ padding: 0 9px;
452
+ font-size: var(--icen-density-font-size-xs);
453
+ line-height: 1;
454
+ border: 1px solid var(--icen-token-line-soft);
455
+ border-radius: var(--icen-radius-full);
456
+ color: var(--icen-token-text-faint);
416
457
  }
417
- .kb-eval-grade.is-improvement {
418
- color: var(--token-success);
419
- border-color: color-mix(in srgb, var(--token-success) 45%, transparent);
420
- background: color-mix(in srgb, var(--token-success) 8%, transparent);
458
+ .icen-kb-eval-grade.is-improvement {
459
+ color: var(--icen-token-success);
460
+ border-color: color-mix(in srgb, var(--icen-token-success) 45%, transparent);
461
+ background: color-mix(in srgb, var(--icen-token-success) 8%, transparent);
421
462
  }
422
- .kb-eval-grade.is-regression {
423
- color: var(--token-danger, var(--token-error));
424
- border-color: color-mix(in srgb, var(--token-danger, var(--token-error)) 45%, transparent);
425
- background: color-mix(in srgb, var(--token-danger, var(--token-error)) 8%, transparent);
463
+ .icen-kb-eval-grade.is-regression {
464
+ color: var(--icen-token-error);
465
+ border-color: color-mix(in srgb, var(--icen-token-error) 45%, transparent);
466
+ background: color-mix(in srgb, var(--icen-token-error) 8%, transparent);
426
467
  }
427
- .kb-eval-grade.is-tradeoff {
428
- color: var(--token-warning);
429
- border-color: color-mix(in srgb, var(--token-warning) 45%, transparent);
430
- background: var(--token-warning-muted, transparent);
468
+ .icen-kb-eval-grade.is-tradeoff {
469
+ color: var(--icen-token-warning);
470
+ border-color: color-mix(in srgb, var(--icen-token-warning) 45%, transparent);
471
+ background: var(--icen-token-warning-muted);
431
472
  }
432
473
 
433
- .kb-eval-filter {
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;
434
480
  font: inherit;
435
- font-size: 11.5px;
436
- color: var(--token-text-muted);
481
+ font-size: var(--icen-density-font-size-xs);
482
+ line-height: 1;
483
+ color: var(--icen-token-text-muted);
437
484
  background: none;
438
- border: 1px solid var(--token-line-soft);
439
- border-radius: 999px;
440
- padding: 2px 10px;
485
+ border: 1px solid var(--icen-token-line-soft);
486
+ border-radius: var(--icen-radius-full);
441
487
  cursor: pointer;
442
488
  white-space: nowrap;
489
+ transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast), border-color var(--icen-tx-fast);
443
490
  }
444
- .kb-eval-filter:hover { color: var(--token-text); border-color: var(--token-line); }
445
- .kb-eval-filter:focus-visible { outline: 2px solid var(--token-accent); outline-offset: 1px; }
446
- .kb-eval-filter.is-on {
447
- color: var(--token-accent);
448
- border-color: color-mix(in srgb, var(--token-accent) 50%, transparent);
449
- background: var(--token-accent-subtle, transparent);
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); }
494
+ .icen-kb-eval-filter.is-on {
495
+ color: var(--icen-token-accent-text); /* 同 review-chip:小字走可读变体 */
496
+ border-color: color-mix(in srgb, var(--icen-token-accent) 50%, transparent);
497
+ background: var(--icen-token-accent-subtle);
450
498
  }
451
499
 
452
500
  /* 结果表:横向滚动容器 + 行内 grid 模板(列由 JS 按指标数生成) */
453
- .kb-eval-tablewrap { overflow-x: auto; }
454
- .kb-eval-table { display: flex; flex-direction: column; min-width: max-content; }
455
- .kb-eval-grid {
501
+ .icen-kb-eval-tablewrap { overflow-x: auto; }
502
+ .icen-kb-eval-table { display: flex; flex-direction: column; min-width: max-content; }
503
+ .icen-kb-eval-grid {
456
504
  display: grid;
457
505
  align-items: center;
458
506
  gap: 0;
459
507
  }
460
- .kb-eval-grid--head { border-bottom: 1px solid var(--token-line); }
461
- .kb-eval-h {
462
- font-size: 11px;
463
- color: var(--token-text-faint);
508
+ .icen-kb-eval-grid--head { border-bottom: 1px solid var(--icen-token-line); }
509
+ .icen-kb-eval-h {
510
+ font-size: var(--icen-density-font-size-xs);
511
+ letter-spacing: 0.3px;
512
+ color: var(--icen-token-text-faint);
464
513
  padding: 4px 8px;
465
514
  white-space: nowrap;
466
515
  overflow: hidden;
467
516
  text-overflow: ellipsis;
468
517
  }
469
- .kb-eval-h--group { text-align: center; border-left: 1px solid var(--token-line-soft); }
470
- .kb-eval-h--sub { text-align: right; border-left: 1px solid var(--token-line-soft); }
518
+ .icen-kb-eval-h--group { text-align: center; border-inline-start: 1px solid var(--icen-token-line-soft); }
519
+ .icen-kb-eval-h--sub { text-align: right; /* guard:allow-physical 指标子列头是数值口径(LTR 文种),物理右对齐惯例,RTL 不镜像 */ border-inline-start: 1px solid var(--icen-token-line-soft); }
471
520
 
472
- .kb-eval-rowline { border-bottom: 1px solid var(--token-line-soft); cursor: pointer; }
473
- .kb-eval-rowline:hover { background: var(--token-bg-soft); }
474
- .kb-eval-rowline:focus-visible { outline: 2px solid var(--token-accent); outline-offset: -2px; }
475
- .kb-eval-item:last-child .kb-eval-rowline { border-bottom: none; }
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); }
525
+ .icen-kb-eval-item:last-child .icen-kb-eval-rowline { border-bottom: none; }
476
526
 
477
- .kb-eval-cell {
527
+ .icen-kb-eval-cell {
478
528
  min-width: 0;
479
529
  padding: 4px 8px;
480
- font-size: 12px;
481
- color: var(--token-text-muted);
530
+ font-size: var(--icen-font-size-caption);
531
+ color: var(--icen-token-text-muted);
482
532
  overflow: hidden;
483
533
  text-overflow: ellipsis;
484
534
  white-space: nowrap;
485
535
  }
486
- .kb-eval-cell--input { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
487
- .kb-eval-key {
488
- font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
489
- font-size: 10.5px;
490
- color: var(--token-text-faint);
536
+ .icen-kb-eval-cell--input { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
537
+ .icen-kb-eval-key {
538
+ font-family: var(--icen-font-mono);
539
+ font-size: var(--icen-density-font-size-xs);
540
+ color: var(--icen-token-text-faint);
491
541
  overflow: hidden;
492
542
  text-overflow: ellipsis;
493
543
  }
494
- .kb-eval-num { text-align: right; padding: 4px 8px; }
495
- /* delta 列:宽 64 右对齐;is-up 绿 / is-down 红 */
496
- .kb-eval-delta { min-width: 64px; }
497
- .kb-eval-delta.is-up { color: var(--token-success); }
498
- .kb-eval-delta.is-down { color: var(--token-danger, var(--token-error)); }
544
+ .icen-kb-eval-num { text-align: right; /* guard:allow-physical 数值物理右对齐惯例(LTR 文种),RTL 不镜像 */ padding: 4px 8px; }
545
+ /* delta 列:宽 64 物理右对齐(数字惯例);is-up 绿 / is-down 红 */
546
+ .icen-kb-eval-delta { min-width: 64px; }
547
+ .icen-kb-eval-delta.is-up { color: var(--icen-token-success); }
548
+ .icen-kb-eval-delta.is-down { color: var(--icen-token-error); }
499
549
 
500
550
  /* 展开体:双栏对照 + 字符级 diff(A 独有红 / B 独有绿,color-mix 底色) */
501
- .kb-eval-detail {
551
+ .icen-kb-eval-detail {
502
552
  display: grid;
503
553
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
504
554
  gap: 10px;
505
555
  padding: 10px 8px;
506
- background: var(--token-bg-soft);
507
- border-radius: var(--radius-sm, 6px);
556
+ background: var(--icen-token-bg-soft);
557
+ border-radius: var(--icen-radius-sm);
508
558
  }
509
- .kb-eval-detail-col { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
510
- .kb-eval-detail-label { font-size: 11px; color: var(--token-text-faint); }
511
- .kb-eval-detail-pre {
559
+ .icen-kb-eval-detail-col { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
560
+ .icen-kb-eval-detail-label { font-size: var(--icen-density-font-size-xs); letter-spacing: 0.3px; color: var(--icen-token-text-faint); }
561
+ .icen-kb-eval-detail-pre {
512
562
  margin: 0;
513
- font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
514
- font-size: 12px;
563
+ font-family: var(--icen-font-mono);
564
+ font-size: var(--icen-font-size-caption);
515
565
  line-height: 1.6;
516
566
  white-space: pre-wrap;
517
567
  word-break: break-word;
518
- color: var(--token-text-muted);
568
+ color: var(--icen-token-text-muted);
519
569
  }
520
- .kb-eval-detail-expected { grid-column: 1 / -1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
521
- .kb-eval-diff-del {
522
- background: color-mix(in srgb, var(--token-danger, var(--token-error)) 14%, transparent);
523
- color: var(--token-danger, var(--token-error));
524
- border-radius: 2px;
570
+ .icen-kb-eval-detail-expected { grid-column: 1 / -1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
571
+ .icen-kb-eval-diff-del {
572
+ background: color-mix(in srgb, var(--icen-token-error) 14%, transparent);
573
+ color: var(--icen-token-error);
574
+ border-radius: 2px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
525
575
  }
526
- .kb-eval-diff-ins {
527
- background: color-mix(in srgb, var(--token-success) 14%, transparent);
528
- color: var(--token-success);
529
- border-radius: 2px;
576
+ .icen-kb-eval-diff-ins {
577
+ background: color-mix(in srgb, var(--icen-token-success) 14%, transparent);
578
+ color: var(--icen-token-success);
579
+ border-radius: 2px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
530
580
  }
531
581
 
532
582
  /* ═══════════════ hidden 属性优先(本文件的 display 声明不得击穿 [hidden]) ═══════════════ */
533
583
 
534
- .kb-span[hidden],
535
- .kb-trace-body[hidden],
536
- .kb-review-keys[hidden],
537
- .kb-eval-detail[hidden],
538
- .kb-eval-item[hidden],
539
- .kb-gap-row[hidden] { display: none; }
584
+ .icen-kb-span[hidden],
585
+ .icen-kb-trace-body[hidden],
586
+ .icen-kb-review-keys[hidden],
587
+ .icen-kb-eval-detail[hidden],
588
+ .icen-kb-eval-item[hidden],
589
+ .icen-kb-gap-row[hidden] { display: none; }
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; }
540
602
 
541
603
  /* ═══════════════ 动效退化(reduced-motion:瞬时) ═══════════════ */
542
604
 
543
605
  @media (prefers-reduced-motion: reduce) {
544
- .kb-span-caret,
545
- .kb-span-bar,
546
- .kb-gap-bar { transition: none; }
547
- .kb-span.is-running .kb-span-bar { animation: none; }
606
+ .icen-kb-span,
607
+ .icen-kb-span-caret,
608
+ .icen-kb-span-bar,
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; }
616
+ .icen-kb-span.is-running .icen-kb-span-bar { animation: none; }
617
+ }
618
+
619
+ /* ── RTL:方向性指示镜像 ── */
620
+ /* trace 树 caret:共享 chevron mask 经 scaleX(-1) 翻转向左 */
621
+ :is([dir='rtl']) .icen-kb-span-caret { transform: scaleX(-1); }
622
+ :is([dir='rtl']) .icen-kb-span[aria-expanded='true'] .icen-kb-span-caret { transform: rotate(90deg) scaleX(-1); }
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
+ }
667
+
548
668
  }