@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,3 +1,4 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: feedback(反馈族)
3
4
  *
@@ -6,49 +7,49 @@
6
7
  */
7
8
 
8
9
  /* ══════════════ alert · 内联横幅 ══════════════ */
9
- .alert {
10
+ .icen-alert {
10
11
  display: flex;
11
12
  align-items: flex-start;
12
- gap: var(--density-space-sm);
13
- padding: var(--density-space-sm);
14
- border-radius: var(--radius-md);
15
- box-shadow: var(--token-shadow-inset);
13
+ gap: var(--icen-density-space-sm);
14
+ padding: var(--icen-density-space-sm);
15
+ border-radius: var(--icen-radius-md);
16
+ box-shadow: var(--icen-token-shadow-inset);
16
17
  border: 1px solid transparent;
17
- font-size: var(--density-font-size-sm);
18
+ font-size: var(--icen-density-font-size-sm);
18
19
  position: relative;
19
20
  overflow: hidden;
20
21
  }
21
- .alert--info { background: var(--token-info-muted); border-color: color-mix(in srgb, var(--token-info) 18%, transparent); }
22
- .alert--success { background: var(--token-success-muted); border-color: color-mix(in srgb, var(--token-success) 18%, transparent); }
23
- .alert--warning { background: var(--token-warning-muted); border-color: color-mix(in srgb, var(--token-warning) 18%, transparent); }
24
- .alert--error { background: var(--token-error-muted); border-color: color-mix(in srgb, var(--token-error) 18%, transparent); }
22
+ .icen-alert--info { background: var(--icen-token-info-muted); border-color: color-mix(in srgb, var(--icen-token-info) 18%, transparent); }
23
+ .icen-alert--success { background: var(--icen-token-success-muted); border-color: color-mix(in srgb, var(--icen-token-success) 18%, transparent); }
24
+ .icen-alert--warning { background: var(--icen-token-warning-muted); border-color: color-mix(in srgb, var(--icen-token-warning) 18%, transparent); }
25
+ .icen-alert--error { background: var(--icen-token-error-muted); border-color: color-mix(in srgb, var(--icen-token-error) 18%, transparent); }
25
26
 
26
- .alert-icon {
27
+ .icen-alert-icon {
27
28
  flex-shrink: 0;
28
29
  margin-top: 1px;
29
30
  display: flex;
30
31
  }
31
- .alert-icon svg { width: 16px; height: 16px; }
32
- .alert--info .alert-icon, .alert--info .alert-title { color: var(--token-info); }
33
- .alert--success .alert-icon, .alert--success .alert-title { color: var(--token-success); }
34
- .alert--warning .alert-icon, .alert--warning .alert-title { color: var(--token-warning); }
35
- .alert--error .alert-icon, .alert--error .alert-title { color: var(--token-error); }
32
+ .icen-alert-icon svg { width: 16px; height: 16px; }
33
+ .icen-alert--info .icen-alert-icon, .icen-alert--info .icen-alert-title { color: var(--icen-token-info); }
34
+ .icen-alert--success .icen-alert-icon, .icen-alert--success .icen-alert-title { color: var(--icen-token-success); }
35
+ .icen-alert--warning .icen-alert-icon, .icen-alert--warning .icen-alert-title { color: var(--icen-token-warning); }
36
+ .icen-alert--error .icen-alert-icon, .icen-alert--error .icen-alert-title { color: var(--icen-token-error); }
36
37
 
37
- .alert-content { flex: 1; min-width: 0; }
38
- .alert-title {
39
- font-size: var(--density-font-size-md);
38
+ .icen-alert-content { flex: 1; min-inline-size: 0; }
39
+ .icen-alert-title {
40
+ font-size: var(--icen-density-font-size-md);
40
41
  font-weight: 500;
41
42
  margin: 0;
42
43
  line-height: 1.4;
43
44
  }
44
- .alert-body {
45
- font-size: var(--density-font-size-sm);
46
- color: var(--token-text-muted);
45
+ .icen-alert-body {
46
+ font-size: var(--icen-density-font-size-sm);
47
+ color: var(--icen-token-text-muted);
47
48
  line-height: 1.5;
48
49
  margin-top: 2px;
49
50
  }
50
- .alert-close {
51
- margin-left: auto;
51
+ .icen-alert-close {
52
+ margin-inline-start: auto;
52
53
  flex-shrink: 0;
53
54
  display: inline-flex;
54
55
  align-items: center;
@@ -57,242 +58,257 @@
57
58
  height: 22px;
58
59
  padding: 0;
59
60
  border: 0;
60
- border-radius: var(--radius-xs);
61
+ border-radius: var(--icen-radius-xs);
61
62
  background: none;
62
- color: var(--token-text-faint);
63
+ color: var(--icen-token-text-faint);
63
64
  cursor: pointer;
64
65
  transition:
66
+ opacity var(--icen-tx-fast),
65
67
  background-color var(--icen-tx-fast),
66
68
  color var(--icen-tx-fast);
67
69
  }
68
- .alert-close:hover {
69
- color: var(--token-text);
70
- background: color-mix(in srgb, var(--token-text) 6%, transparent);
70
+ /* 隐式关闭:可悬停设备上安静待命,悬停/聚焦警示条或键盘落焦即现身;触屏常显 */
71
+ @media (hover: hover) and (pointer: fine) {
72
+ .icen-alert-close { opacity: 0; }
73
+ .icen-alert:hover .icen-alert-close,
74
+ .icen-alert:focus-within .icen-alert-close,
75
+ .icen-alert-close:focus-visible { opacity: 1; }
71
76
  }
72
- .alert-close:focus-visible {
77
+ .icen-alert-close:hover {
78
+ color: var(--icen-token-text);
79
+ background: color-mix(in srgb, var(--icen-token-text) 6%, transparent);
80
+ }
81
+ .icen-alert-close:focus-visible {
73
82
  outline: none;
74
83
  box-shadow: var(--icen-ring);
75
84
  }
76
- .alert-close svg { width: 14px; height: 14px; }
85
+ .icen-alert-close svg { width: 14px; height: 14px; }
86
+ @media (pointer: coarse) {
87
+ /* 触屏命中扩张:视觉 22px 不变,隐形命中区不小于 44px */
88
+ .icen-alert-close { position: relative; }
89
+ .icen-alert-close::after { content: ''; position: absolute; inset: -11px; }
90
+ .icen-alert--inline .icen-alert-close::after { inset: -14px; }
91
+ }
77
92
 
78
93
  /* ══════════════ result · 终态页 ══════════════ */
79
- .result {
94
+ .icen-result {
80
95
  display: flex;
81
96
  flex-direction: column;
82
97
  align-items: center;
83
98
  justify-content: center;
84
99
  text-align: center;
85
- padding: 40px var(--density-space-md);
100
+ padding: 40px var(--icen-density-space-md);
86
101
  }
87
- .result-icon {
102
+ .icen-result-icon {
88
103
  width: 64px;
89
104
  height: 64px;
90
- border-radius: var(--radius-full);
105
+ border-radius: var(--icen-radius-full);
91
106
  display: flex;
92
107
  align-items: center;
93
108
  justify-content: center;
94
- box-shadow: var(--token-shadow-inset);
109
+ box-shadow: var(--icen-token-shadow-inset);
95
110
  border: 1px solid transparent;
96
- margin-bottom: var(--density-space-md);
111
+ margin-bottom: var(--icen-density-space-md);
97
112
  }
98
- .result-icon svg { width: 28px; height: 28px; }
99
- .result--success .result-icon { background: var(--token-success-muted); color: var(--token-success); border-color: color-mix(in srgb, var(--token-success) 12%, transparent); }
100
- .result--error .result-icon { background: var(--token-error-muted); color: var(--token-error); border-color: color-mix(in srgb, var(--token-error) 12%, transparent); }
101
- .result--warning .result-icon { background: var(--token-warning-muted); color: var(--token-warning); border-color: color-mix(in srgb, var(--token-warning) 12%, transparent); }
102
- .result--info .result-icon { background: var(--token-info-muted); color: var(--token-info); border-color: color-mix(in srgb, var(--token-info) 12%, transparent); }
113
+ .icen-result-icon svg { width: 28px; height: 28px; }
114
+ .icen-result--success .icen-result-icon { background: var(--icen-token-success-muted); color: var(--icen-token-success); border-color: color-mix(in srgb, var(--icen-token-success) 12%, transparent); }
115
+ .icen-result--error .icen-result-icon { background: var(--icen-token-error-muted); color: var(--icen-token-error); border-color: color-mix(in srgb, var(--icen-token-error) 12%, transparent); }
116
+ .icen-result--warning .icen-result-icon { background: var(--icen-token-warning-muted); color: var(--icen-token-warning); border-color: color-mix(in srgb, var(--icen-token-warning) 12%, transparent); }
117
+ .icen-result--info .icen-result-icon { background: var(--icen-token-info-muted); color: var(--icen-token-info); border-color: color-mix(in srgb, var(--icen-token-info) 12%, transparent); }
103
118
 
104
- .result-title {
105
- font-size: var(--density-font-size-lg);
119
+ .icen-result-title {
120
+ font-size: var(--icen-density-font-size-lg);
106
121
  font-weight: 600;
107
- color: var(--token-text);
122
+ color: var(--icen-token-text);
108
123
  margin: 0;
109
- font-family: var(--font-heading);
124
+ font-family: var(--icen-font-heading);
110
125
  line-height: 1.3;
111
126
  }
112
- .result-desc {
113
- font-size: var(--density-font-size-sm);
114
- color: var(--token-text-muted);
115
- margin: var(--density-space-xs) 0 0;
127
+ .icen-result-desc {
128
+ font-size: var(--icen-density-font-size-sm);
129
+ color: var(--icen-token-text-muted);
130
+ margin: var(--icen-density-space-xs) 0 0;
116
131
  max-width: 360px;
117
132
  line-height: 1.5;
118
133
  }
119
- .result-extra {
134
+ .icen-result-extra {
120
135
  display: flex;
121
136
  align-items: center;
122
- gap: var(--density-space-sm);
123
- margin-top: var(--density-space-md);
137
+ gap: var(--icen-density-space-sm);
138
+ margin-top: var(--icen-density-space-md);
124
139
  }
125
140
 
126
141
  /* ══════════════ progress · 线性进度 ══════════════ */
127
- .progress {
142
+ .icen-progress {
128
143
  display: flex;
144
+ align-self: stretch; /* 宽度自稳定契约:shrink-wrap 宿主(flex/grid 居中)下不塌成 min-content */
129
145
  align-items: center;
130
- gap: var(--density-space-sm);
146
+ gap: var(--icen-density-space-sm);
131
147
  }
132
- .progress-track {
148
+ .icen-progress-track {
133
149
  flex: 1;
134
150
  height: 6px;
135
151
  overflow: hidden;
136
- border-radius: var(--radius-full);
137
- background: color-mix(in srgb, var(--token-line-soft) 40%, transparent);
152
+ border-radius: var(--icen-radius-full);
153
+ background: color-mix(in srgb, var(--icen-token-line-soft) 40%, transparent);
138
154
  }
139
- .progress-bar {
155
+ .icen-progress-bar {
140
156
  height: 100%;
141
- border-radius: var(--radius-full);
142
- background: var(--token-accent);
157
+ border-radius: var(--icen-radius-full);
158
+ background: var(--icen-token-accent);
143
159
  transition: width var(--icen-tx-slow);
144
160
  }
145
- .progress--success .progress-bar { background: var(--token-success); }
146
- .progress--warning .progress-bar { background: var(--token-warning); }
147
- .progress--error .progress-bar { background: var(--token-error); }
161
+ .icen-progress--success .icen-progress-bar { background: var(--icen-token-success); }
162
+ .icen-progress--warning .icen-progress-bar { background: var(--icen-token-warning); }
163
+ .icen-progress--error .icen-progress-bar { background: var(--icen-token-error); }
148
164
 
149
165
  /* 不定进度(spinner 替代品):bar 来回扫动 */
150
- .progress--indeterminate .progress-bar {
151
- width: 35% !important;
152
- animation: progress-sweep var(--progress-sweep-duration, 1.4s) var(--ease-in-out, var(--ease-out)) infinite;
166
+ .icen-progress--indeterminate .icen-progress-bar {
167
+ width: 35% !important; /* guard:allow-important 状态/守卫覆盖需压制变体优先级 */
168
+ animation: progress-sweep var(--progress-sweep-duration, 1.4s) var(--icen-ease-in-out, var(--icen-ease-out)) infinite;
153
169
  }
154
170
  @keyframes progress-sweep {
155
171
  0% { transform: translateX(-100%); }
156
172
  100% { transform: translateX(300%); }
157
173
  }
158
174
 
159
- .progress--sm .progress-track { height: 4px; }
160
- .progress--lg .progress-track { height: 8px; }
161
- .progress-label {
162
- font-size: var(--density-font-size-xs);
163
- color: var(--token-text-muted);
175
+ .icen-progress--sm .icen-progress-track { height: 4px; }
176
+ .icen-progress--lg .icen-progress-track { height: 8px; }
177
+ .icen-progress-label {
178
+ font-size: var(--icen-density-font-size-xs);
179
+ color: var(--icen-token-text-muted);
164
180
  font-variant-numeric: tabular-nums;
165
181
  flex-shrink: 0;
166
182
  }
167
183
 
168
184
  /* ══════════════ spinner · 加载圈 ══════════════ */
169
- .spinner {
185
+ .icen-spinner {
170
186
  display: inline-block;
171
187
  width: 20px;
172
188
  height: 20px;
173
- border: 2px solid color-mix(in srgb, var(--token-accent) 30%, transparent);
174
- border-top-color: var(--token-accent);
175
- border-radius: var(--radius-full);
189
+ border: 2px solid color-mix(in srgb, var(--icen-token-accent) 30%, transparent);
190
+ border-top-color: var(--icen-token-accent);
191
+ border-radius: var(--icen-radius-full);
176
192
  animation: icen-spin var(--spinner-duration, 0.8s) linear infinite;
177
193
  }
178
- .spinner--sm { width: 14px; height: 14px; border-width: 2px; }
179
- .spinner--lg { width: 32px; height: 32px; border-width: 3px; }
180
- .spinner--success { border-color: color-mix(in srgb, var(--token-success) 30%, transparent); border-top-color: var(--token-success); }
181
- .spinner--error { border-color: color-mix(in srgb, var(--token-error) 30%, transparent); border-top-color: var(--token-error); }
182
- .spinner--muted { border-color: color-mix(in srgb, var(--token-text-faint) 30%, transparent); border-top-color: var(--token-text-faint); }
194
+ .icen-spinner--sm { width: 14px; height: 14px; border-width: 2px; }
195
+ .icen-spinner--lg { width: 32px; height: 32px; border-width: 3px; }
196
+ .icen-spinner--success { border-color: color-mix(in srgb, var(--icen-token-success) 30%, transparent); border-top-color: var(--icen-token-success); }
197
+ .icen-spinner--error { border-color: color-mix(in srgb, var(--icen-token-error) 30%, transparent); border-top-color: var(--icen-token-error); }
198
+ .icen-spinner--muted { border-color: color-mix(in srgb, var(--icen-token-text-faint) 30%, transparent); border-top-color: var(--icen-token-text-faint); }
183
199
 
184
200
  /* 文字+spinner 组合 */
185
- .spinner-wrap {
201
+ .icen-spinner-wrap {
186
202
  display: inline-flex;
187
203
  align-items: center;
188
- gap: var(--density-space-xs);
189
- font-size: var(--density-font-size-sm);
190
- color: var(--token-text-muted);
204
+ gap: var(--icen-density-space-xs);
205
+ font-size: var(--icen-density-font-size-sm);
206
+ color: var(--icen-token-text-muted);
191
207
  }
192
208
 
193
209
  /* ══════════════ skeleton · 占位块 ══════════════ */
194
- .skeleton {
210
+ .icen-skeleton {
195
211
  display: block;
196
- background: color-mix(in srgb, var(--token-text) 8%, transparent);
197
- border-radius: var(--radius-sm);
212
+ background: color-mix(in srgb, var(--icen-token-text) 8%, transparent);
213
+ border-radius: var(--icen-radius-sm);
198
214
  animation: icen-skeleton-pulse var(--skeleton-duration, 2s) ease-in-out infinite;
199
215
  }
200
- .skeleton--circle { border-radius: var(--radius-full); }
201
- .skeleton--text {
216
+ .icen-skeleton--circle { border-radius: var(--icen-radius-full); }
217
+ .icen-skeleton--text {
202
218
  height: 0.85em;
203
219
  margin: 0.25em 0;
204
220
  }
205
- .skeleton--text:last-child { width: 60%; }
221
+ .icen-skeleton--text:last-child { width: 60%; }
206
222
 
207
223
  /* ── alert 增强 ── */
208
224
 
209
225
  /* 可操作横幅(含按钮) */
210
- .alert-actions {
226
+ .icen-alert-actions {
211
227
  display: flex;
212
- gap: var(--density-space-xs);
213
- margin-top: var(--density-space-xs);
228
+ gap: var(--icen-density-space-xs);
229
+ margin-top: var(--icen-density-space-xs);
214
230
  }
215
- .alert--banner {
231
+ .icen-alert--banner {
216
232
  border-radius: 0;
217
- border-left: none;
218
- border-right: none;
233
+ border-inline-start: none;
234
+ border-inline-end: none;
219
235
  border-top: none;
220
236
  }
221
- .alert--inline {
237
+ .icen-alert--inline {
222
238
  display: inline-flex;
223
- padding: 2px var(--density-space-sm);
224
- font-size: var(--density-font-size-xs);
239
+ padding: 2px var(--icen-density-space-sm);
240
+ font-size: var(--icen-density-font-size-xs);
225
241
  }
226
- .alert--inline .alert-close { width: 16px; height: 16px; }
242
+ .icen-alert--inline .icen-alert-close { width: 16px; height: 16px; }
227
243
 
228
244
  /* ── result 增强 ── */
229
- .result-list {
230
- margin: var(--density-space-sm) 0 0;
231
- padding: var(--density-space-sm);
232
- background: var(--token-bg-soft);
233
- border-radius: var(--radius-md);
234
- font-size: var(--density-font-size-sm);
235
- color: var(--token-text-muted);
236
- text-align: left;
237
- max-width: 400px;
238
- max-height: 200px;
245
+ .icen-result-list {
246
+ margin: var(--icen-density-space-sm) 0 0;
247
+ padding: var(--icen-density-space-sm);
248
+ background: var(--icen-token-bg-soft);
249
+ border-radius: var(--icen-radius-md);
250
+ font-size: var(--icen-density-font-size-sm);
251
+ color: var(--icen-token-text-muted);
252
+ text-align: start;
253
+ max-inline-size: 400px;
254
+ max-block-size: 200px;
239
255
  overflow-y: auto;
240
256
  }
241
- .result-list-item {
257
+ .icen-result-list-item {
242
258
  display: flex;
243
259
  align-items: flex-start;
244
- gap: var(--density-space-xs);
260
+ gap: var(--icen-density-space-xs);
245
261
  padding: 2px 0;
246
262
  font-variant-numeric: tabular-nums;
247
263
  word-break: break-all;
248
264
  }
249
265
 
250
266
  /* ── progress 环形 ── */
251
- .progress-ring-wrap {
267
+ .icen-progress-ring-wrap {
252
268
  display: inline-flex;
253
269
  align-items: center;
254
270
  justify-content: center;
255
271
  position: relative;
256
272
  }
257
- .progress-ring {
273
+ .icen-progress-ring {
258
274
  transform: rotate(-90deg);
259
275
  }
260
- .progress-ring-track {
276
+ .icen-progress-ring-track {
261
277
  fill: none;
262
- stroke: var(--token-fill-2);
278
+ stroke: var(--icen-token-fill-2);
263
279
  stroke-width: 4;
264
280
  }
265
- .progress-ring-fill {
281
+ .icen-progress-ring-fill {
266
282
  fill: none;
267
- stroke: var(--token-accent);
283
+ stroke: var(--icen-token-accent);
268
284
  stroke-width: 4;
269
285
  stroke-linecap: round;
270
- transition: stroke-dashoffset var(--icen-tx-slow) var(--ease-out);
286
+ transition: stroke-dashoffset var(--icen-tx-slow) var(--icen-ease-out);
271
287
  }
272
- .progress-ring-text {
288
+ .icen-progress-ring-text {
273
289
  position: absolute;
274
- font-size: var(--density-font-size-sm);
290
+ font-size: var(--icen-density-font-size-sm);
275
291
  font-weight: 600;
276
292
  font-variant-numeric: tabular-nums;
277
- color: var(--token-text);
278
- }
279
- .progress-ring--sm .progress-ring-track,
280
- .progress-ring--sm .progress-ring-fill { stroke-width: 3; }
281
- .progress-ring--lg .progress-ring-track,
282
- .progress-ring--lg .progress-ring-fill { stroke-width: 6; }
283
- .progress-ring--success .progress-ring-fill { stroke: var(--token-success); }
284
- .progress-ring--warning .progress-ring-fill { stroke: var(--token-warning); }
285
- .progress-ring--error .progress-ring-fill { stroke: var(--token-error); }
293
+ color: var(--icen-token-text);
294
+ }
295
+ .icen-progress-ring--sm .icen-progress-ring-track,
296
+ .icen-progress-ring--sm .icen-progress-ring-fill { stroke-width: 3; }
297
+ .icen-progress-ring--lg .icen-progress-ring-track,
298
+ .icen-progress-ring--lg .icen-progress-ring-fill { stroke-width: 6; }
299
+ .icen-progress-ring--success .icen-progress-ring-fill { stroke: var(--icen-token-success); }
300
+ .icen-progress-ring--warning .icen-progress-ring-fill { stroke: var(--icen-token-warning); }
301
+ .icen-progress-ring--error .icen-progress-ring-fill { stroke: var(--icen-token-error); }
286
302
 
287
303
  /* progress 条纹动画 */
288
- .progress--striped .progress-bar {
304
+ .icen-progress--striped .icen-progress-bar {
289
305
  background-image: linear-gradient(
290
306
  45deg,
291
- color-mix(in srgb, var(--token-card-strong) 20%, transparent) 25%,
307
+ color-mix(in srgb, var(--icen-token-card-strong) 20%, transparent) 25%,
292
308
  transparent 25%,
293
309
  transparent 50%,
294
- color-mix(in srgb, var(--token-card-strong) 20%, transparent) 50%,
295
- color-mix(in srgb, var(--token-card-strong) 20%, transparent) 75%,
310
+ color-mix(in srgb, var(--icen-token-card-strong) 20%, transparent) 50%,
311
+ color-mix(in srgb, var(--icen-token-card-strong) 20%, transparent) 75%,
296
312
  transparent 75%,
297
313
  transparent
298
314
  );
@@ -305,16 +321,16 @@
305
321
  }
306
322
 
307
323
  /* progress 渐变 */
308
- .progress--gradient .progress-bar {
324
+ .icen-progress--gradient .icen-progress-bar {
309
325
  background: linear-gradient(90deg,
310
- var(--token-accent),
311
- color-mix(in srgb, var(--token-accent) 60%, var(--token-info)));
326
+ var(--icen-token-accent),
327
+ color-mix(in srgb, var(--icen-token-accent) 60%, var(--icen-token-info)));
312
328
  }
313
329
 
314
330
  /* ── spinner 变体 ── */
315
331
 
316
332
  /* 点阵 spinner */
317
- .spinner--dots {
333
+ .icen-spinner--dots {
318
334
  width: auto;
319
335
  height: auto;
320
336
  border: none;
@@ -323,23 +339,23 @@
323
339
  background: none;
324
340
  animation: none;
325
341
  }
326
- .spinner--dots span {
342
+ .icen-spinner--dots span {
327
343
  display: block;
328
344
  width: 6px;
329
345
  height: 6px;
330
- border-radius: var(--radius-full);
331
- background: var(--token-accent);
346
+ border-radius: var(--icen-radius-full);
347
+ background: var(--icen-token-accent);
332
348
  animation: spinner-dot var(--spinner-dots-duration, 1.4s) ease-in-out infinite;
333
349
  }
334
- .spinner--dots span:nth-child(2) { animation-delay: 0.2s; }
335
- .spinner--dots span:nth-child(3) { animation-delay: 0.4s; }
350
+ .icen-spinner--dots span:nth-child(2) { animation-delay: 0.2s; }
351
+ .icen-spinner--dots span:nth-child(3) { animation-delay: 0.4s; }
336
352
  @keyframes spinner-dot {
337
353
  0%, 80%, 100% { opacity: 0.3; transform: scale(0.8); }
338
354
  40% { opacity: 1; transform: scale(1); }
339
355
  }
340
356
 
341
357
  /* 条形 spinner */
342
- .spinner--bars {
358
+ .icen-spinner--bars {
343
359
  width: auto;
344
360
  height: auto;
345
361
  border: none;
@@ -349,82 +365,82 @@
349
365
  background: none;
350
366
  animation: none;
351
367
  }
352
- .spinner--bars span {
368
+ .icen-spinner--bars span {
353
369
  display: block;
354
370
  width: 3px;
355
371
  height: 100%;
356
- background: var(--token-accent);
357
- border-radius: 1px;
372
+ background: var(--icen-token-accent);
373
+ border-radius: 1px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
358
374
  animation: spinner-bar var(--spinner-bars-duration, 1s) ease-in-out infinite;
359
375
  }
360
- .spinner--bars span:nth-child(2) { animation-delay: 0.1s; }
361
- .spinner--bars span:nth-child(3) { animation-delay: 0.2s; }
362
- .spinner--bars span:nth-child(4) { animation-delay: 0.3s; }
376
+ .icen-spinner--bars span:nth-child(2) { animation-delay: 0.1s; }
377
+ .icen-spinner--bars span:nth-child(3) { animation-delay: 0.2s; }
378
+ .icen-spinner--bars span:nth-child(4) { animation-delay: 0.3s; }
363
379
  @keyframes spinner-bar {
364
380
  0%, 100% { transform: scaleY(0.4); }
365
381
  50% { transform: scaleY(1); }
366
382
  }
367
383
 
368
384
  /* 全屏遮罩 spinner */
369
- .spinner-overlay {
385
+ .icen-spinner-overlay {
370
386
  position: fixed;
371
387
  inset: 0;
372
- z-index: var(--z-dialog);
388
+ z-index: var(--icen-z-dialog);
373
389
  display: flex;
374
390
  align-items: center;
375
391
  justify-content: center;
376
- background: color-mix(in srgb, var(--token-card-strong) 70%, transparent);
392
+ background: color-mix(in srgb, var(--icen-token-card-strong) 70%, transparent);
377
393
  backdrop-filter: blur(2px);
378
394
  -webkit-backdrop-filter: blur(2px);
379
395
  flex-direction: column;
380
- gap: var(--density-space-md);
396
+ gap: var(--icen-density-space-md);
381
397
  }
382
- .spinner-overlay-text {
383
- font-size: var(--density-font-size-sm);
384
- color: var(--token-text-muted);
398
+ .icen-spinner-overlay-text {
399
+ font-size: var(--icen-density-font-size-sm);
400
+ color: var(--icen-token-text-muted);
385
401
  }
386
402
 
387
403
  /* ── skeleton 复合体 ── */
388
404
 
389
405
  /* 骨架文本(多行模拟) */
390
- .skeleton-text-group {
406
+ .icen-skeleton-text-group {
391
407
  display: flex;
392
408
  flex-direction: column;
393
- gap: var(--density-space-xs);
409
+ gap: var(--icen-density-space-xs);
394
410
  flex: 1;
395
411
  }
396
412
 
397
413
  /* 头像 + 文本行组合(评论/消息占位) */
398
- .skeleton-media {
414
+ .icen-skeleton-media {
399
415
  display: flex;
400
416
  align-items: center;
401
- gap: var(--density-space-sm);
417
+ gap: var(--icen-density-space-sm);
402
418
  }
403
419
 
404
420
  /* 表格骨架 */
405
- .skeleton-table {
421
+ .icen-skeleton-table {
406
422
  display: flex;
407
423
  flex-direction: column;
408
- gap: var(--density-space-sm);
424
+ gap: var(--icen-density-space-sm);
409
425
  }
410
- .skeleton-table-row {
426
+ .icen-skeleton-table-row {
411
427
  display: flex;
412
- gap: var(--density-space-sm);
428
+ gap: var(--icen-density-space-sm);
413
429
  }
414
- .skeleton-table-row > * {
430
+ .icen-skeleton-table-row > * {
415
431
  height: 12px;
416
- border-radius: var(--radius-xs);
417
- background: color-mix(in srgb, var(--token-text) 8%, transparent);
432
+ border-radius: var(--icen-radius-xs);
433
+ background: color-mix(in srgb, var(--icen-token-text) 8%, transparent);
418
434
  animation: icen-skeleton-pulse var(--skeleton-duration, 2s) ease-in-out infinite;
419
435
  }
420
436
 
421
437
  /* 骨架波纹变体(shimmer,区别于 pulse) */
422
- .skeleton--shimmer {
438
+ .icen-skeleton--shimmer {
423
439
  background: linear-gradient(
424
440
  90deg,
425
- color-mix(in srgb, var(--token-text) 6%, transparent) 0%,
426
- color-mix(in srgb, var(--token-text) 12%, transparent) 50%,
427
- color-mix(in srgb, var(--token-text) 6%, transparent) 100%
441
+ color-mix(in srgb, var(--icen-token-text) 6%, transparent) 0%,
442
+ color-mix(in srgb, var(--icen-token-text) 12%, transparent) 50%,
443
+ color-mix(in srgb, var(--icen-token-text) 6%, transparent) 100%
428
444
  );
429
445
  background-size: 200% 100%;
430
446
  animation: skeleton-shimmer var(--skeleton-shimmer-duration, 1.5s) ease-in-out infinite;
@@ -435,14 +451,16 @@
435
451
  }
436
452
 
437
453
  @media (prefers-reduced-motion: reduce) {
438
- .progress-bar { transition: none; }
439
- .progress--indeterminate .progress-bar { animation: none; width: 100% !important; }
440
- .progress--striped .progress-bar { animation: none; }
441
- .progress-ring-fill { transition: none; }
442
- .spinner { --spinner-duration: 2s; }
443
- .spinner--dots span,
444
- .spinner--bars span { animation: none; }
445
- .skeleton,
446
- .skeleton-table-row > * { animation: none; opacity: 0.6; }
447
- .skeleton--shimmer { animation: none; }
454
+ .icen-progress-bar { transition: none; }
455
+ .icen-progress--indeterminate .icen-progress-bar { animation: none; width: 100% !important; /* guard:allow-important 动效守卫:降级媒体查询需压制组件动画 */ }
456
+ .icen-progress--striped .icen-progress-bar { animation: none; }
457
+ .icen-progress-ring-fill { transition: none; }
458
+ .icen-spinner { --spinner-duration: 2s; }
459
+ .icen-spinner--dots span,
460
+ .icen-spinner--bars span { animation: none; }
461
+ .icen-skeleton,
462
+ .icen-skeleton-table-row > * { animation: none; opacity: 0.6; }
463
+ .icen-skeleton--shimmer { animation: none; }
464
+ }
465
+
448
466
  }