@icen.ai/ui 0.9.0 → 0.10.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 (281) hide show
  1. package/AGENTS.md +138 -80
  2. package/README.md +66 -91
  3. package/dist/base.css +208 -179
  4. package/dist/behaviors/accordion.mjs +8 -8
  5. package/dist/behaviors/ai-branch.d.mts +1 -1
  6. package/dist/behaviors/ai-branch.mjs +1010 -94
  7. package/dist/behaviors/ai-chat.d.mts +7 -7
  8. package/dist/behaviors/ai-chat.mjs +1071 -161
  9. package/dist/behaviors/ai-composer.d.mts +44 -12
  10. package/dist/behaviors/ai-composer.mjs +1997 -524
  11. package/dist/behaviors/ai-core.d.mts +1 -1
  12. package/dist/behaviors/ai-core.mjs +1016 -107
  13. package/dist/behaviors/ai-diff.mjs +1019 -127
  14. package/dist/behaviors/ai-feedback.d.mts +1 -1
  15. package/dist/behaviors/ai-feedback.mjs +1035 -126
  16. package/dist/behaviors/ai-panel.d.mts +8 -8
  17. package/dist/behaviors/ai-panel.mjs +1284 -266
  18. package/dist/behaviors/ai-provider.mjs +1003 -101
  19. package/dist/behaviors/ai-threads.d.mts +1 -1
  20. package/dist/behaviors/ai-threads.mjs +1068 -154
  21. package/dist/behaviors/ai-tool.d.mts +2 -2
  22. package/dist/behaviors/ai-tool.mjs +2037 -396
  23. package/dist/behaviors/ai-tools.d.mts +89 -16
  24. package/dist/behaviors/ai-tools.mjs +4448 -372
  25. package/dist/behaviors/autocomplete.d.mts +53 -0
  26. package/dist/behaviors/autocomplete.mjs +1600 -0
  27. package/dist/behaviors/back-top.d.mts +1 -1
  28. package/dist/behaviors/back-top.mjs +951 -14
  29. package/dist/behaviors/carousel.d.mts +1 -1
  30. package/dist/behaviors/carousel.mjs +906 -11
  31. package/dist/behaviors/cascader.d.mts +48 -0
  32. package/dist/behaviors/cascader.mjs +1853 -0
  33. package/dist/behaviors/charts.d.mts +72 -8
  34. package/dist/behaviors/charts.mjs +1901 -256
  35. package/dist/behaviors/code-block.d.mts +36 -0
  36. package/dist/behaviors/code-block.mjs +1611 -0
  37. package/dist/behaviors/command-palette.d.mts +9 -6
  38. package/dist/behaviors/command-palette.mjs +161 -59
  39. package/dist/behaviors/context-menu.d.mts +9 -8
  40. package/dist/behaviors/context-menu.mjs +1112 -44
  41. package/dist/behaviors/controls.d.mts +13 -13
  42. package/dist/behaviors/controls.mjs +989 -130
  43. package/dist/behaviors/copy.d.mts +21 -2
  44. package/dist/behaviors/copy.mjs +1206 -42
  45. package/dist/behaviors/datatable.d.mts +53 -3
  46. package/dist/behaviors/datatable.mjs +1963 -207
  47. package/dist/behaviors/date-picker.d.mts +0 -1
  48. package/dist/behaviors/date-picker.mjs +1340 -293
  49. package/dist/behaviors/design.d.mts +54 -0
  50. package/dist/behaviors/design.mjs +109 -0
  51. package/dist/behaviors/dropdown.d.mts +5 -6
  52. package/dist/behaviors/dropdown.mjs +262 -110
  53. package/dist/behaviors/events.d.mts +120 -3
  54. package/dist/behaviors/events.mjs +47 -2
  55. package/dist/behaviors/feedback.d.mts +30 -0
  56. package/dist/behaviors/feedback.mjs +296 -0
  57. package/dist/behaviors/focus.d.mts +8 -0
  58. package/dist/behaviors/focus.mjs +24 -0
  59. package/dist/behaviors/form-validate.d.mts +102 -0
  60. package/dist/behaviors/form-validate.mjs +6091 -0
  61. package/dist/behaviors/i18n.d.mts +789 -0
  62. package/dist/behaviors/i18n.mjs +1711 -0
  63. package/dist/behaviors/icons.d.mts +93 -0
  64. package/dist/behaviors/icons.mjs +113 -0
  65. package/dist/behaviors/input.d.mts +9 -1
  66. package/dist/behaviors/input.mjs +1056 -60
  67. package/dist/behaviors/kb-access.d.mts +1 -1
  68. package/dist/behaviors/kb-access.mjs +2129 -239
  69. package/dist/behaviors/kb-acl.d.mts +6 -6
  70. package/dist/behaviors/kb-acl.mjs +1119 -179
  71. package/dist/behaviors/kb-answer.mjs +2070 -418
  72. package/dist/behaviors/kb-audit.d.mts +1 -1
  73. package/dist/behaviors/kb-audit.mjs +1076 -154
  74. package/dist/behaviors/kb-canvas.mjs +1100 -177
  75. package/dist/behaviors/kb-chain.mjs +1022 -100
  76. package/dist/behaviors/kb-checkpoint.d.mts +1 -1
  77. package/dist/behaviors/kb-checkpoint.mjs +1319 -169
  78. package/dist/behaviors/kb-chunks.mjs +1152 -213
  79. package/dist/behaviors/kb-citation.d.mts +1 -1
  80. package/dist/behaviors/kb-citation.mjs +1201 -179
  81. package/dist/behaviors/kb-clarify.mjs +1058 -130
  82. package/dist/behaviors/kb-conflict.mjs +1041 -119
  83. package/dist/behaviors/kb-connector.mjs +1104 -176
  84. package/dist/behaviors/kb-core.d.mts +6 -1
  85. package/dist/behaviors/kb-core.mjs +1077 -162
  86. package/dist/behaviors/kb-eval.mjs +1971 -144
  87. package/dist/behaviors/kb-explain.d.mts +1 -1
  88. package/dist/behaviors/kb-explain.mjs +1024 -102
  89. package/dist/behaviors/kb-filter.mjs +2008 -178
  90. package/dist/behaviors/kb-gap.d.mts +1 -1
  91. package/dist/behaviors/kb-gap.mjs +1043 -121
  92. package/dist/behaviors/kb-hittest.d.mts +1 -1
  93. package/dist/behaviors/kb-hittest.mjs +1093 -150
  94. package/dist/behaviors/kb-metadata.mjs +1052 -130
  95. package/dist/behaviors/kb-passage.d.mts +2 -2
  96. package/dist/behaviors/kb-passage.mjs +1101 -161
  97. package/dist/behaviors/kb-pipeline.d.mts +2 -2
  98. package/dist/behaviors/kb-pipeline.mjs +1082 -162
  99. package/dist/behaviors/kb-qa.mjs +1088 -160
  100. package/dist/behaviors/kb-rerank.mjs +1047 -114
  101. package/dist/behaviors/kb-retrieval.mjs +2063 -224
  102. package/dist/behaviors/kb-review.mjs +1990 -159
  103. package/dist/behaviors/kb-sandbox.d.mts +1 -1
  104. package/dist/behaviors/kb-sandbox.mjs +1026 -104
  105. package/dist/behaviors/kb-segment.mjs +1111 -179
  106. package/dist/behaviors/kb-select.d.mts +24 -0
  107. package/dist/behaviors/kb-select.mjs +1989 -0
  108. package/dist/behaviors/kb-sources.d.mts +1 -1
  109. package/dist/behaviors/kb-sources.mjs +1084 -170
  110. package/dist/behaviors/kb-sql.d.mts +1 -1
  111. package/dist/behaviors/kb-sql.mjs +1143 -226
  112. package/dist/behaviors/kb-trace.d.mts +1 -1
  113. package/dist/behaviors/kb-trace.mjs +1042 -128
  114. package/dist/behaviors/kb-visibility.mjs +1086 -158
  115. package/dist/behaviors/kb-who-can.mjs +1974 -137
  116. package/dist/behaviors/mentions.d.mts +93 -0
  117. package/dist/behaviors/mentions.mjs +2152 -0
  118. package/dist/behaviors/modal.d.mts +4 -3
  119. package/dist/behaviors/modal.mjs +1055 -33
  120. package/dist/behaviors/nav.d.mts +1 -1
  121. package/dist/behaviors/nav.mjs +6 -6
  122. package/dist/behaviors/notification.d.mts +16 -8
  123. package/dist/behaviors/notification.mjs +1615 -265
  124. package/dist/behaviors/panel.d.mts +4 -0
  125. package/dist/behaviors/panel.mjs +994 -0
  126. package/dist/behaviors/popover.d.mts +28 -5
  127. package/dist/behaviors/popover.mjs +225 -24
  128. package/dist/behaviors/select.d.mts +5 -2
  129. package/dist/behaviors/select.mjs +1410 -117
  130. package/dist/behaviors/sidebar.d.mts +1 -1
  131. package/dist/behaviors/sidebar.mjs +13 -13
  132. package/dist/behaviors/slider.d.mts +1 -1
  133. package/dist/behaviors/slider.mjs +9 -9
  134. package/dist/behaviors/split-pane.d.mts +1 -1
  135. package/dist/behaviors/split-pane.mjs +7 -7
  136. package/dist/behaviors/suggestions.d.mts +27 -0
  137. package/dist/behaviors/suggestions.mjs +1089 -0
  138. package/dist/behaviors/svg-parse.d.mts +14 -0
  139. package/dist/behaviors/svg-parse.mjs +37 -0
  140. package/dist/behaviors/tabs.d.mts +2 -2
  141. package/dist/behaviors/tabs.mjs +25 -25
  142. package/dist/behaviors/tag-input.d.mts +23 -5
  143. package/dist/behaviors/tag-input.mjs +1359 -104
  144. package/dist/behaviors/theme-switcher.d.mts +24 -0
  145. package/dist/behaviors/theme-switcher.mjs +1981 -0
  146. package/dist/behaviors/theme.d.mts +15 -8
  147. package/dist/behaviors/theme.mjs +390 -28
  148. package/dist/behaviors/toast.d.mts +24 -25
  149. package/dist/behaviors/toast.mjs +1266 -88
  150. package/dist/behaviors/tooltip.d.mts +4 -0
  151. package/dist/behaviors/tooltip.mjs +378 -0
  152. package/dist/behaviors/tree-select.d.mts +69 -0
  153. package/dist/behaviors/tree-select.mjs +1907 -0
  154. package/dist/behaviors/tree.d.mts +1 -1
  155. package/dist/behaviors/tree.mjs +15 -15
  156. package/dist/behaviors/upload.d.mts +3 -2
  157. package/dist/behaviors/upload.mjs +1076 -66
  158. package/dist/cli.mjs +5 -6
  159. package/dist/components/ai-chat.css +666 -573
  160. package/dist/components/ai-diff.css +153 -132
  161. package/dist/components/ai-panel.css +351 -343
  162. package/dist/components/ai-tool.css +393 -238
  163. package/dist/components/autocomplete.css +61 -0
  164. package/dist/components/autocomplete.mjs +3 -0
  165. package/dist/components/back-top.css +34 -31
  166. package/dist/components/badge.css +44 -41
  167. package/dist/components/breadcrumb.css +67 -46
  168. package/dist/components/btn.css +80 -74
  169. package/dist/components/card.css +117 -106
  170. package/dist/components/cascader.css +311 -0
  171. package/dist/components/cascader.mjs +3 -0
  172. package/dist/components/chart-area.css +8 -2
  173. package/dist/components/chart-bar.css +95 -33
  174. package/dist/components/chart-gauge.css +14 -11
  175. package/dist/components/chart-graph.css +20 -17
  176. package/dist/components/chart-heatmap.css +96 -90
  177. package/dist/components/chart-line.css +8 -3
  178. package/dist/components/chart-pie.css +9 -6
  179. package/dist/components/chart-radar.css +8 -5
  180. package/dist/components/chart-scatter.css +9 -6
  181. package/dist/components/chart-sparkline.css +5 -2
  182. package/dist/components/chart-stack.css +14 -11
  183. package/dist/components/charts.css +164 -73
  184. package/dist/components/code-block.css +418 -0
  185. package/dist/components/code-block.mjs +4 -0
  186. package/dist/components/command-palette.css +138 -117
  187. package/dist/components/content.css +257 -251
  188. package/dist/components/copy.css +72 -44
  189. package/dist/components/datatable.css +423 -181
  190. package/dist/components/date-picker.css +135 -104
  191. package/dist/components/empty.css +68 -65
  192. package/dist/components/feedback.css +201 -183
  193. package/dist/components/form-validate.css +120 -0
  194. package/dist/components/form-validate.mjs +3 -0
  195. package/dist/components/form.css +150 -127
  196. package/dist/components/icon.css +102 -0
  197. package/dist/components/icon.mjs +3 -0
  198. package/dist/components/input.css +159 -104
  199. package/dist/components/kb-agent.css +188 -173
  200. package/dist/components/kb-data.css +257 -253
  201. package/dist/components/kb-ground.css +197 -185
  202. package/dist/components/kb-ingest.css +334 -350
  203. package/dist/components/kb-ops.css +265 -259
  204. package/dist/components/kb-perm.css +260 -271
  205. package/dist/components/kb-search.css +317 -360
  206. package/dist/components/kb.css +120 -109
  207. package/dist/components/layout.css +85 -82
  208. package/dist/components/material-chinese.css +73 -0
  209. package/dist/components/material-soviet.css +76 -0
  210. package/dist/components/material.css +275 -0
  211. package/dist/components/media.css +220 -166
  212. package/dist/components/mentions.css +189 -0
  213. package/dist/components/mentions.mjs +3 -0
  214. package/dist/components/menu.css +113 -105
  215. package/dist/components/modal.css +107 -112
  216. package/dist/components/nav.css +118 -115
  217. package/dist/components/notification.css +238 -174
  218. package/dist/components/pagination.css +56 -53
  219. package/dist/components/panel.css +66 -63
  220. package/dist/components/panel.mjs +1 -0
  221. package/dist/components/pill.css +81 -71
  222. package/dist/components/popover.css +67 -53
  223. package/dist/components/scroll-area.css +113 -110
  224. package/dist/components/segmented.css +146 -143
  225. package/dist/components/select.css +206 -186
  226. package/dist/components/sidebar.css +137 -127
  227. package/dist/components/slider.css +117 -114
  228. package/dist/components/split-pane.css +112 -109
  229. package/dist/components/stat.css +112 -106
  230. package/dist/components/steps.css +109 -103
  231. package/dist/components/switch.css +138 -134
  232. package/dist/components/table.css +131 -107
  233. package/dist/components/tabs.css +114 -108
  234. package/dist/components/tag-input.css +48 -133
  235. package/dist/components/tag.css +81 -71
  236. package/dist/components/theme-switcher.css +105 -0
  237. package/dist/components/theme-switcher.mjs +3 -0
  238. package/dist/components/toast.css +100 -86
  239. package/dist/components/toolbar.css +45 -42
  240. package/dist/components/tooltip.css +102 -43
  241. package/dist/components/tooltip.mjs +1 -0
  242. package/dist/components/tree-select.css +416 -0
  243. package/dist/components/tree-select.mjs +3 -0
  244. package/dist/components/upload.css +135 -92
  245. package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
  246. package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
  247. package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
  248. package/dist/fonts/OFL.txt +96 -0
  249. package/dist/fonts/README.md +14 -0
  250. package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
  251. package/dist/index.d.mts +28 -14
  252. package/dist/index.mjs +20705 -9601
  253. package/dist/react.d.mts +91 -0
  254. package/dist/react.mjs +8208 -0
  255. package/dist/registry.json +130 -13
  256. package/dist/tokens/chinese.css +44 -0
  257. package/dist/tokens/colors.css +365 -1222
  258. package/dist/tokens/design.css +109 -0
  259. package/dist/tokens/dtcg.json +11198 -0
  260. package/dist/tokens/figma.variables.json +7017 -0
  261. package/dist/tokens/icon-masks.css +78 -0
  262. package/dist/tokens/pixel.css +50 -0
  263. package/dist/tokens/soviet.css +44 -0
  264. package/dist/tokens/style-profiles.css +36 -547
  265. package/dist/tokens/themes.json +308 -0
  266. package/dist/tokens/tokens-studio.json +6728 -0
  267. package/dist/tokens/typography.css +21 -18
  268. package/dist/tokens.css +1555 -1801
  269. package/dist/ui.css +11975 -9831
  270. package/dist/vue.d.mts +344 -0
  271. package/dist/vue.mjs +7781 -0
  272. package/docs/spec/ai-input-experience.md +75 -0
  273. package/docs/spec/ai-native.md +238 -147
  274. package/docs/spec/design-philosophy.md +189 -0
  275. package/docs/spec/design-primitives.md +196 -0
  276. package/docs/spec/kb-family.md +147 -115
  277. package/package.json +43 -8
  278. package/dist/retro-effects.css +0 -255
  279. package/dist/tokens/retro-effects.css +0 -255
  280. package/docs/research/2026-10-03-ai-kb-components.md +0 -392
  281. package/docs/research/2026-10-03-kb-permissions.md +0 -992
