@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,229 +1,244 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: command-palette(命令面板 ⌘K,与 behaviors/command-palette 配套)
3
4
  *
4
5
  * 契约:
5
- * <div class="command-palette-backdrop" data-command-palette="id" hidden>
6
- * <div class="command-palette">
7
- * <div class="command-palette-search">
8
- * <span class="command-palette-search-icon">…放大镜 svg…</span>
9
- * <input class="command-palette-input" placeholder="搜索命令…" />
10
- * <kbd class="command-palette-esc">ESC</kbd>
6
+ * <div class="icen-command-palette-backdrop" data-icen-command-palette="id" hidden>
7
+ * <div class="icen-command-palette">
8
+ * <div class="icen-command-palette-search">
9
+ * <span class="icen-command-palette-search-icon">…放大镜 svg…</span>
10
+ * <icen-input class="icen-command-palette-input" placeholder="搜索命令…" />
11
+ * <icen-kbd class="icen-command-palette-esc">ESC</icen-kbd>
11
12
  * </div>
12
- * <div class="command-palette-body">
13
- * <div class="command-palette-group">
14
- * <p class="command-palette-group-label">分组名</p>
15
- * <button class="command-palette-item [.is-active]" type="button">
16
- * <span class="command-palette-item-icon">…svg…</span>
17
- * <span class="command-palette-item-label">命令名</span>
18
- * <span class="command-palette-item-hint">副标题</span>
19
- * <kbd class="command-palette-item-kbd">⌘S</kbd>
13
+ * <div class="icen-command-palette-body">
14
+ * <div class="icen-command-palette-group">
15
+ * <p class="icen-command-palette-group-label">分组名</p>
16
+ * <button class="icen-command-palette-item [.is-active]" type="button">
17
+ * <span class="icen-command-palette-item-icon">…svg…</span>
18
+ * <span class="icen-command-palette-item-label">命令名</span>
19
+ * <span class="icen-command-palette-item-hint">副标题</span>
20
+ * <icen-kbd class="icen-command-palette-item-kbd">⌘S</icen-kbd>
20
21
  * </button>
21
22
  * </div>
22
- * <div class="command-palette-empty" hidden>无匹配命令</div>
23
+ * <div class="icen-command-palette-empty" hidden>无匹配命令</div>
23
24
  * </div>
24
- * <div class="command-palette-foot">
25
- * <span class="command-palette-foot-hint">
26
- * <kbd>↑↓</kbd> 导航 <kbd>↵</kbd> 执行 <kbd>esc</kbd> 关闭
25
+ * <div class="icen-command-palette-foot">
26
+ * <span class="icen-command-palette-foot-hint">
27
+ * <icen-kbd>↑↓</icen-kbd> 导航 <icen-kbd>↵</icen-kbd> 执行 <icen-kbd>esc</icen-kbd> 关闭
27
28
  * </span>
28
29
  * </div>
29
30
  * </div>
30
31
  * </div>
31
32
  *
32
- * behavior 接管:搜索过滤、↑↓ 导航、Enter 执行、ESC / 外点 / backdrop 关闭、
33
- * 焦点陷阱、按 ⌘K / Ctrl+K 全局打开(可选 data-command-palette-key)。
33
+ * behavior 接管:搜索过滤、↑↓/Home/End 导航、Enter 执行、ESC / 外点 / backdrop 关闭、
34
+ * 焦点陷阱、按 ⌘K / Ctrl+K 全局打开(可选 data-icen-command-palette-key)。
35
+ * 语义:input 为 combobox(expanded + controls + activedescendant),body 为 listbox,
36
+ * item 为 role=option(自动补稳定 id 与 aria-selected)。
37
+ * 关闭有两段:焦点/滚动锁立即结算,hidden 待淡出落定(backdrop[data-icen-state='closing']);
38
+ * 重开中断续接;销毁/reduce-motion 走立即关闭。
34
39
  */
35
40
 
