@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,14 +1,15 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — kb-ground.css(证据域:kb-citation / kb-sources / kb-passage / kb-conflict)
3
- * 共享原语在 kb.css(.kb-row/.kb-quote/.kb-badge/.kb-num…),本文件只做本域专属结构。
4
+ * 共享原语在 kb.css(.icen-kb-row/.icen-kb-quote/.icen-kb-badge/.icen-kb-num…),本文件只做本域专属结构。
4
5
  * DOM 契约见 docs/spec/kb-family.md §5.1–5.4;behaviors/kb-citation.ts 等。
5
6
  *
6
7
  * 视觉音调(spec §2 硬约束):
7
- * - 字号:标题 13px/600 · 正文 13px · 元信息 11.5px · 徽标 10.5px;数字一律 .kb-num
8
- * - 节奏:行 28px(data-density="compact" 收 24px)· 区块 16px · 组内 8px
9
- * - 圆角:容器 --radius-md · 行内(角标/chip)--radius-sm 或全圆
8
+ * - 字号:标题 13px/600 · 正文 13px · 元信息 11.5px · 徽标 10.5px;数字一律 .icen-kb-num
9
+ * - 节奏:行 28px(data-icen-density="compact" 收 24px)· 区块 16px · 组内 8px
10
+ * - 圆角:容器 --icen-radius-md · 行内(角标/chip)--icen-radius-sm 或全圆
10
11
  * - 色彩:证据域主角是 accent,但角标默认 faint 弱化、hover/激活才点亮;
11
- * 阴影只用 --token-shadow-overlay(不自造阴影层),z 尺只借 --z-* 标尺
12
+ * 阴影只用 --icen-token-shadow-overlay(不自造阴影层),z 尺只借 --icen-z-* 标尺
12
13
  * - 动效:滑入 200ms / hover 反馈 --icen-tx-fast / 折叠 160ms;reduced-motion 全退化为瞬时
13
14
  */
14
15
 
@@ -16,7 +17,7 @@
16
17
  §5.1 kb-citation 行内引用角标
17
18
  ══════════════════════════════════════════════ */
18
19
 