@@ -1,167 +1,172 @@
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
+ .icen-kb-span {
16
17
  display: grid;
17
18
  grid-template-columns: 14px 64px minmax(0, 1fr) minmax(48px, 128px) 56px;
18
19
  align-items: center;
19
20
  gap: 8px;
20
21
  min-height: 26px;
21
- padding: 2px 8px 2px calc(8px + var(--depth, 0) * 16px);
22
+ padding-block: 2px;
23
+ /* 深度缩进沿 inline-start(RTL 下树向左侧生长) */
24
+ padding-inline: calc(8px + var(--depth, 0) * 16px) 8px;
22
25
  border: none;
23
26
  background: none;
24
- border-radius: var(--radius-sm, 6px);
27
+ border-radius: var(--icen-radius-sm);
25
28
  font: inherit;
26
29
  font-size: 12.5px;
27
- color: var(--token-text-muted);
30
+ color: var(--icen-token-text-muted);
28
31
  cursor: pointer;
29
- text-align: left;
30
- width: 100%;
32
+ text-align: start;
33
+ inline-size: 100%;
31
34
  position: relative;
32
35
  }
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; }
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; }
35
38
 
36
- /* 子 span 行前 1px 竖线(缩进连线) */
37
- .kb-span--child::before {
39
+ /* 子 span 行前 1px 竖线(缩进连线,沿 inline-start,RTL 镜像) */
40
+ .icen-kb-span--child::before {
38
41
  content: '';
39
42
  position: absolute;
40
- left: calc(var(--depth, 1) * 16px - 4px);
43
+ inset-inline-start: calc(var(--depth, 1) * 16px - 4px);
41
44
  top: 0;
42
45
  bottom: 0;
43
46
  width: 1px;
44
- background: var(--token-line-soft);
47
+ background: var(--icen-token-line-soft);
45
48
  }
46
49
 
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;
50
+ /* caret(有子才显;hidden 占位保持列对齐):共享 chevron-right mask 指向行进方向,展开旋转 90°;RTL 经 scaleX(-1) 镜像 */
51
+ .icen-kb-span-caret {
52
+ inline-size: 12px;
53
+ block-size: 12px;
54
+ background: var(--icen-token-text-faint);
55
+ mask: var(--icen-token-icon-chevron-right) center / contain no-repeat;
54
56
  transition: transform 0.16s ease-out;
55
57
  }
56
- .kb-span[aria-expanded='true'] .kb-span-caret { transform: rotate(90deg); }
58
+ .icen-kb-span[aria-expanded='true'] .icen-kb-span-caret { transform: rotate(90deg); }
57
59
 
58
60
  /* kind 徽标:中性线框;retrieval 为 accent 线框(证据域主角) */
59
- .kb-span-kind {
61
+ .icen-kb-span-kind {
60
62
  font-size: 10.5px;
61
63
  line-height: 1;
62
64
  letter-spacing: 0.3px;
63
- color: var(--token-text-faint);
64
- border: 1px solid var(--token-line-soft);
65
- border-radius: 999px;
65
+ color: var(--icen-token-text-faint);
66
+ border: 1px solid var(--icen-token-line-soft);
67
+ border-radius: var(--icen-radius-full);
66
68
  padding: 2.5px 7px;
67
69
  white-space: nowrap;
68
70
  justify-self: start;
69
71
  }
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);
72
+ .icen-kb-span.is-retrieval .icen-kb-span-kind {
73
+ color: var(--icen-token-accent);
74
+ border-color: color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
73
75
  }
74
76
 
75
- .kb-span-name {
76
- min-width: 0;
77
+ .icen-kb-span-name {
78
+ min-inline-size: 0;
77
79
  overflow: hidden;
78
80
  text-overflow: ellipsis;
79
81
  white-space: nowrap;
80
- color: var(--token-text);
82
+ color: var(--icen-token-text);
81
83
  font-size: 12.5px;
82
84
  }
83
- .kb-span.is-cancel { opacity: 0.6; }
85
+ .icen-kb-span.is-cancel { opacity: 0.6; }
84
86
 
85
87
  /* 耗时条:宽度 = elapsedMs / 同级最大(行内 style);error 红 / running 脉冲 */
86
- .kb-span-bar {
88
+ .icen-kb-span-bar {
87
89
  justify-self: start;
88
90
  width: 0%;
89
91
  height: 4px;
90
- border-radius: 2px;
91
- background: var(--token-line);
92
+ border-radius: 2px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
93
+ background: var(--icen-token-line);
92
94
  transition: width 0.16s ease-out;
93
95
  }
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);
96
+ .icen-kb-span.is-error .icen-kb-span-bar { background: var(--icen-token-error); }
97
+ .icen-kb-span.is-running .icen-kb-span-bar {
98
+ background: var(--icen-token-accent);
97
99
  animation: kb-ops-pulse 1.6s ease-in-out infinite;
98
100
  }
99
- .kb-span > .kb-num { justify-self: end; }
101
+ .icen-kb-span > .icen-kb-num { justify-self: end; }
100
102
 
101
103
  @keyframes kb-ops-pulse {
102
104
  0%, 100% { opacity: 1; }
103
105
  50% { opacity: 0.35; }
104
106
  }
105
107
 
106
- /* 展开体(.kb-fold-body 语义同构):缩进 depth+1、左侧 2px 证据线由 border 承担 */
107
- .kb-trace-body {
108
+ /* 展开体(.kb-fold-body 语义同构):缩进 depth+1、起始缘 2px 证据线由 border 承担(RTL 镜像) */
109
+ .icen-kb-trace-body {
108
110
  display: flex;
109
111
  flex-direction: column;
110
112
  gap: 6px;
111
- margin: 0 8px 2px calc(16px + (var(--depth, 0) + 1) * 16px);
113
+ margin-block: 0 2px;
114
+ margin-inline-start: calc(16px + (var(--depth, 0) + 1) * 16px);
115
+ margin-inline-end: 8px;
112
116
  padding: 6px 10px;
113
- border-left: 2px solid var(--token-line-soft);
117
+ border-inline-start: 2px solid var(--icen-token-line-soft);
114
118
  font-size: 12px;
115
- color: var(--token-text-muted);
119
+ color: var(--icen-token-text-muted);
116
120
  }
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; }
121
+ .icen-kb-trace-detail { white-space: pre-wrap; word-break: break-word; line-height: 1.6; }
122
+ .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; }
120
124
 
121
- /* retrieval span 内嵌迷你命中列表(rank + title + .kb-score 序数条) */
122
- .kb-trace-hits { display: flex; flex-direction: column; gap: 2px; }
123
- .kb-trace-hit {
125
+ /* retrieval span 内嵌迷你命中列表(rank + title + .icen-kb-score 序数条) */
126
+ .icen-kb-trace-hits { display: flex; flex-direction: column; gap: 2px; }
127
+ .icen-kb-trace-hit {
124
128
  display: grid;
125
129
  grid-template-columns: 18px minmax(0, 1fr) minmax(88px, 140px);
126
130
  align-items: center;
127
131
  gap: 8px;
128
132
  min-height: 22px;
129
133
  }
130
- .kb-trace-hit-rank { text-align: right; color: var(--token-text-faint); }
131
- .kb-trace-hit-title {
134
+ .icen-kb-trace-hit-rank { text-align: right; /* guard:allow-physical rank 是数字(LTR 文种),物理右对齐惯例,RTL 不镜像 */ color: var(--icen-token-text-faint); }
135
+ .icen-kb-trace-hit-title {
132
136
  font-size: 12px;
133
- color: var(--token-text-muted);
137
+ color: var(--icen-token-text-muted);
134
138
  overflow: hidden;
135
139
  text-overflow: ellipsis;
136
140
  white-space: nowrap;
137
141
  }
142
+ /* 分数条固定轨道(分数条纪律,与 kb-search.css 同规):bar 定宽 64px、不参与 flex 伸缩,
143
+ i 定量不缩——跨行条长与百分比严格成比例,禁止轨道随容器/数值文本伸缩 */
144
+ .icen-kb-trace-hit .icen-kb-score-bar {
145
+ display: block;
146
+ flex: 0 0 64px;
147
+ width: 64px;
148
+ min-width: 0;
149
+ }
150
+ .icen-kb-trace-hit .icen-kb-score-bar > i { display: block; flex: 0 0 auto; }
138
151
 
139
152
  /* ═══════════════ kb-review:标注队列 ═══════════════ */
140
153
 
141
- .kb-review {
154
+ .icen-kb-review {
142
155
  display: grid;
143
156
  grid-template-columns: 300px minmax(0, 1fr);
144
157
  gap: 16px;
145
158
  align-items: start;
146
159
  }
147
160
 
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; }
161
+ /* 队列列表(起始缘列,RTL 镜像) */
162
+ .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); }
164
+ /* 弹层选择器(icen-select)域钩子:面样式随 select.css,此处只管布局 */
165
+ .icen-kb-review-filter-select { flex: 0 1 160px; }
166
+ .icen-kb-review-assign { flex: 0 1 180px; }
167
+ .icen-kb-review-list { display: flex; flex-direction: column; gap: 2px; max-height: 420px; overflow-y: auto; }
163
168
 
164
- .kb-review-item {
169
+ .icen-kb-review-item {
165
170
  display: grid;
166
171
  grid-template-columns: auto minmax(0, 1fr) auto auto;
167
172
  align-items: center;
@@ -170,61 +175,61 @@
170
175
  padding: 3px 8px;
171
176
  border: none;
172
177
  background: none;
173
- border-radius: var(--radius-sm, 6px);
178
+ border-radius: var(--icen-radius-sm);
174
179
  font: inherit;
175
180
  font-size: 12.5px;
176
- color: var(--token-text-muted);
181
+ color: var(--icen-token-text-muted);
177
182
  cursor: pointer;
178
- text-align: left;
183
+ text-align: start;
179
184
  }
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);
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; }
187
+ .icen-kb-review-item.is-active {
188
+ background: var(--icen-token-bg-soft);
189
+ color: var(--icen-token-text);
190
+ box-shadow: inset 2px 0 0 var(--icen-token-accent); /* guard:allow-physical box-shadow 无逻辑属性(inset 起始缘描边),RTL 镜像规则换 -2px */
186
191
  }
