@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,6 +1,7 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — kb-agent.css(工作台域:kb-canvas / kb-checkpoint / kb-sandbox / kb-chain)
3
- * 共享原语在 kb.css(.kb-num/.kb-dot/.kb-key/kb-pulse 等,全部 kb-* slug 经 EXTRA_CSS 引入);
4
+ * 共享原语在 kb.css(.icen-kb-num/.icen-kb-dot/.icen-kb-key/kb-pulse 等,全部 kb-* slug 经 EXTRA_CSS 引入);
4
5
  * 本文件只做本域专属结构。DOM 契约见 docs/spec/kb-family.md §5.23–5.26 与各 behavior 头注释。
5
6
  *
6
7
  * 域纪律(spec §2):工作台域的运动感来自动效(120–240ms ease-out),不来自颜色——
@@ -11,15 +12,15 @@
11
12
 
12
13
  /* ═══════════════ kb-canvas 双栏工作台(§5.23) ═══════════════ */
13
14
 
14
- .kb-canvas {
15
+ .icen-kb-canvas {
15
16
  --kb-canvas-ratio: 0.42; /* JS 拖拽时原位覆写(0–1,无单位) */
16
- position: relative; /* 划词工具条(.kb-canvas-selbar)的定位包含块 */
17
+ position: relative; /* 划词工具条(.icen-kb-canvas-selbar)的定位包含块 */
17
18
  display: flex;
18
19
  flex-direction: column;
19
20
  min-height: 320px;
20
21
  }
21
22
 
22
- .kb-canvas-main {
23
+ .icen-kb-canvas-main {
23
24
  display: grid;
24
25
  grid-template-columns:
25
26
  minmax(0, calc(var(--kb-canvas-ratio) * 100%))
@@ -29,8 +30,8 @@
29
30
  min-height: 0;
30
31
  }
31
32
 
32
- .kb-canvas-chat,
33
- .kb-canvas-doc {
33
+ .icen-kb-canvas-chat,
34
+ .icen-kb-canvas-doc {
34
35
  min-height: 0;
35
36
  min-width: 0;
36
37
  overflow-y: auto;
@@ -39,339 +40,342 @@
39
40
  }
40
41
 
41
42
  /* 分隔条:6px 命中区 + 中央 grip 视觉;hover/拖拽点亮 accent(唯一强调处) */
42
- .kb-canvas-divider {
43
+ .icen-kb-canvas-divider {
43
44
  position: relative;
44
45
  margin: 0;
45
46
  border: none;
46
- border-radius: 2px;
47
- background: var(--token-line-soft);
47
+ border-radius: 2px;
48
48
  /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
49
+ background: var(--icen-token-line-soft);
49
50
  cursor: col-resize;
50
51
  touch-action: none; /* 拖拽需接管触摸滚动(指针事件 preventDefault 的对偶) */
51
52
  transition: background-color 0.16s ease-out;
52
53
  }
53
- .kb-canvas-divider::after {
54
+ .icen-kb-canvas-divider::after {
54
55
  content: '';
55
56
  position: absolute;
56
- left: 50%;
57
+ left: 50%; /* guard:allow-physical 分隔条圆点居中(translate(-50%,-50%) 配套) */
57
58
  top: 50%;
58
59
  transform: translate(-50%, -50%);
59
60
  width: 2px;
60
61
  height: 18px;
61
- border-radius: 1px;
62
- background: var(--token-line);
62
+ border-radius: 1px;
63
63
  /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
64
+ background: var(--icen-token-line);
64
65
  transition: background-color 0.16s ease-out;
65
66
  }
66
- .kb-canvas-divider:hover,
67
- .kb-canvas-divider.is-active {
68
- background: color-mix(in srgb, var(--token-accent) 22%, transparent);
67
+ .icen-kb-canvas-divider:hover,
68
+ .icen-kb-canvas-divider.is-active {
69
+ background: color-mix(in srgb, var(--icen-token-accent) 22%, transparent);
69
70
  }
70
- .kb-canvas-divider:hover::after,
71
- .kb-canvas-divider.is-active::after {
72
- background: var(--token-accent);
71
+ .icen-kb-canvas-divider:hover::after,
72
+ .icen-kb-canvas-divider.is-active::after {
73
+ background: var(--icen-token-accent);
73
74
  }
74
- .kb-canvas-divider:focus-visible {
75
- outline: 2px solid var(--token-accent);
75
+ .icen-kb-canvas-divider:focus-visible {
76
+ outline: 2px solid var(--icen-token-accent);
76
77
  outline-offset: -2px;
77
78
  }
78
79
 
79
80
  /* 拖拽中:禁文本选择(防划词误触)+ 冻结两栏 hover 抖动 */
80
- .kb-canvas.is-dragging {
81
+ .icen-kb-canvas.is-dragging {
81
82
  user-select: none;
82
83
  }
83
- .kb-canvas.is-dragging .kb-canvas-chat,
84
- .kb-canvas.is-dragging .kb-canvas-doc {
84
+ .icen-kb-canvas.is-dragging .icen-kb-canvas-chat,
85
+ .icen-kb-canvas.is-dragging .icen-kb-canvas-doc {
85
86
  pointer-events: none;
86
87
  }
87
88
 
88
- /* 右栏内联 diff 间距(渲染复用 ai-diff.css 的 .ai-diff) */
89
- .kb-canvas-diff {
89
+ /* 右栏内联 diff 间距(渲染复用 ai-diff.css 的 .icen-ai-diff) */
90
+ .icen-kb-canvas-diff {
90
91
  margin-bottom: 12px;
91
92
  }
92
- .kb-canvas-diff:last-child {
93
+ .icen-kb-canvas-diff:last-child {
93
94
  margin-bottom: 0;
94
95
  }
95
96
 
96
97
  /* 底部版本时间轴:横向节点流;display:flex 会压掉 UA 的 [hidden],须显式声明 */
97
- .kb-canvas-versions {
98
+ .icen-kb-canvas-versions {
98
99
  display: flex;
99
100
  align-items: center;
100
101
  gap: 6px;
101
102
  flex: 0 0 auto;
102
103
  padding: 6px 10px;
103
- border-top: 1px solid var(--token-line-soft);
104
+ border-top: 1px solid var(--icen-token-line-soft);
104
105
  overflow-x: auto;
105
106
  }
106
- .kb-canvas-versions[hidden] {
107
+ .icen-kb-canvas-versions[hidden] {
107
108
  display: none;
108
109
  }
109
110
 
110
- .kb-canvas-ver {
111
+ .icen-kb-canvas-ver {
111
112
  display: inline-flex;
112
113
  align-items: center;
113
114
  gap: 6px;
114
115
  flex: 0 0 auto;
115
116
  padding: 2px 9px;
116
- border: 1px solid var(--token-line-soft);
117
- border-radius: 999px;
118
- background: var(--token-bg-soft);
117
+ border: 1px solid var(--icen-token-line-soft);
118
+ border-radius: var(--icen-radius-full);
119
+ background: var(--icen-token-bg-soft);
119
120
  font: inherit;
120
121
  font-size: 11.5px;
121
- color: var(--token-text-muted);
122
+ color: var(--icen-token-text-muted);
122
123
  cursor: pointer;
123
124
  transition: color 0.16s ease-out, border-color 0.16s ease-out;
124
125
  }
125
- .kb-canvas-ver:hover {
126
- color: var(--token-text);
127
- border-color: var(--token-line);
126
+ .icen-kb-canvas-ver:hover {
127
+ color: var(--icen-token-text);
128
+ border-color: var(--icen-token-line);
128
129
  }
129
- .kb-canvas-ver:focus-visible {
130
- outline: 2px solid var(--token-accent);
130
+ .icen-kb-canvas-ver:focus-visible {
131
+ outline: 2px solid var(--icen-token-accent);
131
132
  outline-offset: -2px;
132
133
  }
133
- .kb-canvas-ver-dot {
134
+ .icen-kb-canvas-ver-dot {
134
135
  width: 6px;
135
136
  height: 6px;
136
137
  border-radius: 50%;
137
138
  flex: 0 0 auto;
138
- background: var(--token-text-faint);
139
+ background: var(--icen-token-text-faint);
139
140
  transition: background-color 0.16s ease-out;
140
141
  }
141
- .kb-canvas-ver-label {
142
+ .icen-kb-canvas-ver-label {
143
+ color: var(--icen-token-text);
142
144
  max-width: 180px;
143
145
  overflow: hidden;
144
146
  text-overflow: ellipsis;
145
147
  white-space: nowrap;
146
148
  }
147
149
  /* current 高亮:点线同色 accent(语义=当前所在版本,非装饰) */
148
- .kb-canvas-ver.is-current {
149
- color: var(--token-accent);
150
- border-color: color-mix(in srgb, var(--token-accent) 45%, transparent);
150
+ .icen-kb-canvas-ver.is-current {
151
+ color: var(--icen-token-accent);
152
+ border-color: color-mix(in srgb, var(--icen-token-accent) 45%, transparent);
151
153
  }
152
- .kb-canvas-ver.is-current .kb-canvas-ver-dot {
153
- background: var(--token-accent);
154
+ .icen-kb-canvas-ver.is-current .icen-kb-canvas-ver-dot {
155
+ background: var(--icen-token-accent);
154
156
  }
155
157
 
156
- /* 划词工具条:浮层三档材质(--z-panel 缺省回落 --z-popover);1.5s 无操作由 JS 隐藏 */
157
- .kb-canvas-selbar {
158
+ /* 划词工具条:浮层三档材质;1.5s 无操作由 JS 隐藏 */
159
+ .icen-kb-canvas-selbar {
158
160
  position: absolute;
159
- z-index: var(--z-panel, var(--z-popover));
161
+ z-index: var(--icen-z-popover);
160
162
  display: flex;
161
163
  gap: 2px;
162
164
  padding: 3px;
163
- border-radius: var(--radius-md, 10px);
164
- background: color-mix(in srgb, var(--token-card-strong, var(--token-bg)) 94%, transparent);
165
- border: 1px solid var(--token-outline, var(--token-line));
166
- box-shadow: var(--token-shadow-overlay, 0 8px 24px rgba(0, 0, 0, 0.14));
167
- animation: icen-pop-in var(--icen-tx-fast, 160ms) ease-out;
165
+ border-radius: var(--icen-radius-md);
166
+ background: color-mix(in srgb, var(--icen-token-card-strong) 94%, transparent);
167
+ border: 1px solid var(--icen-token-outline);
168
+ box-shadow: var(--icen-token-shadow-overlay);
169
+ animation: icen-pop-in var(--icen-tx-fast) ease-out;
168
170
  user-select: none;
169
171
  }
170
- .kb-canvas-selbar[hidden] {
172
+ .icen-kb-canvas-selbar[hidden] {
171
173
  display: none;
172
174
  }
173
- .kb-canvas-selbar-btn {
175
+ .icen-kb-canvas-selbar-btn {
174
176
  border: none;
175
177
  background: none;
176
- border-radius: var(--radius-sm, 6px);
178
+ border-radius: var(--icen-radius-sm);
177
179
  padding: 3px 9px;
178
180
  font: inherit;
179
181
  font-size: 12px;
180
- color: var(--token-text-muted);
182
+ color: var(--icen-token-text-muted);
181
183
  cursor: pointer;
182
184
  white-space: nowrap;
183
185
  transition: color 0.16s ease-out, background-color 0.16s ease-out;
184
186
  }
185
- .kb-canvas-selbar-btn:hover {
186
- color: var(--token-text);
187
- background: var(--token-bg-soft);
187
+ .icen-kb-canvas-selbar-btn:hover {
188
+ color: var(--icen-token-text);
189
+ background: var(--icen-token-bg-soft);
188
190
  }
189
- .kb-canvas-selbar-btn:focus-visible {
190
- outline: 2px solid var(--token-accent);
191
+ .icen-kb-canvas-selbar-btn:focus-visible {
192
+ outline: 2px solid var(--icen-token-accent);
191
193
  outline-offset: -2px;
192
194
  }
193
195
 
194
196
  /* ═══════════════ kb-checkpoint 检查点(§5.24) ═══════════════ */
195
197
 
196
- .kb-checkpoints {
198
+ .icen-kb-checkpoints {
197
199
  display: flex;
198
200
  align-items: center;
199
201
  gap: 8px;
200
202
  flex-wrap: wrap;
201
203
  }
202
204
 
203
- .kb-checkpoint {
205
+ .icen-kb-checkpoint {
204
206
  display: inline-flex;
205
207
  align-items: center;
206
208
  gap: 6px;
207
209
  min-height: 28px;
208
210
  padding: 2px 10px;
209
- border: 1px solid var(--token-line-soft);
210
- border-radius: var(--radius-sm, 6px);
211
- background: var(--token-bg-soft);
211
+ border: 1px solid var(--icen-token-line-soft);
212
+ border-radius: var(--icen-radius-sm);
213
+ background: var(--icen-token-bg-soft);
212
214
  font: inherit;
213
215
  font-size: 12px;
214
- color: var(--token-text-muted);
216
+ color: var(--icen-token-text-muted);
215
217
  cursor: pointer;
216
218
  transition: color 0.16s ease-out, border-color 0.16s ease-out;
217
219
  }
218
- .kb-checkpoint:hover {
219
- color: var(--token-text);
220
- border-color: var(--token-line);
220
+ .icen-kb-checkpoint:hover {
221
+ color: var(--icen-token-text);
222
+ border-color: var(--icen-token-line);
221
223
  }
222
- .kb-checkpoint:focus-visible {
223
- outline: 2px solid var(--token-accent);
224
+ .icen-kb-checkpoint:focus-visible {
225
+ outline: 2px solid var(--icen-token-accent);
224
226
  outline-offset: -2px;
225
227
  }
226
- .kb-checkpoint-icon {
228
+ .icen-kb-checkpoint-icon {
227
229
  display: inline-flex;
228
- color: var(--token-text-faint);
230
+ color: var(--icen-token-text-faint);
229
231
  }
230
- .kb-checkpoint-icon svg {
232
+ .icen-kb-checkpoint-icon svg {
231
233
  width: 14px;
232
234
  height: 14px;
233
235
  }
234
- .kb-checkpoint-time {
236
+ .icen-kb-checkpoint-time {
235
237
  font-size: 11px;
236
238
  }
237
- .kb-checkpoint-label {
239
+ .icen-kb-checkpoint-label {
238
240
  max-width: 180px;
239
241
  overflow: hidden;
240
242
  text-overflow: ellipsis;
241
243
  white-space: nowrap;
242
244
  }
243
245
 
244
- /* 恢复菜单:fixed 浮层(body 挂载),160ms 进场;默认预选项带 ✓ 与审计说明 */
245
- .kb-checkpoint-menu {
246
+ /* Restore menu: shared floating material; selection uses a contained surface. */
247
+ .icen-kb-checkpoint-menu {
246
248
  position: fixed;
247
- z-index: var(--z-popover);
248
- min-width: 248px;
249
- max-width: 320px;
249
+ z-index: var(--icen-z-popover);
250
+ min-inline-size: min(248px, calc(100vw - 24px));
251
+ max-inline-size: min(320px, calc(100vw - 24px));
252
+ overflow: auto;
253
+ overscroll-behavior: contain;
250
254
  margin: 0;
251
255
  padding: 6px;
252
- background: color-mix(in srgb, var(--token-card-strong, var(--token-bg)) 94%, transparent);
253
- border: 1px solid var(--token-outline, var(--token-line));
254
- box-shadow: var(--token-shadow-overlay);
255
- border-radius: var(--radius-md, 10px);
256
- animation: icen-pop-in var(--icen-tx-fast, 160ms) ease-out;
256
+ background: color-mix(in srgb, var(--icen-token-card-strong) 94%, transparent);
257
+ border: 1px solid var(--icen-token-outline);
258
+ box-shadow: var(--icen-token-shadow-overlay);
259
+ border-radius: var(--icen-radius-md);
260
+ animation: icen-pop-in var(--icen-tx-fast) ease-out;
257
261
  }
258
- .kb-checkpoint-menu-title {
262
+ .icen-kb-checkpoint-menu-title {
259
263
  font-size: 11.5px;
260
- color: var(--token-text-faint);
264
+ color: var(--icen-token-text-faint);
261
265
  padding: 4px 8px 6px;
262
266
  }
263
- .kb-checkpoint-menu-item {
267
+ .icen-kb-checkpoint-menu-item {
264
268
  display: flex;
265
269
  align-items: flex-start;
266
270
  gap: 8px;
267
- width: 100%;
271
+ inline-size: 100%;
268
272
  padding: 6px 8px;
269
273
  border: none;
270
274
  background: none;
271
- border-radius: var(--radius-sm, 6px);
275
+ border-radius: var(--icen-radius-sm);
272
276
  font: inherit;
273
277
  font-size: 12.5px;
274
- color: var(--token-text);
275
- text-align: left;
278
+ color: var(--icen-token-text);
279
+ text-align: start;
276
280
  cursor: pointer;
277
281
  transition: background-color 0.16s ease-out;
278
282
  }
279
- .kb-checkpoint-menu-item:hover {
280
- background: var(--token-bg-soft);
283
+ .icen-kb-checkpoint-menu-item:hover {
284
+ background: var(--icen-token-bg-soft);
281
285
  }
282
- .kb-checkpoint-menu-item:focus-visible {
283
- outline: 2px solid var(--token-accent);
286
+ .icen-kb-checkpoint-menu-item:focus-visible {
287
+ outline: 2px solid var(--icen-token-accent);
284
288
  outline-offset: -2px;
285
289
  }
286
- .kb-checkpoint-menu-item.is-disabled,
287
- .kb-checkpoint-menu-item:disabled {
290
+ @media (pointer: coarse) {
291
+ .icen-kb-checkpoint-menu-item { min-block-size: 44px; }
292
+ }
293
+ .icen-kb-checkpoint-menu-item.is-disabled,
294
+ .icen-kb-checkpoint-menu-item:disabled {
288
295
  opacity: 0.45;
289
296
  cursor: not-allowed;
290
297
  }
291
- .kb-checkpoint-menu-item:disabled:hover {
298
+ .icen-kb-checkpoint-menu-item:disabled:hover {
292
299
  background: none;
293
300
  }
294
- .kb-checkpoint-menu-check {
301
+ .icen-kb-checkpoint-menu-check {
295
302
  flex: 0 0 14px;
296
303
  display: inline-flex;
297
304
  justify-content: center;
298
- color: var(--token-accent);
305
+ color: var(--icen-token-accent);
299
306
  font-size: 12px;
300
307
  line-height: 1.4;
301
308
  }
302
- .kb-checkpoint-menu-item.is-checked .kb-checkpoint-menu-check::before {
303
- content: '✓';
304
- }
305
- .kb-checkpoint-menu-main {
309
+ .icen-kb-checkpoint-menu-main {
306
310
  display: flex;
307
311
  flex-direction: column;
308
312
  gap: 2px;
309
313
  min-width: 0;
310
314
  }
311
- .kb-checkpoint-menu-note {
315
+ .icen-kb-checkpoint-menu-note {
312
316
  font-size: 11px;
313
- color: var(--token-text-faint);
317
+ color: var(--icen-token-text-faint);
314
318
  }
315
319
 
316
320
  /* ═══════════════ kb-sandbox 沙箱工具容器(§5.25) ═══════════════ */
317
321
 
318
- .kb-sandbox {
322
+ .icen-kb-sandbox {
319
323
  position: relative;
320
324
  display: block;
321
325
  }
322
326
 
323
- .kb-sandbox-stage {
327
+ .icen-kb-sandbox-stage {
324
328
  position: relative;
325
329
  aspect-ratio: 16 / 9;
326
330
  min-height: 320px;
327
- border: 1px solid var(--token-line-soft);
328
- border-radius: var(--radius-md, 10px);
331
+ border: 1px solid var(--icen-token-line-soft);
332
+ border-radius: var(--icen-radius-md);
329
333
  overflow: hidden;
330
- background: var(--token-bg);
334
+ background: var(--icen-token-bg);
331
335
  }
332
336
 
333
- .kb-sandbox-frame {
337
+ .icen-kb-sandbox-frame {
334
338
  display: block;
335
339
  width: 100%;
336
340
  height: 100%;
337
341
  border: 0;
338
342
  background: transparent;
339
343
  }
340
- .kb-sandbox[data-state='idle'] .kb-sandbox-frame {
344
+ .icen-kb-sandbox[data-icen-state='idle'] .icen-kb-sandbox-frame {
341
345
  display: none; /* 未 load 前不露空白帧 */
342
346
  }
343
347
 
344
- /* 三态由 data-state 驱动(纯 CSS 状态优先纪律);loading 走共享 icen-spin */
345
- .kb-sandbox-loading,
346
- .kb-sandbox-err {
348
+ /* 三态由 data-icen-state 驱动(纯 CSS 状态优先纪律);loading 走共享 icen-spin */
349
+ .icen-kb-sandbox-loading,
350
+ .icen-kb-sandbox-err {
347
351
  position: absolute;
348
352
  inset: 0;
349
353
  display: none;
350
354
  place-items: center;
351
355
  padding: 16px;
352
- background: var(--token-bg);
356
+ background: var(--icen-token-bg);
353
357
  }
354
- .kb-sandbox[data-state='loading'] .kb-sandbox-loading {
358
+ .icen-kb-sandbox[data-icen-state='loading'] .icen-kb-sandbox-loading {
355
359
  display: grid;
356
360
  }
357
- .kb-sandbox[data-state='error'] .kb-sandbox-err {
361
+ .icen-kb-sandbox[data-icen-state='error'] .icen-kb-sandbox-err {
358
362
  display: grid;
359
363
  }
360
- .kb-sandbox-spin {
364
+ .icen-kb-sandbox-spin {
361
365
  width: 18px;
362
366
  height: 18px;
363
367
  border-radius: 50%;
364
- border: 2px solid var(--token-line-soft);
365
- border-top-color: var(--token-accent);
368
+ border: 2px solid var(--icen-token-line-soft);
369
+ border-top-color: var(--icen-token-accent);
366
370
  animation: icen-spin 0.8s linear infinite;
367
371
  }
368
- .kb-sandbox-err {
369
- color: var(--token-danger, var(--token-error));
372
+ .icen-kb-sandbox-err {
373
+ color: var(--icen-token-error);
370
374
  font-size: 12.5px;
371
375
  text-align: center;
372
376
  }
373
377
 
374
378
  /* ═══════════════ kb-chain 工具链条(§5.26) ═══════════════ */
375
379
 
376
- .kb-chain {
380
+ .icen-kb-chain {
377
381
  display: flex;
378
382
  align-items: center;
379
383
  min-width: 0;
@@ -379,36 +383,36 @@
379
383
  overflow-x: auto;
380
384
  }
381
385
 
382
- .kb-chain-step {
386
+ .icen-kb-chain-step {
383
387
  display: inline-flex;
384
388
  align-items: center;
385
389
  gap: 6px;
386
390
  flex: 0 0 auto;
387
391
  padding: 3px 10px;
388
- border-radius: 999px;
392
+ border-radius: var(--icen-radius-full);
389
393
  font-size: 12px;
390
- color: var(--token-text-muted);
394
+ color: var(--icen-token-text-muted);
391
395
  transition: color 0.16s ease-out, background-color 0.16s ease-out;
392
396
  }
393
397
  /* 可点(running 及之前):hover 提供可点暗示,仍走中性色 */
394
- .kb-chain-step[aria-disabled='false'] {
398
+ .icen-kb-chain-step[aria-disabled='false'] {
395
399
  cursor: pointer;
396
400
  }
397
- .kb-chain-step[aria-disabled='false']:hover {
398
- color: var(--token-text);
399
- background: var(--token-bg-soft);
401
+ .icen-kb-chain-step[aria-disabled='false']:hover {
402
+ color: var(--icen-token-text);
403
+ background: var(--icen-token-bg-soft);
400
404
  }
401
- .kb-chain-step[aria-disabled='false']:focus-visible {
402
- outline: 2px solid var(--token-accent);
405
+ .icen-kb-chain-step[aria-disabled='false']:focus-visible {
406
+ outline: 2px solid var(--icen-token-accent);
403
407
  outline-offset: -2px;
404
408
  }
405
- .kb-chain-step[aria-disabled='true'] {
406
- color: var(--token-text-faint);
409
+ .icen-kb-chain-step[aria-disabled='true'] {
410
+ color: var(--icen-token-text-faint);
407
411
  cursor: default;
408
412
  }
409
413
 
410
414
  /* 状态点:空心灰(pending)/ accent 脉冲(running)/ 实心绿(done)/ 实心红(error) */
411
- .kb-chain-dot {
415
+ .icen-kb-chain-dot {
412
416
  box-sizing: border-box;
413
417
  width: 8px;
414
418
  height: 8px;
@@ -416,66 +420,77 @@
416
420
  flex: 0 0 auto;
417
421
  transition: background-color 0.16s ease-out, border-color 0.16s ease-out;
418
422
  }
419
- .kb-chain-step.is-pending .kb-chain-dot {
420
- border: 1.5px solid var(--token-line);
423
+ .icen-kb-chain-step.is-pending .icen-kb-chain-dot {
424
+ border: 1.5px solid var(--icen-token-line);
421
425
  background: transparent;
422
426
  }
423
- .kb-chain-step.is-running .kb-chain-dot {
424
- background: var(--token-accent);
427
+ .icen-kb-chain-step.is-running .icen-kb-chain-dot {
428
+ background: var(--icen-token-accent);
425
429
  animation: kb-pulse 1.6s ease-in-out infinite; /* kb.css 共享脉冲 */
426
430
  }
427
- .kb-chain-step.is-done .kb-chain-dot {
428
- background: var(--token-success);
431
+ .icen-kb-chain-step.is-done .icen-kb-chain-dot {
432
+ background: var(--icen-token-success);
429
433
  }
430
- .kb-chain-step.is-error .kb-chain-dot {
431
- background: var(--token-danger, var(--token-error));
434
+ .icen-kb-chain-step.is-error .icen-kb-chain-dot {
435
+ background: var(--icen-token-error);
432
436
  }
433
437
 
434
- .kb-chain-label {
438
+ .icen-kb-chain-label {
435
439
  white-space: nowrap;
436
440
  }
437
441
 
438
- /* 步骤间箭头连线:基线 + 45° 折角箭头,中性层级色 */
439
- .kb-chain-link {
442
+ /* 步骤间箭头连线:基线 + 45° 折角箭头(指向行进方向),中性层级色;RTL 镜像规则移到行内末端并翻转为左指 */
443
+ .icen-kb-chain-link {
440
444
  position: relative;
441
445
  flex: 0 0 18px;
442
446
  height: 1px;
443
447
  margin: 0 2px;
444
- background: var(--token-line-soft);
448
+ background: var(--icen-token-line-soft);
445
449
  }
446
- .kb-chain-link::after {
450
+ .icen-kb-chain-link::after {
447
451
  content: '';
448
452
  position: absolute;
449
- right: 1px;
453
+ right: 1px; /* guard:allow-physical 箭头钉在连线物理末端(LTR 行进方向),RTL 镜像规则改到 left 并翻转指向 */
450
454
  top: 50%;
451
455
  width: 5px;
452
456
  height: 5px;
453
- border-top: 1px solid var(--token-line);
454
- border-right: 1px solid var(--token-line);
457
+ border-top: 1px solid var(--icen-token-line); /* guard:allow-physical 折角箭头半边构成(与 rotate(45deg) 配套) */
458
+ border-right: 1px solid var(--icen-token-line); /* guard:allow-physical 折角箭头半边构成 */
455
459
  transform: translateY(-50%) rotate(45deg);
456
460
  }
457
461
 
458
462
  /* ═══════════════ 动效纪律(reduced-motion 全退化) ═══════════════ */
459
463
 
460
464
  @media (prefers-reduced-motion: reduce) {
461
- .kb-canvas-divider,
462
- .kb-canvas-divider::after,
463
- .kb-canvas-ver,
464
- .kb-canvas-ver-dot,
465
- .kb-canvas-selbar,
466
- .kb-canvas-selbar-btn,
467
- .kb-checkpoint,
468
- .kb-checkpoint-menu,
469
- .kb-checkpoint-menu-item,
470
- .kb-chain-step,
471
- .kb-chain-dot {
465
+ .icen-kb-canvas-divider,
466
+ .icen-kb-canvas-divider::after,
467
+ .icen-kb-canvas-ver,
468
+ .icen-kb-canvas-ver-dot,
469
+ .icen-kb-canvas-selbar,
470
+ .icen-kb-canvas-selbar-btn,
471
+ .icen-kb-checkpoint,
472
+ .icen-kb-checkpoint-menu,
473
+ .icen-kb-checkpoint-menu-item,
474
+ .icen-kb-chain-step,
475
+ .icen-kb-chain-dot {
472
476
  transition: none;
473
477
  animation: none;
474
478
  }
475
- .kb-chain-step.is-running .kb-chain-dot {
479
+ .icen-kb-chain-step.is-running .icen-kb-chain-dot {
476
480
  animation: none; /* 脉冲退化为静态 accent 点 */
477
481
  }
478
- .kb-sandbox-spin {
482
+ .icen-kb-sandbox-spin {
479
483
  animation-duration: 1.6s; /* 旋转保留但放慢,避免频闪不适 */
480
484
  }
481
485
  }
486
+
487
+ /* ── RTL:步骤链行进箭头镜像(翻转到行内末端并改为左指) ── */
488
+ :is([dir='rtl']) .icen-kb-chain-link::after {
489
+ right: auto; /* guard:allow-physical RTL 镜像规则:箭头移到行内末端(视觉左) */
490
+ left: 1px; /* guard:allow-physical RTL 镜像规则:箭头钉在视觉左端 */
491
+ transform: translateY(-50%) rotate(45deg) scaleX(-1);
492
+ }
493
+
494
+ .icen-kb-checkpoint-menu-check { display: none; }
495
+
496
+ }