19
- .kb-citation {
20
+ .icen-kb-citation {
20
21
  display: inline-flex;
21
22
  align-items: center;
22
23
  justify-content: center;
@@ -24,11 +25,11 @@
24
25
  height: 16px;
25
26
  margin: 0 1px;
26
27
  padding: 0 3px;
27
- border: 1px solid var(--token-line-soft);
28
- border-radius: var(--radius-sm, 6px);
28
+ border: 1px solid var(--icen-token-line-soft);
29
+ border-radius: var(--icen-radius-sm);
29
30
  background: transparent;
30
- color: var(--token-text-faint);
31
- font-family: var(--font-mono, ui-monospace, monospace);
31
+ color: var(--icen-token-text-faint);
32
+ font-family: var(--icen-font-mono);
32
33
  font-variant-numeric: tabular-nums;
33
34
  font-size: 10px;
34
35
  line-height: 1;
@@ -38,17 +39,17 @@
38
39
  background-color var(--icen-tx-fast);
39
40
  }
40
41
  /* hover 点亮 accent:引用是证据域主角,但默认弱化、悬停才给注意力 */
41
- .kb-citation:hover {
42
- color: var(--token-accent);
43
- border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
44
- background: color-mix(in srgb, var(--token-accent) 8%, transparent);
42
+ .icen-kb-citation:hover {
43
+ color: var(--icen-token-accent);
44
+ border-color: color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
45
+ background: color-mix(in srgb, var(--icen-token-accent) 8%, transparent);
45
46
  }
46
- .kb-citation:focus-visible {
47
+ .icen-kb-citation:focus-visible {
47
48
  outline: none;
48
49
  box-shadow: var(--icen-ring);
49
50
  }
50
51
  /* 无效编号:灰显不可点(不信任模型生成编号的降级态) */
51
- .kb-citation.is-dead {
52
+ .icen-kb-citation.is-dead {
52
53
  pointer-events: none;
53
54
  cursor: default;
54
55
  opacity: 0.5;
@@ -58,63 +59,63 @@
58
59
 
59
60
  /* ── hover 引用卡(openPopover portal 挂 body;left/top/width 由 popover 布局引擎内联) ── */
60
61
 
61
- .kb-citation-card {
62
+ .icen-kb-citation-card {
62
63
  position: fixed;
63
- z-index: var(--z-popover);
64
+ z-index: var(--icen-z-popover);
64
65
  display: flex;
65
66
  flex-direction: column;
66
67
  gap: 8px;
67
68
  max-width: 340px;
68
69
  padding: 10px 12px;
69
- background: var(--token-surface);
70
- border: 1px solid var(--token-line-soft);
71
- border-radius: var(--radius-md);
72
- box-shadow: var(--token-shadow-overlay);
70
+ background: var(--icen-token-surface);
71
+ border: 1px solid var(--icen-token-line-soft);
72
+ border-radius: var(--icen-radius-md);
73
+ box-shadow: var(--icen-token-shadow-overlay);
73
74
  animation: kb-ground-card-in var(--icen-tx-fast);
74
75
  }
75
76
  @keyframes kb-ground-card-in {
76
77
  from { opacity: 0; transform: translateY(2px); }
77
78
  to { opacity: 1; transform: none; }
78
79
  }
79
- .kb-citation-card-head {
80
+ .icen-kb-citation-card-head {
80
81
  display: flex;
81
82
  align-items: center;
82
83
  gap: 6px;
83
84
  min-width: 0;
84
85
  }
85
- .kb-citation-card-icon {
86
+ .icen-kb-citation-card-icon {
86
87
  display: inline-flex;
87
88
  align-items: center;
88
89
  justify-content: center;
89
90
  flex: 0 0 auto;
90
91
  width: 14px;
91
92
  height: 14px;
92
- color: var(--token-text-muted);
93
+ color: var(--icen-token-text-muted);
93
94
  }
94
- .kb-citation-card-icon > svg { width: 14px; height: 14px; }
95
- .kb-citation-card-title {
95
+ .icen-kb-citation-card-icon > svg { width: 14px; height: 14px; }
96
+ .icen-kb-citation-card-title {
96
97
  min-width: 0;
97
98
  font-size: 13px;
98
99
  font-weight: 600;
99
- color: var(--token-text);
100
+ color: var(--icen-token-text);
100
101
  white-space: nowrap;
101
102
  overflow: hidden;
102
103
  text-overflow: ellipsis;
103
104
  }
104
- .kb-citation-card-domain {
105
- font-family: var(--font-mono, ui-monospace, monospace);
105
+ .icen-kb-citation-card-domain {
106
+ font-family: var(--icen-font-mono);
106
107
  font-size: 11px;
107
- color: var(--token-text-faint);
108
+ color: var(--icen-token-text-faint);
108
109
  white-space: nowrap;
109
110
  overflow: hidden;
110
111
  text-overflow: ellipsis;
111
112
  }
112
113
  /* 受限来源:citedText 视觉打码(原文未下发,blur 只是提示层) */
113
- .kb-citation-card-quote.kb-citation-card-masked {
114
+ .icen-kb-citation-card-quote.icen-kb-citation-card-masked {
114
115
  filter: blur(4px);
115
116
  user-select: none;
116
117
  }
117
- .kb-citation-card-badges {
118
+ .icen-kb-citation-card-badges {
118
119
  display: inline-flex;
119
120
  align-items: center;
120
121
  gap: 4px;
@@ -125,27 +126,27 @@
125
126
  §5.2 kb-sources 来源列表(--row 横排 / --rail 纵列)
126
127
  ══════════════════════════════════════════════ */
127
128
 
128
- .kb-sources {
129
+ .icen-kb-sources {
129
130
  display: flex;
130
131
  gap: 8px;
131
132
  min-width: 0;
132
133
  }
133
134
  /* 答案上方横排:内容宽、可换行 */
134
- .kb-sources--row {
135
+ .icen-kb-sources--row {
135
136
  flex-direction: row;
136
137
  flex-wrap: wrap;
137
138
  align-items: stretch;
138
139
  }
139
140
  /* 侧栏纵列:整行宽。side 收进 main(kb-sources.ts rail DOM)——标题独占两行、
140
141
  meta 行与徽章行各自换行,绝不把标题挤成一行省略号再压徽章 */
141
- .kb-sources--rail {
142
+ .icen-kb-sources--rail {
142
143
  flex-direction: column;
143
144
  }
144
- .kb-sources--rail .kb-source {
145
+ .icen-kb-sources--rail .icen-kb-source {
145
146
  grid-template-columns: auto minmax(0, 1fr);
146
147
  align-items: flex-start;
147
148
  }
148
- .kb-sources--rail .kb-source-title {
149
+ .icen-kb-sources--rail .icen-kb-source-title {
149
150
  display: -webkit-box;
150
151
  -webkit-box-orient: vertical;
151
152
  -webkit-line-clamp: 2;
@@ -153,200 +154,204 @@
153
154
  white-space: normal;
154
155
  overflow: hidden;
155
156
  }
156
- .kb-sources--rail .kb-source-sub {
157
+ .icen-kb-sources--rail .icen-kb-source-sub {
157
158
  white-space: normal;
158
159
  word-break: break-word;
159
160
  overflow: visible;
160
161
  text-overflow: unset;
161
162
  }
162
- .kb-sources--rail .kb-source-main .kb-source-side {
163
+ .icen-kb-sources--rail .icen-kb-source-main .icen-kb-source-side {
163
164
  flex-wrap: wrap;
164
165
  align-items: center;
165
166
  margin-top: 3px;
166
167
  }
167
168
 
168
- .kb-source {
169
- --kb-source-tint: var(--token-accent);
169
+ .icen-kb-source {
170
+ --kb-source-tint: var(--icen-token-accent);
170
171
  position: relative;
171
172
  display: grid;
172
173
  grid-template-columns: auto 1fr auto;
173
174
  align-items: center;
174
175
  gap: 10px;
175
176
  min-height: 28px;
176
- padding: 4px 8px 4px 10px;
177
+ padding-block: 4px;
178
+ padding-inline: 10px 8px;
177
179
  border: 1px solid transparent;
178
- border-radius: var(--radius-sm, 6px);
180
+ border-radius: var(--icen-radius-sm);
179
181
  background: transparent;
180
182
  font: inherit;
181
- text-align: left;
183
+ text-align: start;
182
184
  cursor: pointer;
183
185
  transition: background-color var(--icen-tx-fast), border-color var(--icen-tx-fast),
184
186
  transform var(--icen-tx-fast);
185
187
  }
186
- .kb-sources--row .kb-source { width: auto; }
187
- .kb-sources--rail .kb-source { width: 100%; }
188
- /* hover 浮起(1px 上移 = 轻量层级暗示,不进阴影层) */
189
- .kb-source:hover {
190
- background: var(--token-bg-soft);
191
- border-color: var(--token-line-soft);
192
- transform: translateY(-1px);
188
+ .icen-kb-sources--row .icen-kb-source { inline-size: auto; }
189
+ .icen-kb-sources--rail .icen-kb-source { inline-size: 100%; }
190
+ /* hover 浮起(1px 上移 = 轻量层级暗示,不进阴影层);仅可悬停设备生效(触屏关闭抬升) */
191
+ @media (hover: hover) and (pointer: fine) {
192
+ .icen-kb-source:hover {
193
+ background: var(--icen-token-bg-soft);
194
+ border-color: var(--icen-token-line-soft);
195
+ transform: translateY(-1px);
196
+ }
193
197
  }
194
- .kb-source:focus-visible {
198
+ .icen-kb-source:focus-visible {
195
199
  outline: none;
196
200
  box-shadow: var(--icen-ring);
197
201
  }
198
- /* 当前阅读位:左侧 2px accent 证据线(宿主或 kb-passage 锚定驱动) */
199
- .kb-source.is-active {
200
- background: var(--token-bg-soft);
202
+ /* 当前阅读位:起始缘 2px accent 证据线(宿主或 kb-passage 锚定驱动,RTL 镜像) */
203
+ .icen-kb-source.is-active {
204
+ background: var(--icen-token-bg-soft);
201
205
  border-color: color-mix(in srgb, var(--kb-source-tint) 30%, transparent);
202
206
  }
203
- .kb-source.is-active::before {
207
+ .icen-kb-source.is-active::before {
204
208
  content: '';
205
209
  position: absolute;
206
- left: 0;
210
+ inset-inline-start: 0;
207
211
  top: 5px;
208
212
  bottom: 5px;
209
213
  width: 2px;
210
- border-radius: 1px;
214
+ border-radius: 1px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
211
215
  background: var(--kb-source-tint);
212
216
  }
213
217
 
214
- .kb-source-icon {
218
+ .icen-kb-source-icon {
215
219
  display: inline-flex;
216
220
  align-items: center;
217
221
  justify-content: center;
218
222
  flex: 0 0 auto;
219
223
  width: 16px;
220
224
  height: 16px;
221
- color: var(--token-text-muted);
225
+ color: var(--icen-token-text-muted);
222
226
  }
223
- .kb-source-icon > svg { width: 14px; height: 14px; }
224
- .kb-source-main {
227
+ .icen-kb-source-icon > svg { width: 14px; height: 14px; }
228
+ .icen-kb-source-main {
225
229
  min-width: 0;
226
230
  display: flex;
227
231
  flex-direction: column;
228
232
  gap: 1px;
229
233
  }
230
- .kb-source-title {
234
+ .icen-kb-source-title {
231
235
  font-size: 13px;
232
236
  line-height: 1.4;
233
- color: var(--token-text);
237
+ color: var(--icen-token-text);
234
238
  white-space: nowrap;
235
239
  overflow: hidden;
236
240
  text-overflow: ellipsis;
237
241
  }
238
- .kb-source-sub {
242
+ .icen-kb-source-sub {
239
243
  font-size: 11.5px;
240
244
  line-height: 1.4;
241
- color: var(--token-text-faint);
245
+ color: var(--icen-token-text-faint);
242
246
  white-space: nowrap;
243
247
  overflow: hidden;
244
248
  text-overflow: ellipsis;
245
249
  }
246
- .kb-source-side {
250
+ .icen-kb-source-side {
247
251
  display: inline-flex;
248
252
  align-items: center;
249
253
  gap: 8px;
250
254
  flex: 0 0 auto;
251
255
  }
252
- .kb-source-badges {
256
+ .icen-kb-source-badges {
253
257
  display: inline-flex;
254
258
  align-items: center;
255
259
  gap: 4px;
256
260
  flex-wrap: wrap;
257
261
  }
258
- .kb-source-badges .kb-dot { width: 6px; height: 6px; }
262
+ .icen-kb-source-badges .icen-kb-dot { width: 6px; height: 6px; }
259
263
 
260
264
  /* 受限行内的申请访问按钮(行壳已降级为 role=button,嵌套合法) */
261
- .kb-source-request {
265
+ .icen-kb-source-request {
262
266
  flex: 0 0 auto;
263
267
  padding: 2.5px 7px;
264
- border: 1px solid var(--token-line-soft);
265
- border-radius: 999px;
268
+ border: 1px solid var(--icen-token-line-soft);
269
+ border-radius: var(--icen-radius-full);
266
270
  background: transparent;
267
- color: var(--token-text-muted);
271
+ color: var(--icen-token-text-muted);
268
272
  font-size: 10.5px;
269
273
  line-height: 1;
270
274
  letter-spacing: 0.3px;
271
275
  cursor: pointer;
272
276
  transition: color var(--icen-tx-fast), border-color var(--icen-tx-fast);
273
277
  }
274
- .kb-source-request:hover {
275
- color: var(--token-accent);
276
- border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
278
+ .icen-kb-source-request:hover {
279
+ color: var(--icen-token-accent);
280
+ border-color: color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
277
281
  }
278
- .kb-source-request:focus-visible {
282
+ .icen-kb-source-request:focus-visible {
279
283
  outline: none;
280
284
  box-shadow: var(--icen-ring);
281
285
  }
282
286
 
283
287
  /* 密度 compact:行高 28 → 24 */
284
- [data-density='compact'] .kb-source { min-height: 24px; gap: 8px; }
288
+ [data-icen-density='compact'] .icen-kb-source { min-height: 24px; gap: 8px; }
285
289
 
286
290
  /* ══════════════════════════════════════════════
287
- §5.3 kb-passage 原文定位抽屉(右侧 340px)
291
+ §5.3 kb-passage 原文定位抽屉(行内末端侧 340px,RTL 镜像到左侧)
288
292
  ══════════════════════════════════════════════ */
289
293
 
290
- .kb-passage {
294
+ .icen-kb-passage {
291
295
  --kb-passage-duration: 200ms;
292
296
  position: fixed;
293
- inset: 0 0 0 auto;
294
- width: min(340px, 92vw);
295
- z-index: var(--z-panel, var(--z-chrome));
297
+ inset-block: 0;
298
+ inset-inline-end: 0;
299
+ inline-size: min(340px, 92vw);
300
+ z-index: var(--icen-z-chrome);
296
301
  display: flex;
297
302
  flex-direction: column;
298
- background: var(--token-surface);
299
- border-left: 1px solid var(--token-line-soft);
300
- box-shadow: var(--token-shadow-overlay);
301
- transform: translateX(100%);
302
- transition: transform var(--kb-passage-duration) var(--ease-out);
303
- }
304
- .kb-passage[hidden] { display: none; }
305
- .kb-passage.is-open { transform: translateX(0); }
303
+ background: var(--icen-token-surface);
304
+ border-inline-start: 1px solid var(--icen-token-line-soft);
305
+ box-shadow: var(--icen-token-shadow-overlay);
306
+ transform: translateX(100%); /* guard:allow-physical 隐藏位沿物理右缘滑出(LTR 抽屉侧),RTL 镜像规则翻为 translateX(-100%) */
307
+ transition: transform var(--kb-passage-duration) var(--icen-ease-out);
308
+ }
309
+ .icen-kb-passage[hidden] { display: none; }
310
+ .icen-kb-passage.is-open { transform: translateX(0); }
306
311
 
307
- .kb-passage-head {
312
+ .icen-kb-passage-head {
308
313
  display: flex;
309
314
  align-items: center;
310
315
  gap: 8px;
311
316
  padding: 10px 12px;
312
- border-bottom: 1px solid var(--token-line-soft);
317
+ border-bottom: 1px solid var(--icen-token-line-soft);
313
318
  }
314
- .kb-passage-icon {
319
+ .icen-kb-passage-icon {
315
320
  display: inline-flex;
316
321
  align-items: center;
317
322
  justify-content: center;
318
323
  flex: 0 0 auto;
319
324
  width: 16px;
320
325
  height: 16px;
321
- color: var(--token-text-muted);
326
+ color: var(--icen-token-text-muted);
322
327
  }
323
- .kb-passage-icon > svg { width: 16px; height: 16px; }
324
- .kb-passage-titlewrap {
328
+ .icen-kb-passage-icon > svg { width: 16px; height: 16px; }
329
+ .icen-kb-passage-titlewrap {
325
330
  flex: 1 1 auto;
326
331
  min-width: 0;
327
332
  display: flex;
328
333
  flex-direction: column;
329
334
  gap: 2px;
330
335
  }
331
- .kb-passage-title {
336
+ .icen-kb-passage-title {
332
337
  font-size: 13px;
333
338
  font-weight: 600;
334
339
  line-height: 1.4;
335
- color: var(--token-text);
340
+ color: var(--icen-token-text);
336
341
  white-space: nowrap;
337
342
  overflow: hidden;
338
343
  text-overflow: ellipsis;
339
344
  }
340
- .kb-passage-loc {
341
- font-family: var(--font-mono, ui-monospace, monospace);
345
+ .icen-kb-passage-loc {
346
+ font-family: var(--icen-font-mono);
342
347
  font-size: 11px;
343
348
  letter-spacing: 0.3px;
344
- color: var(--token-text-faint);
349
+ color: var(--icen-token-text-faint);
345
350
  white-space: nowrap;
346
351
  overflow: hidden;
347
352
  text-overflow: ellipsis;
348
353
  }
349
- .kb-passage-close {
354
+ .icen-kb-passage-close {
350
355
  flex: 0 0 auto;
351
356
  width: 24px;
352
357
  height: 24px;
@@ -354,18 +359,18 @@
354
359
  align-items: center;
355
360
  justify-content: center;
356
361
  border: none;
357
- border-radius: var(--radius-sm, 6px);
362
+ border-radius: var(--icen-radius-sm);
358
363
  background: transparent;
359
- color: var(--token-text-faint);
364
+ color: var(--icen-token-text-faint);
360
365
  font-size: 14px;
361
366
  line-height: 1;
362
367
  cursor: pointer;
363
368
  transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
364
369
  }
365
- .kb-passage-close:hover { color: var(--token-text); background: var(--token-bg-soft); }
366
- .kb-passage-close:focus-visible { outline: none; box-shadow: var(--icen-ring); }
370
+ .icen-kb-passage-close:hover { color: var(--icen-token-text); background: var(--icen-token-bg-soft); }
371
+ .icen-kb-passage-close:focus-visible { outline: none; box-shadow: var(--icen-ring); }
367
372
 
368
- .kb-passage-body {
373
+ .icen-kb-passage-body {
369
374
  flex: 1 1 auto;
370
375
  min-height: 0;
371
376
  overflow-y: auto;
@@ -375,170 +380,171 @@
375
380
  padding: 12px;
376
381
  font-size: 13px;
377
382
  line-height: 1.7;
378
- color: var(--token-text);
383
+ color: var(--icen-token-text);
379
384
  }
380
- .kb-passage-text { min-width: 0; word-break: break-word; white-space: pre-wrap; }
385
+ .icen-kb-passage-text { min-inline-size: 0; word-break: break-word; white-space: pre-wrap; }
381
386
  /* 多命中分色 mark(.kb-passage-hit)与基础 mark 底色均由 kb.css 统一供给 */
382
387
 
383
- /* 上下文(默认隐藏,expand 展开;弱化为 faint 引导体) */
384
- .kb-passage-context {
388
+ /* 上下文(默认隐藏,expand 展开;弱化为 faint 引导体;引导线沿 inline-start,RTL 镜像) */
389
+ .icen-kb-passage-context {
385
390
  position: relative;
386
- padding: 2px 0 2px 12px;
391
+ padding-block: 2px;
392
+ padding-inline-start: 12px;
387
393
  font-size: 12.5px;
388
394
  line-height: 1.7;
389
- color: var(--token-text-faint);
395
+ color: var(--icen-token-text-faint);
390
396
  white-space: pre-wrap;
391
397
  word-break: break-word;
392
398
  }
393
- .kb-passage-context::before {
399
+ .icen-kb-passage-context::before {
394
400
  content: '';
395
401
  position: absolute;
396
- left: 0;
402
+ inset-inline-start: 0;
397
403
  top: 4px;
398
404
  bottom: 4px;
399
405
  width: 2px;
400
- border-radius: 1px;
401
- background: var(--token-line-soft);
406
+ border-radius: 1px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
407
+ background: var(--icen-token-line-soft);
402
408
  }
403
- .kb-passage-context[hidden] { display: none; }
404
- .kb-passage.is-expanded .kb-passage-context { animation: kb-ground-card-in var(--icen-tx-fast); }
409
+ .icen-kb-passage-context[hidden] { display: none; }
410
+ .icen-kb-passage.is-expanded .icen-kb-passage-context { animation: kb-ground-card-in var(--icen-tx-fast); }
405
411
 
406
- .kb-passage-expand {
412
+ .icen-kb-passage-expand {
407
413
  align-self: flex-start;
408
414
  padding: 2px 8px;
409
415
  border: none;
410
- border-radius: var(--radius-sm, 6px);
416
+ border-radius: var(--icen-radius-sm);
411
417
  background: transparent;
412
- color: var(--token-text-muted);
418
+ color: var(--icen-token-text-muted);
413
419
  font-size: 11.5px;
414
420
  cursor: pointer;
415
421
  transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
416
422
  }
417
- .kb-passage-expand:hover { color: var(--token-text); background: var(--token-bg-soft); }
418
- .kb-passage-expand:focus-visible { outline: none; box-shadow: var(--icen-ring); }
423
+ .icen-kb-passage-expand:hover { color: var(--icen-token-text); background: var(--icen-token-bg-soft); }
424
+ .icen-kb-passage-expand:focus-visible { outline: none; box-shadow: var(--icen-ring); }
419
425
 
420
426
  /* 受限正文:citedText 打码 + 申请访问 */
421
- .kb-passage-masked {
427
+ .icen-kb-passage-masked {
422
428
  filter: blur(4px);
423
429
  user-select: none;
424
430
  font-size: 12.5px;
425
431
  line-height: 1.7;
426
- color: var(--token-text-muted);
432
+ color: var(--icen-token-text-muted);
427
433
  white-space: pre-wrap;
428
434
  word-break: break-word;
429
435
  }
430
- .kb-passage-request {
436
+ .icen-kb-passage-request {
431
437
  display: inline-flex;
432
438
  align-items: center;
433
439
  gap: 5px;
434
440
  align-self: flex-start;
435
441
  margin-top: 4px;
436
442
  padding: 4px 10px;
437
- border: 1px solid color-mix(in srgb, var(--token-accent) 45%, transparent);
438
- border-radius: 999px;
439
- background: var(--token-accent-subtle, transparent);
440
- color: var(--token-accent);
443
+ border: 1px solid color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
444
+ border-radius: var(--icen-radius-full);
445
+ background: var(--icen-token-accent-subtle);
446
+ color: var(--icen-token-accent);
441
447
  font-size: 11.5px;
442
448
  cursor: pointer;
443
449
  transition: background-color var(--icen-tx-fast), border-color var(--icen-tx-fast);
444
450
  }
445
- .kb-passage-request > svg { width: 12px; height: 12px; }
446
- .kb-passage-request:hover {
447
- border-color: var(--token-accent);
451
+ .icen-kb-passage-request > svg { width: 12px; height: 12px; }
452
+ .icen-kb-passage-request:hover {
453
+ border-color: var(--icen-token-accent);
448
454
  }
449
- .kb-passage-request:focus-visible { outline: none; box-shadow: var(--icen-ring); }
455
+ .icen-kb-passage-request:focus-visible { outline: none; box-shadow: var(--icen-ring); }
450
456
 
451
- /* 跳转锚定宿主([data-kb-loc]):命中项 .is-current 高亮 */
452
- [data-kb-loc].is-current {
453
- background: color-mix(in srgb, var(--token-accent) 10%, transparent);
454
- box-shadow: inset 2px 0 0 var(--token-accent);
455
- border-radius: var(--radius-sm, 6px);
457
+ /* 跳转锚定宿主([data-icen-kb-loc]):命中项 .is-current 高亮 */
458
+ [data-icen-kb-loc].is-current {
459
+ background: color-mix(in srgb, var(--icen-token-accent) 10%, transparent);
460
+ box-shadow: inset 2px 0 0 var(--icen-token-accent);
461
+ border-radius: var(--icen-radius-sm);
456
462
  }
457
463
 
458
464
  /* ══════════════════════════════════════════════
459
465
  §5.4 kb-conflict 来源冲突组
460
466
  ══════════════════════════════════════════════ */
461
467
 
462
- .kb-conflict {
468
+ .icen-kb-conflict {
463
469
  display: flex;
464
470
  flex-direction: column;
465
471
  gap: 8px;
466
472
  padding: 10px 12px;
467
- border: 1px solid var(--token-line-soft);
468
- border-radius: var(--radius-md);
469
- background: var(--token-bg-soft);
473
+ border: 1px solid var(--icen-token-line-soft);
474
+ border-radius: var(--icen-radius-md);
475
+ background: var(--icen-token-bg-soft);
470
476
  }
471
- .kb-conflict + .kb-conflict { margin-top: 16px; } /* 区块间距纪律 */
472
- .kb-conflict-claim {
477
+ .icen-kb-conflict + .icen-kb-conflict { margin-top: 16px; } /* 区块间距纪律 */
478
+ .icen-kb-conflict-claim {
473
479
  display: flex;
474
480
  align-items: baseline;
475
481
  gap: 8px;
476
482
  font-size: 13px;
477
483
  font-weight: 600;
478
- color: var(--token-text);
484
+ color: var(--icen-token-text);
479
485
  }
480
- .kb-conflict-claim .kb-dot { align-self: center; }
481
- .kb-conflict-versions {
486
+ .icen-kb-conflict-claim .icen-kb-dot { align-self: center; }
487
+ .icen-kb-conflict-versions {
482
488
  display: flex;
483
489
  flex-direction: row;
484
490
  flex-wrap: wrap;
485
491
  gap: 8px;
486
492
  }
487
493
 
488
- .kb-conflict-ver {
494
+ .icen-kb-conflict-ver {
489
495
  flex: 1 1 160px;
490
- min-width: 0;
496
+ min-inline-size: 0;
491
497
  display: flex;
492
498
  flex-direction: column;
493
499
  gap: 4px;
494
500
  padding: 8px 10px;
495
- border: 1px solid var(--token-line-soft);
496
- border-radius: var(--radius-md);
497
- background: var(--token-surface);
501
+ border: 1px solid var(--icen-token-line-soft);
502
+ border-radius: var(--icen-radius-md);
503
+ background: var(--icen-token-surface);
498
504
  font: inherit;
499
- text-align: left;
505
+ text-align: start;
500
506
  cursor: pointer;
501
507
  transition: border-color var(--icen-tx-fast), background-color var(--icen-tx-fast);
502
508
  }
503
509
  /* is-current:最新/官方版本,accent 高亮(唯一主角) */
504
- .kb-conflict-ver.is-current {
505
- border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
506
- background: color-mix(in srgb, var(--token-accent) 6%, var(--token-surface));
510
+ .icen-kb-conflict-ver.is-current {
511
+ border-color: color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
512
+ background: color-mix(in srgb, var(--icen-token-accent) 6%, var(--icen-token-surface));
507
513
  }
508
514
  /* 其余版本:faded 退后 */
509
- .kb-conflict-ver.is-older { opacity: 0.62; }
510
- .kb-conflict-ver:hover {
511
- border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
515
+ .icen-kb-conflict-ver.is-older { /* 不降透明:透明会折进文字对比度;旧版语义由 muted 文案承担 */ }
516
+ .icen-kb-conflict-ver:hover {
517
+ border-color: color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
512
518
  }
513
- .kb-conflict-ver.is-older:hover { opacity: 1; }
514
- .kb-conflict-ver:focus-visible { outline: none; box-shadow: var(--icen-ring); }
519
+ .icen-kb-conflict-ver.is-older:hover { /* hover 反馈由底色承担 */ }
520
+ .icen-kb-conflict-ver:focus-visible { outline: none; box-shadow: var(--icen-ring); }
515
521
 
516
- .kb-conflict-ver-head {
522
+ .icen-kb-conflict-ver-head {
517
523
  display: flex;
518
524
  align-items: center;
519
525
  gap: 8px;
520
- min-width: 0;
526
+ min-inline-size: 0;
521
527
  }
522
- .kb-conflict-ver-date { font-size: 11px; }
523
- .kb-conflict-ver-badges {
528
+ .icen-kb-conflict-ver-date { font-size: 11px; }
529
+ .icen-kb-conflict-ver-badges {
524
530
  display: inline-flex;
525
531
  align-items: center;
526
532
  gap: 4px;
527
- margin-left: auto;
533
+ margin-inline-start: auto;
528
534
  }
529
- .kb-conflict-ver-badges .kb-dot { width: 6px; height: 6px; }
530
- .kb-conflict-ver-title {
535
+ .icen-kb-conflict-ver-badges .icen-kb-dot { width: 6px; height: 6px; }
536
+ .icen-kb-conflict-ver-title {
531
537
  font-size: 12.5px;
532
538
  line-height: 1.4;
533
- color: var(--token-text);
539
+ color: var(--icen-token-text);
534
540
  white-space: nowrap;
535
541
  overflow: hidden;
536
542
  text-overflow: ellipsis;
537
543
  }
538
- .kb-conflict-ver-sub {
544
+ .icen-kb-conflict-ver-sub {
539
545
  font-size: 11.5px;
540
546
  line-height: 1.4;
541
- color: var(--token-text-faint);
547
+ color: var(--icen-token-text-muted);
542
548
  white-space: nowrap;
543
549
  overflow: hidden;
544
550
  text-overflow: ellipsis;
@@ -549,18 +555,24 @@
549
555
  ══════════════════════════════════════════════ */
550
556
 
551
557
  @media (prefers-reduced-motion: reduce) {
552
- .kb-citation,
553
- .kb-source,
554
- .kb-source-request,
555
- .kb-passage,
556
- .kb-passage-close,
557
- .kb-passage-expand,
558
- .kb-passage-request,
559
- .kb-conflict-ver {
558
+ .icen-kb-citation,
559
+ .icen-kb-source,
560
+ .icen-kb-source-request,
561
+ .icen-kb-passage,
562
+ .icen-kb-passage-close,
563
+ .icen-kb-passage-expand,
564
+ .icen-kb-passage-request,
565
+ .icen-kb-conflict-ver {
560
566
  transition: none;
561
567
  }
562
- .kb-citation-card,
563
- .kb-passage.is-expanded .kb-passage-context {
568
+ .icen-kb-citation-card,
569
+ .icen-kb-passage.is-expanded .icen-kb-passage-context {
564
570
  animation: none;
565
571
  }
566
572
  }
573
+
574
+ /* ── RTL:kb-passage 抽屉隐藏位镜像(抽屉改贴行内末端左侧,滑出方向同步翻转) ── */
575
+ :is([dir='rtl']) .icen-kb-passage { transform: translateX(-100%); }
576
+ :is([dir='rtl']) .icen-kb-passage.is-open { transform: translateX(0); }
577
+
578
+ }