187
- .kb-review-item.is-done .kb-review-item-title { color: var(--token-text-faint); }
188
- .kb-review-item-title {
192
+ .icen-kb-review-item.is-done .icen-kb-review-item-title { color: var(--icen-token-text-faint); }
193
+ .icen-kb-review-item-title {
189
194
  min-width: 0;
190
195
  overflow: hidden;
191
196
  text-overflow: ellipsis;
192
197
  white-space: nowrap;
193
198
  }
194
- .kb-review-item-kind {
199
+ .icen-kb-review-item-kind {
195
200
  font-size: 10.5px;
196
201
  line-height: 1;
197
- color: var(--token-text-faint);
198
- border: 1px solid var(--token-line-soft);
199
- border-radius: 999px;
202
+ color: var(--icen-token-text-faint);
203
+ border: 1px solid var(--icen-token-line-soft);
204
+ border-radius: var(--icen-radius-full);
200
205
  padding: 2px 6px;
201
206
  white-space: nowrap;
202
207
  }
203
- .kb-review-item-assignee { font-size: 11px; color: var(--token-text-faint); white-space: nowrap; }
208
+ .icen-kb-review-item-assignee { font-size: 11px; color: var(--icen-token-text-faint); white-space: nowrap; }
204
209
 
205
- /* 右:审查卡(全键盘流挂载点) */
206
- .kb-review-card {
210
+ /* 行内末端列:审查卡(全键盘流挂载点,RTL 镜像) */
211
+ .icen-kb-review-card {
207
212
  position: relative;
208
213
  display: flex;
209
214
  flex-direction: column;
210
215
  gap: 12px;
211
216
  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));
217
+ border: 1px solid var(--icen-token-line-soft);
218
+ border-radius: var(--icen-radius-md);
219
+ background: var(--icen-token-surface);
215
220
  }
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 {
221
+ .icen-kb-review-card:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: -2px; }
222
+ .icen-kb-review-card-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
223
+ .icen-kb-review-card-kind {
219
224
  font-size: 10.5px;
220
225
  line-height: 1;
221
- color: var(--token-text-faint);
222
- border: 1px solid var(--token-line-soft);
223
- border-radius: 999px;
226
+ color: var(--icen-token-text-faint);
227
+ border: 1px solid var(--icen-token-line-soft);
228
+ border-radius: var(--icen-radius-full);
224
229
  padding: 2.5px 7px;
225
230
  white-space: nowrap;
226
231
  }
227
- .kb-review-card-title {
232
+ .icen-kb-review-card-title {
228
233
  flex: 1 1 auto;
229
234
  min-width: 0;
230
235
  overflow: hidden;
@@ -232,317 +237,318 @@
232
237
  white-space: nowrap;
233
238
  font-size: 13px;
234
239
  font-weight: 600;
235
- color: var(--token-text);
240
+ color: var(--icen-token-text);
236
241
  }
237
242
 
238
243
  /* rubric 行:categorical chips / numeric 滑杆 */
239
- .kb-review-rubrics { display: flex; flex-direction: column; gap: 10px; }
240
- .kb-review-rubric {
244
+ .icen-kb-review-rubrics { display: flex; flex-direction: column; gap: 10px; }
245
+ .icen-kb-review-rubric {
241
246
  display: flex;
242
247
  flex-direction: column;
243
248
  gap: 6px;
244
249
  padding: 8px 10px;
245
- background: var(--token-bg-soft);
246
- border-radius: var(--radius-sm, 6px);
250
+ background: var(--icen-token-bg-soft);
251
+ border-radius: var(--icen-radius-sm);
247
252
  }
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; }
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; }
250
255
 
251
- .kb-review-chips { display: flex; flex-wrap: wrap; gap: 6px; }
252
- .kb-review-chip {
256
+ .icen-kb-review-chips { display: flex; flex-wrap: wrap; gap: 6px; }
257
+ .icen-kb-review-chip {
253
258
  display: inline-flex;
254
259
  align-items: center;
255
260
  gap: 6px;
256
261
  font: inherit;
257
262
  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;
263
+ color: var(--icen-token-text-muted);
264
+ background: var(--icen-token-bg);
265
+ border: 1px solid var(--icen-token-line-soft);
266
+ border-radius: var(--icen-radius-full);
262
267
  padding: 3px 10px;
263
268
  cursor: pointer;
264
269
  }
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);
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; }
272
+ .icen-kb-review-chip.is-on {
273
+ color: var(--icen-token-accent);
274
+ border-color: color-mix(in srgb, var(--icen-token-accent) 50%, transparent);
275
+ background: var(--icen-token-accent-subtle);
271
276
  }
