@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,30 +1,31 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: nav(玻璃顶栏,scroll 收缩配套 behaviors/nav)
3
4
  *
4
5
  * 完整契约:
5
- * <nav class="nav [nav--sticky|nav--fixed] [.is-scrolled]" data-scroll-reactive>
6
- * <div class="nav-left">…品牌/返回</div>
7
- * <div class="nav-center">…中间菜单</div>
8
- * <div class="nav-right">…操作</div>
9
- * <div class="nav-bottom">…整行补充(可选,会换行)</div>
10
- * </nav>
6
+ * <icen-nav class="icen-nav [icen-nav--sticky|icen-nav--fixed] [.is-scrolled]" data-icen-scroll-reactive>
7
+ * <div class="icen-nav-left">…品牌/返回</div>
8
+ * <div class="icen-nav-center">…中间菜单</div>
9
+ * <div class="icen-nav-right">…操作</div>
10
+ * <div class="icen-nav-bottom">…整行补充(可选,会换行)</div>
11
+ * </icen-nav>
11
12
  *
12
- * 按钮:<button class="nav-btn motion pressable [.is-active] [.is-disabled] [.nav-btn--icon]">
13
+ * 按钮:<button class="icen-nav-btn icen-motion icen-pressable [.is-active] [.is-disabled] [.icen-nav-btn--icon]">
13
14
  * 三段布局:left/right flex-shrink:0;center flex:1 居中。
14
15
  * behavior 维护:scrollY > 12 时挂 .is-scrolled;prefers-reduced-motion 下不监听。
15
16
  */
16
17
 