36
- .command-palette-backdrop {
41
+ .icen-command-palette-backdrop {
37
42
  position: fixed;
38
43
  inset: 0;
39
- z-index: var(--z-dialog);
44
+ z-index: var(--icen-z-dialog);
40
45
  display: flex;
41
46
  align-items: flex-start;
42
47
  justify-content: center;
43
48
  padding-top: 12vh;
44
- padding-left: var(--density-space-md);
45
- padding-right: var(--density-space-md);
46
- background: color-mix(in srgb, var(--token-text) 40%, transparent);
49
+ padding-inline: var(--icen-density-space-md);
50
+ background: color-mix(in srgb, var(--icen-token-text) 40%, transparent);
47
51
  backdrop-filter: blur(4px);
48
52
  -webkit-backdrop-filter: blur(4px);
49
- animation: icen-cp-fade-in var(--icen-tx-normal);
53
+ animation: icen-cp-fade-in var(--icen-tx-fast);
54
+ /* 退场走过渡(behavior 的 closing 阶段;可中断续接) */
55
+ transition: opacity var(--icen-tx-fast) var(--icen-ease-out);
56
+ }
57
+ .icen-command-palette-backdrop[hidden] { display: none; }
58
+ .icen-command-palette-backdrop[data-icen-state='closing'] {
59
+ animation: none;
60
+ opacity: 0;
61
+ pointer-events: none;
50
62
  }
51
- .command-palette-backdrop[hidden] { display: none; }
52
63
 
53
- .command-palette {
64
+ .icen-command-palette {
54
65
  display: flex;
55
66
  flex-direction: column;
56
- width: 100%;
57
- max-width: 560px;
58
- max-height: 70vh;
67
+ inline-size: 100%;
68
+ max-inline-size: 560px;
69
+ max-block-size: 70vh;
59
70
  overflow: hidden;
60
- background: var(--token-card-strong);
61
- border: 1px solid var(--token-outline);
62
- border-radius: var(--radius-lg);
63
- box-shadow: var(--token-shadow-overlay);
64
- animation: icen-cp-scale-in var(--icen-tx-slow);
71
+ background: var(--icen-token-card-strong);
72
+ border: 1px solid var(--icen-token-outline);
73
+ border-radius: var(--icen-radius-lg);
74
+ box-shadow: var(--icen-token-shadow-overlay);
75
+ animation: icen-cp-scale-in var(--icen-tx-fast) var(--icen-ease-out);
76
+ transition: transform var(--icen-tx-fast) var(--icen-ease-out);
65
77
  }
66
- .command-palette:focus { outline: none; }
78
+ .icen-command-palette-backdrop[data-icen-state='closing'] .icen-command-palette {
79
+ transform: translateY(2px) scale(0.99);
80
+ }
81
+ .icen-command-palette:focus { outline: none; }
67
82
 
68
83
  /* ── 搜索栏 ── */
69
- .command-palette-search {
84
+ .icen-command-palette-search {
70
85
  display: flex;
71
86
  align-items: center;
72
- gap: var(--density-space-sm);
73
- padding: var(--density-space-md);
74
- border-bottom: 1px solid var(--token-line-soft);
87
+ gap: var(--icen-density-space-sm);
88
+ padding: var(--icen-density-space-md);
89
+ border-bottom: 1px solid var(--icen-token-line-soft);
75
90
  }
76
- .command-palette-search-icon {
91
+ .icen-command-palette-search-icon {
77
92
  display: inline-flex;
78
93
  align-items: center;
79
94
  justify-content: center;
80
- color: var(--token-text-faint);
95
+ color: var(--icen-token-text-faint);
81
96
  flex-shrink: 0;
82
97
  }
83
- .command-palette-search-icon svg { width: 16px; height: 16px; }
84
- .command-palette-input {
98
+ .icen-command-palette-search-icon svg { width: 16px; height: 16px; }
99
+ .icen-command-palette-input {
85
100
  flex: 1;
86
101
  min-width: 0;
87
102
  border: 0;
88
103
  outline: none;
89
104
  background: transparent;
90
- color: var(--token-text);
105
+ color: var(--icen-token-text);
91
106
  font: inherit;
92
- font-size: var(--density-font-size-md);
107
+ font-size: var(--icen-density-font-size-md);
93
108
  }
94
- .command-palette-input::placeholder {
95
- color: color-mix(in srgb, var(--token-text-faint) 60%, transparent);
109
+ .icen-command-palette-input::placeholder {
110
+ color: color-mix(in srgb, var(--icen-token-text-faint) 60%, transparent);
96
111
  }
97
- .command-palette-esc {
98
- font-family: var(--font-mono);
99
- font-size: var(--density-font-size-xs);
100
- color: var(--token-text-faint);
112
+ .icen-command-palette-esc {
113
+ font-family: var(--icen-font-mono);
114
+ font-size: var(--icen-density-font-size-xs);
115
+ color: var(--icen-token-text-faint);
101
116
  padding: 2px 6px;
102
- border: 1px solid var(--token-line-soft);
103
- border-radius: var(--radius-xs);
117
+ border: 1px solid var(--icen-token-line-soft);
118
+ border-radius: var(--icen-radius-xs);
104
119
  flex-shrink: 0;
105
120
  }
106
121
 
107
122
  /* ── 列表区 ── */
108
- .command-palette-body {
123
+ .icen-command-palette-body {
109
124
  flex: 1;
110
125
  min-height: 0;
111
126
  overflow-y: auto;
112
127
  overscroll-behavior: contain;
113
- padding: var(--density-space-xs);
128
+ padding: var(--icen-density-space-xs);
114
129
  }
115
130
 
116
- .command-palette-group {
131
+ .icen-command-palette-group {
117
132
  display: flex;
118
133
  flex-direction: column;
119
134
  gap: 1px;
120
- margin-bottom: var(--density-space-sm);
135
+ margin-bottom: var(--icen-density-space-sm);
121
136
  }
122
- .command-palette-group:last-child { margin-bottom: 0; }
123
- .command-palette-group-label {
124
- margin: var(--density-space-sm) var(--density-space-sm) var(--density-space-xs);
125
- font-size: var(--density-font-size-xs);
137
+ .icen-command-palette-group:last-child { margin-bottom: 0; }
138
+ .icen-command-palette-group-label {
139
+ margin: var(--icen-density-space-sm) var(--icen-density-space-sm) var(--icen-density-space-xs);
140
+ font-size: var(--icen-density-font-size-xs);
126
141
  font-weight: 600;
127
- color: var(--token-text-faint);
142
+ color: var(--icen-token-text-faint);
128
143
  letter-spacing: 0.06em;
129
144
  text-transform: uppercase;
130
145
  }
131
- .command-palette-group:first-child .command-palette-group-label { margin-top: 0; }
146
+ .icen-command-palette-group:first-child .icen-command-palette-group-label { margin-top: 0; }
132
147
 
133
- .command-palette-item {
148
+ .icen-command-palette-item {
134
149
  display: flex;
135
150
  align-items: center;
136
- gap: var(--density-space-sm);
151
+ gap: var(--icen-density-space-sm);
137
152
  width: 100%;
138
- padding: 8px var(--density-space-sm);
153
+ padding: 8px var(--icen-density-space-sm);
139
154
  border: 0;
140
- border-radius: var(--radius-sm);
155
+ border-radius: var(--icen-radius-sm);
141
156
  background: transparent;
142
- color: var(--token-text);
157
+ color: var(--icen-token-text);
143
158
  font: inherit;
144
- font-size: var(--density-font-size-md);
145
- text-align: left;
159
+ font-size: var(--icen-density-font-size-md);
160
+ text-align: start;
146
161
  cursor: pointer;
147
162
  -webkit-tap-highlight-color: transparent;
148
163
  transition: background-color var(--icen-tx-fast);
149
164
  }
150
- .command-palette-item:hover { background: var(--token-fill-1); }
151
- .command-palette-item.is-active {
152
- background: var(--token-accent-subtle);
153
- color: var(--token-accent-deep, var(--token-accent));
165
+ .icen-command-palette-item:hover { background: var(--icen-token-fill-1); }
166
+ .icen-command-palette-item.is-active {
167
+ /* 当前候选 = 选中表面(accent 微底 + 内描边),不改文字色;与菜单/选择器同语言 */
168
+ background: var(--icen-token-accent-subtle);
169
+ color: var(--icen-token-text);
170
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--icen-token-accent) 65%, var(--icen-token-line-soft));
154
171
  }
155
- .command-palette-item:focus-visible {
172
+ .icen-command-palette-item:focus-visible {
156
173
  outline: none;
157
174
  box-shadow: var(--icen-ring);
158
175
  }
159
176
 
160
- .command-palette-item-icon {
177
+ .icen-command-palette-item-icon {
161
178
  display: inline-flex;
162
179
  align-items: center;
163
180
  justify-content: center;
164
181
  flex-shrink: 0;
165
182
  width: 18px;
166
183
  height: 18px;
167
- color: var(--token-text-faint);
184
+ color: var(--icen-token-text-faint);
168
185
  }
169
- .command-palette-item.is-active .command-palette-item-icon { color: var(--token-accent); }
170
- .command-palette-item-icon svg { width: 16px; height: 16px; }
171
-
172
- .command-palette-item-label {
186
+ .icen-command-palette-item.is-active .icen-command-palette-item-icon { color: var(--icen-token-accent); }
187
+ .icen-command-palette-item-icon svg { width: 16px; height: 16px; }
188
+ .icen-command-palette-item-label {
173
189
  flex: 1;
174
190
  min-width: 0;
175
191
  overflow: hidden;
176
192
  text-overflow: ellipsis;
177
193
  white-space: nowrap;
178
194
  }
179
- .command-palette-item-hint {
180
- font-size: var(--density-font-size-xs);
181
- color: var(--token-text-faint);
182
- margin-left: var(--density-space-xs);
195
+ .icen-command-palette-item-hint {
196
+ font-size: var(--icen-density-font-size-xs);
197
+ color: var(--icen-token-text-faint);
198
+ margin-inline-start: var(--icen-density-space-xs);
183
199
  overflow: hidden;
184
200
  text-overflow: ellipsis;
185
201
  white-space: nowrap;
186
202
  }
187
- .command-palette-item.is-active .command-palette-item-hint { color: color-mix(in srgb, var(--token-accent) 70%, var(--token-text-faint)); }
188
203
 
189
- .command-palette-item-kbd {
190
- font-family: var(--font-mono);
191
- font-size: var(--density-font-size-2xs);
192
- color: var(--token-text-faint);
204
+ .icen-command-palette-item-kbd {
205
+ font-family: var(--icen-font-mono);
206
+ font-size: var(--icen-density-font-size-2xs);
207
+ color: var(--icen-token-text-faint);
193
208
  padding: 1px 5px;
194
- border: 1px solid var(--token-line-soft);
195
- border-radius: var(--radius-xs);
209
+ border: 1px solid var(--icen-token-line-soft);
210
+ border-radius: var(--icen-radius-xs);
196
211
  flex-shrink: 0;
197
212
  }
198
213
 
199
214
  /* ── 空态 ── */
200
- .command-palette-empty {
201
- padding: 32px var(--density-space-md);
215
+ .icen-command-palette-empty {
216
+ padding: 32px var(--icen-density-space-md);
202
217
  text-align: center;
203
- color: var(--token-text-faint);
204
- font-size: var(--density-font-size-sm);
218
+ color: var(--icen-token-text-faint);
219
+ font-size: var(--icen-density-font-size-sm);
205
220
  }
206
221
 
207
222
  /* ── 底栏 ── */
208
- .command-palette-foot {
209
- padding: var(--density-space-xs) var(--density-space-md);
210
- border-top: 1px solid var(--token-line-soft);
211
- background: var(--token-bg-soft);
223
+ .icen-command-palette-foot {
224
+ padding: var(--icen-density-space-xs) var(--icen-density-space-md);
225
+ border-top: 1px solid var(--icen-token-line-soft);
226
+ background: var(--icen-token-bg-soft);
212
227
  }
213
- .command-palette-foot-hint {
228
+ .icen-command-palette-foot-hint {
214
229
  display: inline-flex;
215
230
  align-items: center;
216
- gap: var(--density-space-sm);
217
- font-size: var(--density-font-size-xs);
218
- color: var(--token-text-faint);
231
+ gap: var(--icen-density-space-sm);
232
+ font-size: var(--icen-density-font-size-xs);
233
+ color: var(--icen-token-text-faint);
219
234
  }
220
- .command-palette-foot-hint kbd {
221
- font-family: var(--font-mono);
222
- font-size: var(--density-font-size-2xs);
235
+ .icen-command-palette-foot-hint kbd {
236
+ font-family: var(--icen-font-mono);
237
+ font-size: var(--icen-density-font-size-2xs);
223
238
  padding: 1px 4px;
224
- border: 1px solid var(--token-line-soft);
225
- border-radius: var(--radius-xs);
226
- background: var(--token-surface);
239
+ border: 1px solid var(--icen-token-line-soft);
240
+ border-radius: var(--icen-radius-xs);
241
+ background: var(--icen-token-surface);
227
242
  }
228
243
 
229
244
  @keyframes icen-cp-fade-in {
@@ -231,16 +246,22 @@
231
246
  to { opacity: 1; }
232
247
  }
233
248
  @keyframes icen-cp-scale-in {
234
- from { opacity: 0; transform: translateY(-8px) scale(0.98); }
249
+ from { opacity: 0; transform: translateY(-6px) scale(0.985); }
235
250
  to { opacity: 1; transform: translateY(0) scale(1); }
236
251
  }
237
252
 
238
253
  @media (max-width: 480px) {
239
- .command-palette-backdrop { padding-top: 6vh; }
240
- .command-palette { max-height: 80vh; }
254
+ .icen-command-palette-backdrop { padding-top: 6vh; }
255
+ .icen-command-palette { max-height: 80vh; }
241
256
  }
242
257
 
243
258
  @media (prefers-reduced-motion: reduce) {
244
- .command-palette-backdrop { animation: none; }
245
- .command-palette { animation: none; }
259
+ .icen-command-palette-backdrop { animation: none; transition: none; }
260
+ .icen-command-palette { animation: none; transition: none; }
261
+ }
262
+
263
+ @media (forced-colors: active) {
264
+ .icen-command-palette-item.is-active { outline: 3px double Highlight; outline-offset: -3px; }
265
+ }
266
+
246
267
  }