272
277
 
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; }
278
+ .icen-kb-review-slider-row { display: flex; align-items: center; gap: 10px; }
279
+ .icen-kb-review-slider { flex: 1 1 auto; accent-color: var(--icen-token-accent); }
280
+ .icen-kb-review-slider-value { min-inline-size: 34px; text-align: right; /* guard:allow-physical 数值物理右对齐惯例(数字是 LTR 文种),RTL 不镜像 */ }
276
281
 
277
282
  /* 底部:唯一的 accent 级主行动(一屏一个主行动纪律) */
278
- .kb-review-foot { display: flex; align-items: center; gap: 10px; }
279
- .kb-review-submit {
283
+ .icen-kb-review-foot { display: flex; align-items: center; gap: 10px; }
284
+ .icen-kb-review-submit {
280
285
  display: inline-flex;
281
286
  align-items: center;
282
287
  gap: 8px;
283
288
  font: inherit;
284
289
  font-size: 12.5px;
285
- color: var(--token-on-accent, #fff);
286
- background: var(--token-accent);
290
+ color: var(--icen-token-on-accent);
291
+ background: var(--icen-token-accent-strong);
287
292
  border: none;
288
- border-radius: var(--radius-sm, 6px);
293
+ border-radius: var(--icen-radius-sm);
289
294
  padding: 6px 14px;
290
295
  cursor: pointer;
291
296
  }
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); }
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); }
295
300
 