17
- .nav {
18
+ .icen-nav {
18
19
  display: flex;
19
20
  align-items: center;
20
21
  flex-wrap: wrap;
21
- gap: var(--density-space-sm);
22
+ gap: var(--icen-density-space-sm);
22
23
  height: 56px;
23
- padding: 0 var(--density-space-md);
24
- background: var(--token-surface-glass);
24
+ padding: 0 var(--icen-density-space-md);
25
+ background: var(--icen-token-surface-glass);
25
26
  backdrop-filter: blur(12px) saturate(1.1);
26
27
  -webkit-backdrop-filter: blur(12px) saturate(1.1);
27
- border-bottom: 1px solid var(--token-outline-soft);
28
+ border-bottom: 1px solid var(--icen-token-outline-soft);
28
29
  transition:
29
30
  background-color var(--icen-tx-slow),
30
31
  border-color var(--icen-tx-slow),
@@ -32,69 +33,68 @@
32
33
  transform var(--icen-tx-slow),
33
34
  backdrop-filter var(--icen-tx-slow);
34
35
  }
35
- .nav:has(.nav-bottom) {
36
+ .icen-nav:has(.icen-nav-bottom) {
36
37
  height: auto;
37
38
  min-height: 56px;
38
39
  }
39
- .nav--sticky {
40
+ .icen-nav--sticky {
40
41
  position: sticky;
41
42
  top: 0;
42
- z-index: var(--z-chrome);
43
+ z-index: var(--icen-z-chrome);
43
44
  }
44
- .nav--fixed {
45
+ .icen-nav--fixed {
45
46
  position: fixed;
46
47
  top: 0;
47
- left: 0;
48
- right: 0;
49
- z-index: var(--z-chrome);
48
+ inset-inline: 0;
49
+ z-index: var(--icen-z-chrome);
50
50
  }
51
51
 
52
52
  /* scroll-reactive:未滚动更透、底边线透明;滚动后底色更实 + blur 加倍 */
53
- .nav[data-scroll-reactive]:not(.is-scrolled) {
54
- background: color-mix(in srgb, var(--token-surface-glass) 70%, transparent);
53
+ .icen-nav[data-icen-scroll-reactive]:not(.is-scrolled) {
54
+ background: color-mix(in srgb, var(--icen-token-surface-glass) 70%, transparent);
55
55
  backdrop-filter: blur(8px);
56
56
  -webkit-backdrop-filter: blur(8px);
57
57
  border-bottom-color: transparent;
58
58
  }
59
- .nav.is-scrolled {
60
- background: color-mix(in srgb, var(--token-surface-glass) 92%, transparent);
59
+ .icen-nav.is-scrolled {
60
+ background: color-mix(in srgb, var(--icen-token-surface-glass) 92%, transparent);
61
61
  backdrop-filter: blur(16px) saturate(1.2);
62
62
  -webkit-backdrop-filter: blur(16px) saturate(1.2);
63
- box-shadow: var(--token-shadow-elevated);
63
+ box-shadow: var(--icen-token-shadow-elevated);
64
64
  }
65
65
 
66
66
  /* hide-on-scroll 模式:向下滚隐藏,向上滚恢复。仅 sticky/fixed 生效。 */
67
- .nav.nav--sticky.is-nav-hidden,
68
- .nav.nav--fixed.is-nav-hidden {
67
+ .icen-nav.icen-nav--sticky.is-nav-hidden,
68
+ .icen-nav.icen-nav--fixed.is-nav-hidden {
69
69
  transform: translateY(-100%);
70
70
  box-shadow: none;
71
71
  }
72
72
 
73
- .nav-left,
74
- .nav-right {
73
+ .icen-nav-left,
74
+ .icen-nav-right {
75
75
  display: flex;
76
76
  align-items: center;
77
- gap: var(--density-space-xs);
77
+ gap: var(--icen-density-space-xs);
78
78
  flex-shrink: 0;
79
79
  }
80
- .nav-center {
80
+ .icen-nav-center {
81
81
  flex: 1;
82
82
  display: flex;
83
83
  align-items: center;
84
84
  justify-content: center;
85
- gap: var(--density-space-xs);
85
+ gap: var(--icen-density-space-xs);
86
86
  }
87
- .nav-bottom { width: 100%; padding-top: var(--density-space-xs); }
87
+ .icen-nav-bottom { inline-size: 100%; padding-top: var(--icen-density-space-xs); }
88
88
 
89
- .nav-btn {
89
+ .icen-nav-btn {
90
90
  position: relative;
91
91
  display: inline-flex;
92
92
  align-items: center;
93
- gap: var(--density-space-xs);
94
- border-radius: var(--radius-full);
95
- padding: 6px var(--density-space-sm);
96
- font-size: var(--density-font-size-md);
97
- color: var(--token-text-muted);
93
+ gap: var(--icen-density-space-xs);
94
+ border-radius: var(--icen-radius-full);
95
+ padding: 6px var(--icen-density-space-sm);
96
+ font-size: var(--icen-density-font-size-md);
97
+ color: var(--icen-token-text-muted);
98
98
  background: none;
99
99
  border: 0;
100
100
  cursor: pointer;
@@ -103,119 +103,119 @@
103
103
  background-color var(--icen-tx-fast),
104
104
  color var(--icen-tx-fast);
105
105
  }
106
- .nav-btn > svg {
106
+ .icen-nav-btn > svg {
107
107
  width: 14px;
108
108
  height: 14px;
109
109
  flex-shrink: 0;
110
110
  }
111
- .nav-btn:not(.is-active):hover {
112
- color: var(--token-text);
113
- background: var(--token-control-hover);
111
+ .icen-nav-btn:not(.is-active):hover {
112
+ color: var(--icen-token-text);
113
+ background: var(--icen-token-control-hover);
114
114
  }
115
- .nav-btn:focus-visible {
115
+ .icen-nav-btn:focus-visible {
116
116
  outline: none;
117
117
  box-shadow: var(--icen-ring);
118
118
  }
119
- .nav-btn.is-active,
120
- .nav-btn[aria-current='page'] {
121
- background: var(--token-accent);
122
- color: var(--token-on-accent);
119
+ .icen-nav-btn.is-active,
120
+ .icen-nav-btn[aria-current='page'] {
121
+ background: var(--icen-token-accent-strong);
122
+ color: var(--icen-token-on-accent);
123
123
  font-weight: 500;
124
- box-shadow: var(--token-shadow-elevated);
124
+ box-shadow: var(--icen-token-shadow-elevated);
125
125
  }
126
- .nav-btn.is-disabled,
127
- .nav-btn:disabled,
128
- .nav-btn[aria-disabled='true'] {
126
+ .icen-nav-btn.is-disabled,
127
+ .icen-nav-btn:disabled,
128
+ .icen-nav-btn[aria-disabled='true'] {
129
129
  opacity: var(--icen-disabled-opacity);
130
130
  pointer-events: none;
131
131
  }
132
- .nav-btn--icon { padding: 6px 10px; }
133
- .nav-btn--icon > svg { width: 16px; height: 16px; }
132
+ .icen-nav-btn--icon { padding: 6px 10px; }
133
+ .icen-nav-btn--icon > svg { width: 16px; height: 16px; }
134
134
 
135
- .nav-divider {
135
+ .icen-nav-divider {
136
136
  width: 1px;
137
137
  height: 20px;
138
138
  margin: 0 2px;
139
- background: var(--token-outline-soft);
139
+ background: var(--icen-token-outline-soft);
140
140
  }
141
141
 
142
142
  /* 品牌徽标位 */
143
- .nav-brand {
143
+ .icen-nav-brand {
144
144
  display: inline-flex;
145
145
  align-items: center;
146
- gap: var(--density-space-xs);
147
- font-family: var(--font-heading);
148
- font-size: var(--density-font-size-md);
146
+ gap: var(--icen-density-space-xs);
147
+ font-family: var(--icen-font-heading);
148
+ font-size: var(--icen-density-font-size-md);
149
149
  font-weight: 600;
150
- color: var(--token-text);
150
+ color: var(--icen-token-text);
151
151
  text-decoration: none;
152
152
  }
153
- .nav-brand:hover { text-decoration: none; }
154
- .nav-brand > svg, .nav-brand > img {
153
+ .icen-nav-brand:hover { text-decoration: none; }
154
+ .icen-nav-brand > svg, .icen-nav-brand > img {
155
155
  width: 24px;
156
156
  height: 24px;
157
157
  }
158
158
 
159
159
  /* 移动端:缩短高度、收紧间距 */
160
160
  @media (max-width: 640px) {
161
- .nav { height: 48px; min-height: 48px; padding: 0 var(--density-space-sm); }
162
- .nav-btn { padding: 4px var(--density-space-xs); }
161
+ .icen-nav { height: 48px; min-height: 48px; padding: 0 var(--icen-density-space-sm); }
162
+ .icen-nav-btn { padding: 4px var(--icen-density-space-xs); }
163
163
  }
164
164
 
165
165
  @media (prefers-reduced-motion: reduce) {
166
- .nav, .nav-btn { transition: none; }
166
+ .icen-nav, .icen-nav-btn { transition: none; }
167
167
  }
168
168
 
169
169
  /* ── 增强 ── */
170
170
 
171
171
  /* 导航搜索槽 */
172
- .nav-search {
172
+ .icen-nav-search {
173
173
  display: flex;
174
174
  align-items: center;
175
- gap: var(--density-space-xs);
176
- padding: 0 var(--density-space-sm);
175
+ gap: var(--icen-density-space-xs);
176
+ padding: 0 var(--icen-density-space-sm);
177
177
  height: 32px;
178
178
  min-width: 180px;
179
- background: var(--token-control);
180
- border: 1px solid var(--token-outline-soft);
181
- border-radius: var(--radius-full);
182
- color: var(--token-text-faint);
183
- font-size: var(--density-font-size-sm);
179
+ background: var(--icen-token-control);
180
+ border: 1px solid var(--icen-token-outline-soft);
181
+ border-radius: var(--icen-radius-full);
182
+ color: var(--icen-token-text-faint);
183
+ font-size: var(--icen-density-font-size-sm);
184
184
  cursor: pointer;
185
185
  transition: border-color var(--icen-tx-fast);
186
186
  }
187
- .nav-search:hover { border-color: var(--token-accent); }
188
- .nav-search svg { width: 14px; height: 14px; flex-shrink: 0; }
189
- .nav-search-kbd {
190
- margin-left: auto;
187
+ .icen-nav-search:hover { border-color: var(--icen-token-accent); }
188
+ .icen-nav-search svg { width: 14px; height: 14px; flex-shrink: 0; }
189
+ .icen-nav-search-kbd {
190
+ margin-inline-start: auto;
191
191
  padding: 1px 5px;
192
- font-size: var(--density-font-size-2xs);
193
- font-family: var(--font-mono);
194
- color: var(--token-text-faint);
195
- background: var(--token-fill-2);
196
- border-radius: var(--radius-xs);
192
+ font-size: var(--icen-density-font-size-2xs);
193
+ font-family: var(--icen-font-mono);
194
+ color: var(--icen-token-text-faint);
195
+ background: var(--icen-token-fill-2);
196
+ border-radius: var(--icen-radius-xs);
197
197
  }
198
198
 
199
- /* 导航按钮上的通知徽标 */
200
- .nav-btn-badge {
199
+ /* 导航按钮上的通知徽标(与 .icen-badge 同为物理右上角契约,RTL 不镜像) */
200
+ .icen-nav-btn-badge {
201
201
  position: absolute;
202
202
  top: 2px;
203
- right: 2px;
203
+ right: 2px; /* guard:allow-physical 徽标钉在按钮物理右上角(同 .icen-badge 角标契约) */
204
204
  min-width: 8px;
205
205
  height: 8px;
206
206
  padding: 0;
207
- background: var(--token-error);
208
- border: 1.5px solid var(--token-surface-glass);
209
- border-radius: var(--radius-full);
207
+ background: var(--icen-token-error);
208
+ border: 1.5px solid var(--icen-token-surface-glass);
209
+ border-radius: var(--icen-radius-full);
210
210
  pointer-events: none;
211
211
  }
212
- .nav-btn-badge--count {
212
+ .icen-nav-btn-badge--count {
213
213
  min-width: 16px;
214
214
  height: 16px;
215
215
  padding: 0 4px;
216
- font-size: var(--density-font-size-2xs);
216
+ font-size: var(--icen-density-font-size-2xs);
217
217
  font-weight: 700;
218
- color: var(--token-on-accent);
218
+ color: var(--icen-token-on-accent);
219
219
  display: inline-flex;
220
220
  align-items: center;
221
221
  justify-content: center;
@@ -223,43 +223,46 @@
223
223
  }
224
224
 
225
225
  /* 链接式导航项(a 标签替代 button) */
226
- .nav-link {
226
+ .icen-nav-link {
227
227
  display: inline-flex;
228
228
  align-items: center;
229
- gap: var(--density-space-xs);
230
- padding: 6px var(--density-space-sm);
231
- font-size: var(--density-font-size-md);
232
- color: var(--token-text-muted);
229
+ gap: var(--icen-density-space-xs);
230
+ padding: 6px var(--icen-density-space-sm);
231
+ font-size: var(--icen-density-font-size-md);
232
+ color: var(--icen-token-text-muted);
233
233
  text-decoration: none;
234
- border-radius: var(--radius-full);
234
+ border-radius: var(--icen-radius-full);
235
235
  transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
236
236
  }
237
- .nav-link:hover {
238
- color: var(--token-text);
239
- background: var(--token-control-hover);
237
+ .icen-nav-link:hover {
238
+ color: var(--icen-token-text);
239
+ background: var(--icen-token-control-hover);
240
240
  text-decoration: none;
241
241
  }
242
- .nav-link.is-active,
243
- .nav-link[aria-current='page'] {
244
- color: var(--token-accent);
245
- background: var(--token-accent-subtle);
242
+ .icen-nav-link.is-active,
243
+ .icen-nav-link[aria-current='page'] {
244
+ color: var(--icen-token-accent);
245
+ background: var(--icen-token-accent-subtle);
246
246
  }
247
247
 
248
248
  /* 导航用户区(头像 + 下拉触发器) */
249
- .nav-user {
249
+ .icen-nav-user {
250
250
  display: inline-flex;
251
251
  align-items: center;
252
- gap: var(--density-space-xs);
253
- padding: 3px var(--density-space-xs) 3px 3px;
254
- border-radius: var(--radius-full);
255
- border: 1px solid var(--token-outline-soft);
256
- background: var(--token-surface);
252
+ gap: var(--icen-density-space-xs);
253
+ padding-block: 3px;
254
+ padding-inline: 3px var(--icen-density-space-xs);
255
+ border-radius: var(--icen-radius-full);
256
+ border: 1px solid var(--icen-token-outline-soft);
257
+ background: var(--icen-token-surface);
257
258
  cursor: pointer;
258
259
  transition: border-color var(--icen-tx-fast);
259
260
  }
260
- .nav-user:hover { border-color: var(--token-accent); }
261
- .nav-user-name {
262
- font-size: var(--density-font-size-sm);
263
- color: var(--token-text);
261
+ .icen-nav-user:hover { border-color: var(--icen-token-accent); }
262
+ .icen-nav-user-name {
263
+ font-size: var(--icen-density-font-size-sm);
264
+ color: var(--icen-token-text);
265
+ }
266
+ .icen-nav-user svg { width: 12px; height: 12px; color: var(--icen-token-text-faint); }
267
+
264
268
  }
265
- .nav-user svg { width: 12px; height: 12px; color: var(--token-text-faint); }