296
- /* 快捷键小浮层(? 切换;复用 .kb-key 键位帽) */
297
- .kb-review-keys {
301
+ /* 快捷键小浮层(? 切换;复用 .icen-kb-key 键位帽;钉在卡片行内末端上角) */
302
+ .icen-kb-review-keys {
298
303
  position: absolute;
299
304
  top: 8px;
300
- right: 8px;
305
+ inset-inline-end: 8px;
301
306
  z-index: 2;
302
307
  display: flex;
303
308
  flex-direction: column;
304
309
  gap: 6px;
305
310
  padding: 10px 12px;
306
311
  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);
312
+ background: var(--icen-token-surface);
313
+ border: 1px solid var(--icen-token-line-soft);
314
+ border-radius: var(--icen-radius-md);
315
+ box-shadow: var(--icen-token-shadow-elevated);
311
316
  }
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; }
317
+ .icen-kb-review-keys-row { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--icen-token-text-muted); }
318
+ .icen-kb-review-keys-row .icen-kb-key { flex: 0 0 auto; }
314
319
 
315
320
  /* ═══════════════ kb-gap:无答案分析 ═══════════════ */
316
321
 
317
- .kb-gap { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
322
+ .icen-kb-gap { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
318
323
 
319
324
  /* 迷你趋势:纯 div/i 柱(高度行内 %;不依赖 charts) */
320
- .kb-gap-trend {
325
+ .icen-kb-gap-trend {
321
326
  display: flex;
322
327
  align-items: flex-end;
323
328
  gap: 4px;
324
329
  height: 40px;
325
330
  padding: 2px 2px 0;
326
331
  }
327
- .kb-gap-bar {
332
+ .icen-kb-gap-bar {
328
333
  flex: 1 1 0;
329
334
  min-width: 4px;
330
335
  max-width: 28px;
331
- background: var(--token-line);
332
- border-radius: 2px 2px 0 0;
336
+ background: var(--icen-token-line);
337
+ border-radius: 2px 2px 0 0; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
333
338
  align-self: flex-end;
334
339
  }
335
- .kb-gap-bar:hover { background: var(--token-accent); }
340
+ .icen-kb-gap-bar:hover { background: var(--icen-token-accent); }
336
341
 
337
342
  /* 表:query(mono)| 次数 | 占比 | 零点击率 | 最近出现 | 行动钮 */
338
- .kb-gap-table { display: flex; flex-direction: column; min-width: 0; }
339
- .kb-gap-row {
343
+ .icen-kb-gap-table { display: flex; flex-direction: column; min-width: 0; }
344
+ .icen-kb-gap-row {
340
345
  display: grid;
341
346
  grid-template-columns: minmax(180px, 1fr) 56px 64px 72px 96px auto;
342
347
  align-items: center;
343
348
  gap: 10px;
344
349
  min-height: 32px;
345
350
  padding: 3px 8px;
346
- border-bottom: 1px solid var(--token-line-soft);
351
+ border-bottom: 1px solid var(--icen-token-line-soft);
347
352
  }
348
- .kb-gap-row:last-child { border-bottom: none; }
349
- .kb-gap-row--head {
353
+ .icen-kb-gap-row:last-child { border-bottom: none; }
354
+ .icen-kb-gap-row--head {
350
355
  min-height: 28px;
351
356
  font-size: 11px;
352
- color: var(--token-text-faint);
353
- border-bottom: 1px solid var(--token-line);
357
+ color: var(--icen-token-text-faint);
358
+ border-bottom: 1px solid var(--icen-token-line);
354
359
  }
355
- .kb-gap-query {
356
- font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
360
+ .icen-kb-gap-query {
361
+ font-family: var(--icen-font-mono);
357
362
  font-size: 12px;
358
- color: var(--token-text);
363
+ color: var(--icen-token-text);
359
364
  overflow: hidden;
360
365
  text-overflow: ellipsis;
361
366
  white-space: nowrap;
362
367
  }
363
- .kb-gap-num { text-align: right; }
364
- .kb-gap-head-zero { white-space: nowrap; }
368
+ .icen-kb-gap-num { text-align: right; /* guard:allow-physical 数字物理右对齐惯例(LTR 文种),RTL 不镜像 */ }
369
+ .icen-kb-gap-head-zero { white-space: nowrap; }
365
370
  /* 口径注释:「零点击 ≠ 失败」(小字 + title tooltip;不上告警色) */
366
- .kb-gap-note {
367
- margin-left: 6px;
371
+ .icen-kb-gap-note {
372
+ margin-inline-start: 6px;
368
373
  font-size: 10.5px;
369
- color: var(--token-text-faint);
370
- border-bottom: 1px dashed var(--token-line-soft);
374
+ color: var(--icen-token-text-faint);
375
+ border-bottom: 1px dashed var(--icen-token-line-soft);
371
376
  cursor: help;
372
377
  }
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 {
378
+ .icen-kb-gap-lastseen { font-size: 11.5px; color: var(--icen-token-text-faint); text-align: end; white-space: nowrap; }
379
+ .icen-kb-gap-actions { display: inline-flex; gap: 6px; justify-self: end; }
380
+ .icen-kb-gap-action {
376
381
  font: inherit;
377
382
  font-size: 11.5px;
378
- color: var(--token-text-muted);
383
+ color: var(--icen-token-text-muted);
379
384
  background: none;
380
- border: 1px solid var(--token-line-soft);
381
- border-radius: var(--radius-sm, 6px);
385
+ border: 1px solid var(--icen-token-line-soft);
386
+ border-radius: var(--icen-radius-sm);
382
387
  padding: 2px 8px;
383
388
  cursor: pointer;
384
389
  white-space: nowrap;
385
390
  }
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; }
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; }
388
393
 
389
394
  /* ═══════════════ kb-eval:评估对比 ═══════════════ */
390
395
 
391
- .kb-eval { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
396
+ .icen-kb-eval { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
392
397
 
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
- }
398
+ .icen-kb-eval-bar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 12px; color: var(--icen-token-text-faint); }
399
+ /* 弹层选择器(icen-select)域钩子:面样式随 select.css,此处只管布局 */
400
+ .icen-kb-eval-run { flex: 0 1 220px; }
404
401
 
405
402
  /* 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 {
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); }
404
+ .icen-kb-eval-grade {
408
405
  display: inline-flex;
409
406
  align-items: center;
410
407
  gap: 6px;
411
408
  font-size: 11.5px;
412
- border: 1px solid var(--token-line-soft);
413
- border-radius: 999px;
409
+ border: 1px solid var(--icen-token-line-soft);
410
+ border-radius: var(--icen-radius-full);
414
411
  padding: 2.5px 9px;
415
- color: var(--token-text-faint);
412
+ color: var(--icen-token-text-faint);
416
413
  }
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);
414
+ .icen-kb-eval-grade.is-improvement {
415
+ color: var(--icen-token-success);
416
+ border-color: color-mix(in srgb, var(--icen-token-success) 45%, transparent);
417
+ background: color-mix(in srgb, var(--icen-token-success) 8%, transparent);
421
418
  }
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);
419
+ .icen-kb-eval-grade.is-regression {
420
+ color: var(--icen-token-error);
421
+ border-color: color-mix(in srgb, var(--icen-token-error) 45%, transparent);
422
+ background: color-mix(in srgb, var(--icen-token-error) 8%, transparent);
426
423
  }
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);
424
+ .icen-kb-eval-grade.is-tradeoff {
425
+ color: var(--icen-token-warning);
426
+ border-color: color-mix(in srgb, var(--icen-token-warning) 45%, transparent);
427
+ background: var(--icen-token-warning-muted);
431
428
  }
432
429
 
433
- .kb-eval-filter {
430
+ .icen-kb-eval-filter {
434
431
  font: inherit;
435
432
  font-size: 11.5px;
436
- color: var(--token-text-muted);
433
+ color: var(--icen-token-text-muted);
437
434
  background: none;
438
- border: 1px solid var(--token-line-soft);
439
- border-radius: 999px;
435
+ border: 1px solid var(--icen-token-line-soft);
436
+ border-radius: var(--icen-radius-full);
440
437
  padding: 2px 10px;
441
438
  cursor: pointer;
442
439
  white-space: nowrap;
443
440
  }
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);
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; }
443
+ .icen-kb-eval-filter.is-on {
444
+ color: var(--icen-token-accent);
445
+ border-color: color-mix(in srgb, var(--icen-token-accent) 50%, transparent);
446
+ background: var(--icen-token-accent-subtle);
450
447
  }
451
448
 
452
449
  /* 结果表:横向滚动容器 + 行内 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 {
450
+ .icen-kb-eval-tablewrap { overflow-x: auto; }
451
+ .icen-kb-eval-table { display: flex; flex-direction: column; min-width: max-content; }
452
+ .icen-kb-eval-grid {
456
453
  display: grid;
457
454
  align-items: center;
458
455
  gap: 0;
459
456
  }
460
- .kb-eval-grid--head { border-bottom: 1px solid var(--token-line); }
461
- .kb-eval-h {
457
+ .icen-kb-eval-grid--head { border-bottom: 1px solid var(--icen-token-line); }
458
+ .icen-kb-eval-h {
462
459
  font-size: 11px;
463
- color: var(--token-text-faint);
460
+ color: var(--icen-token-text-faint);
464
461
  padding: 4px 8px;
465
462
  white-space: nowrap;
466
463
  overflow: hidden;
467
464
  text-overflow: ellipsis;
468
465
  }
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); }
466
+ .icen-kb-eval-h--group { text-align: center; border-inline-start: 1px solid var(--icen-token-line-soft); }
467
+ .icen-kb-eval-h--sub { text-align: right; /* guard:allow-physical 指标子列头是数值口径(LTR 文种),物理右对齐惯例,RTL 不镜像 */ border-inline-start: 1px solid var(--icen-token-line-soft); }
471
468
 
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; }
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; }
472
+ .icen-kb-eval-item:last-child .icen-kb-eval-rowline { border-bottom: none; }
476
473
 
477
- .kb-eval-cell {
474
+ .icen-kb-eval-cell {
478
475
  min-width: 0;
479
476
  padding: 4px 8px;
480
477
  font-size: 12px;
481
- color: var(--token-text-muted);
478
+ color: var(--icen-token-text-muted);
482
479
  overflow: hidden;
483
480
  text-overflow: ellipsis;
484
481
  white-space: nowrap;
485
482
  }
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);
483
+ .icen-kb-eval-cell--input { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
484
+ .icen-kb-eval-key {
485
+ font-family: var(--icen-font-mono);
489
486
  font-size: 10.5px;
490
- color: var(--token-text-faint);
487
+ color: var(--icen-token-text-faint);
491
488
  overflow: hidden;
492
489
  text-overflow: ellipsis;
493
490
  }
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)); }
491
+ .icen-kb-eval-num { text-align: right; /* guard:allow-physical 数值物理右对齐惯例(LTR 文种),RTL 不镜像 */ padding: 4px 8px; }
492
+ /* delta 列:宽 64 物理右对齐(数字惯例);is-up 绿 / is-down 红 */
493
+ .icen-kb-eval-delta { min-width: 64px; }
494
+ .icen-kb-eval-delta.is-up { color: var(--icen-token-success); }
495
+ .icen-kb-eval-delta.is-down { color: var(--icen-token-error); }
499
496
 
500
497
  /* 展开体:双栏对照 + 字符级 diff(A 独有红 / B 独有绿,color-mix 底色) */
501
- .kb-eval-detail {
498
+ .icen-kb-eval-detail {
502
499
  display: grid;
503
500
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
504
501
  gap: 10px;
505
502
  padding: 10px 8px;
506
- background: var(--token-bg-soft);
507
- border-radius: var(--radius-sm, 6px);
503
+ background: var(--icen-token-bg-soft);
504
+ border-radius: var(--icen-radius-sm);
508
505
  }
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 {
506
+ .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); }
508
+ .icen-kb-eval-detail-pre {
512
509
  margin: 0;
513
- font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
510
+ font-family: var(--icen-font-mono);
514
511
  font-size: 12px;
515
512
  line-height: 1.6;
516
513
  white-space: pre-wrap;
517
514
  word-break: break-word;
518
- color: var(--token-text-muted);
515
+ color: var(--icen-token-text-muted);
519
516
  }
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;
517
+ .icen-kb-eval-detail-expected { grid-column: 1 / -1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
518
+ .icen-kb-eval-diff-del {
519
+ background: color-mix(in srgb, var(--icen-token-error) 14%, transparent);
520
+ color: var(--icen-token-error);
521
+ border-radius: 2px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
525
522
  }
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;
523
+ .icen-kb-eval-diff-ins {
524
+ background: color-mix(in srgb, var(--icen-token-success) 14%, transparent);
525
+ color: var(--icen-token-success);
526
+ border-radius: 2px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
530
527
  }
531
528
 
532
529
  /* ═══════════════ hidden 属性优先(本文件的 display 声明不得击穿 [hidden]) ═══════════════ */
533
530
 
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; }
531
+ .icen-kb-span[hidden],
532
+ .icen-kb-trace-body[hidden],
533
+ .icen-kb-review-keys[hidden],
534
+ .icen-kb-eval-detail[hidden],
535
+ .icen-kb-eval-item[hidden],
536
+ .icen-kb-gap-row[hidden] { display: none; }
540
537
 
541
538
  /* ═══════════════ 动效退化(reduced-motion:瞬时) ═══════════════ */
542
539
 
543
540
  @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; }
541
+ .icen-kb-span-caret,
542
+ .icen-kb-span-bar,
543
+ .icen-kb-gap-bar { transition: none; }
544
+ .icen-kb-span.is-running .icen-kb-span-bar { animation: none; }
545
+ }
546
+
547
+ /* ── RTL:方向性指示镜像 ── */
548
+ /* trace 树 caret:共享 chevron mask 经 scaleX(-1) 翻转向左 */
549
+ :is([dir='rtl']) .icen-kb-span-caret { transform: scaleX(-1); }
550
+ :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); }
553
+
548
554
  }