@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,70 +1,82 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: popover(锚定浮层,与 behaviors/popover 配套)
3
4
  *
4
5
  * 完整契约:
5
- * <button class="popover-trigger pressable" data-popover-target="id" aria-haspopup="dialog">…</button>
6
- * <div class="popover [--sm|--lg]" id="id" data-side="top|bottom|left|right" role="dialog" hidden>
7
- * <div class="popover-header"> 可选
8
- * <h3 class="popover-title">…</h3>
9
- * <button class="popover-close" aria-label="关闭">…</button>
6
+ * <button class="popover-trigger icen-pressable" data-icen-popover-target="id" aria-haspopup="dialog">…</button>
7
+ * <div class="icen-popover [--sm|--lg]" id="id" data-icen-side="top|bottom|left|right" role="dialog" hidden>
8
+ * <div class="icen-popover-header"> 可选
9
+ * <h3 class="icen-popover-title">…</h3>
10
+ * <button class="icen-popover-close" aria-label="关闭">…</button>
10
11
  * </div>
11
- * <div class="popover-body">…</div>
12
- * <div class="popover-footer"> 可选
13
- * <button class="btn">取消</button>
12
+ * <div class="icen-popover-body">…</div>
13
+ * <div class="icen-popover-footer"> 可选
14
+ * <button class="icen-btn">取消</button>
14
15
  * </div>
15
16
  * </div>
16
17
  *
17
- * behavior:面板 portal 到 document.body 按 fixed 定位;data-side 由布局函数写入;
18
- * ESC / 外部点击关闭;焦点 trap 可选。
18
+ * behavior:面板 portal 到 document.body 按 fixed 定位;data-icen-side 由布局函数写入;
19
+ * ESC / 外部点击关闭;initPopover() 提供 data-icen-popover-target 声明式委托;
20
+ * 退场为淡出过渡([data-icen-state='closing']),重开从当前位置续接。
19
21
  */
20
22
 
21
- .popover {
23
+ .icen-popover {
22
24
  position: fixed;
23
- z-index: var(--z-popover);
24
- min-width: 200px;
25
- max-width: min(360px, calc(100vw - 32px));
26
- padding: var(--density-space-sm);
27
- background: var(--token-card-strong);
28
- color: var(--token-text);
29
- border: 1px solid var(--token-outline);
30
- box-shadow: var(--token-shadow-overlay);
31
- border-radius: var(--radius-lg);
25
+ z-index: var(--icen-z-popover);
26
+ min-inline-size: 200px;
27
+ max-inline-size: min(360px, calc(100vw - 32px));
28
+ padding: var(--icen-density-space-sm);
29
+ background: var(--icen-token-card-strong);
30
+ color: var(--icen-token-text);
31
+ border: 1px solid var(--icen-token-outline);
32
+ box-shadow: var(--icen-token-shadow-overlay);
33
+ border-radius: var(--icen-radius-lg);
32
34
  animation: icen-popover-in var(--icen-tx-fast);
33
35
  transform-origin: top center;
36
+ /* 退场走过渡(可中断回弹);与菜单同收敛配方 */
37
+ transition:
38
+ opacity var(--icen-tx-fast) var(--icen-ease-out),
39
+ transform var(--icen-tx-fast) var(--icen-ease-out);
40
+ }
41
+ .icen-popover[data-icen-state='closing'] {
42
+ animation: none; /* 打断可能仍在跑的进场 */
43
+ pointer-events: none;
44
+ opacity: 0;
45
+ transform: scale(0.99);
34
46
  }
35
- .popover[data-side='top'] {
47
+ .icen-popover[data-icen-side='top'] {
36
48
  animation-name: icen-popover-in-top;
37
49
  transform-origin: bottom center;
38
50
  }
39
- .popover[data-side='left'] {
51
+ .icen-popover[data-icen-side='left'] {
40
52
  animation-name: icen-popover-in-left;
41
53
  transform-origin: right center;
42
54
  }
43
- .popover[data-side='right'] {
55
+ .icen-popover[data-icen-side='right'] {
44
56
  animation-name: icen-popover-in-right;
45
57
  transform-origin: left center;
46
58
  }
47
59
 
48
- .popover--sm { min-width: 160px; max-width: 240px; }
49
- .popover--lg { min-width: 280px; max-width: min(480px, calc(100vw - 32px)); }
60
+ .icen-popover--sm { min-inline-size: 160px; max-inline-size: 240px; }
61
+ .icen-popover--lg { min-inline-size: 280px; max-inline-size: min(480px, calc(100vw - 32px)); }
50
62
 
51
- .popover-header {
63
+ .icen-popover-header {
52
64
  display: flex;
53
65
  align-items: flex-start;
54
66
  justify-content: space-between;
55
- gap: var(--density-space-sm);
56
- padding: var(--density-space-xs) var(--density-space-xs) var(--density-space-sm);
57
- border-bottom: 1px solid var(--token-line-soft);
58
- margin-bottom: var(--density-space-sm);
67
+ gap: var(--icen-density-space-sm);
68
+ padding: var(--icen-density-space-xs) var(--icen-density-space-xs) var(--icen-density-space-sm);
69
+ border-bottom: 1px solid var(--icen-token-line-soft);
70
+ margin-bottom: var(--icen-density-space-sm);
59
71
  }
60
- .popover-title {
72
+ .icen-popover-title {
61
73
  margin: 0;
62
- font-size: var(--density-font-size-sm);
74
+ font-size: var(--icen-density-font-size-sm);
63
75
  font-weight: 600;
64
- font-family: var(--font-heading);
76
+ font-family: var(--icen-font-heading);
65
77
  line-height: 1.3;
66
78
  }
67
- .popover-close {
79
+ .icen-popover-close {
68
80
  display: inline-flex;
69
81
  align-items: center;
70
82
  justify-content: center;
@@ -74,54 +86,56 @@
74
86
  border: none;
75
87
  background: transparent;
76
88
  cursor: pointer;
77
- color: var(--token-text-faint);
78
- border-radius: var(--radius-sm);
89
+ color: var(--icen-token-text-faint);
90
+ border-radius: var(--icen-radius-sm);
79
91
  flex-shrink: 0;
80
92
  transition:
81
93
  background-color var(--icen-tx-fast),
82
94
  color var(--icen-tx-fast);
83
95
  }
84
- .popover-close:hover {
85
- background: var(--token-surface-hover);
86
- color: var(--token-text);
96
+ .icen-popover-close:hover {
97
+ background: var(--icen-token-surface-hover);
98
+ color: var(--icen-token-text);
87
99
  }
88
- .popover-close:focus-visible {
100
+ .icen-popover-close:focus-visible {
89
101
  outline: none;
90
102
  box-shadow: var(--icen-ring);
91
103
  }
92
104
 
93
- .popover-body {
94
- font-size: var(--density-font-size-sm);
105
+ .icen-popover-body {
106
+ font-size: var(--icen-density-font-size-sm);
95
107
  line-height: 1.5;
96
108
  }
97
109
 
98
- .popover-footer {
110
+ .icen-popover-footer {
99
111
  display: flex;
100
112
  justify-content: flex-end;
101
- gap: var(--density-space-xs);
102
- margin-top: var(--density-space-sm);
103
- padding-top: var(--density-space-sm);
104
- border-top: 1px solid var(--token-line-soft);
113
+ gap: var(--icen-density-space-xs);
114
+ margin-top: var(--icen-density-space-sm);
115
+ padding-top: var(--icen-density-space-sm);
116
+ border-top: 1px solid var(--icen-token-line-soft);
105
117
  }
106
118
 
107
- /* ── 进场动画(按侧别反向位移 8px) ── */
119
+ /* ── 进场动画(与菜单同配方:fade + scale(.985),按侧别反向位移 3px) ── */
108
120
  @keyframes icen-popover-in {
109
- from { opacity: 0; transform: scale(0.95) translateY(-8px); }
121
+ from { opacity: 0; transform: scale(0.985) translateY(-3px); }
110
122
  to { opacity: 1; transform: scale(1) translateY(0); }
111
123
  }
112
124
  @keyframes icen-popover-in-top {
113
- from { opacity: 0; transform: scale(0.95) translateY(8px); }
125
+ from { opacity: 0; transform: scale(0.985) translateY(3px); }
114
126
  to { opacity: 1; transform: scale(1) translateY(0); }
115
127
  }
116
128
  @keyframes icen-popover-in-left {
117
- from { opacity: 0; transform: scale(0.95) translateX(8px); }
129
+ from { opacity: 0; transform: scale(0.985) translateX(3px); }
118
130
  to { opacity: 1; transform: scale(1) translateX(0); }
119
131
  }
120
132
  @keyframes icen-popover-in-right {
121
- from { opacity: 0; transform: scale(0.95) translateX(-8px); }
133
+ from { opacity: 0; transform: scale(0.985) translateX(-3px); }
122
134
  to { opacity: 1; transform: scale(1) translateX(0); }
123
135
  }
124
136
 
125
137
  @media (prefers-reduced-motion: reduce) {
126
- .popover { animation: none; }
138
+ .icen-popover { animation: none; transition: none; }
139
+ }
140
+
127
141
  }
@@ -1,112 +1,115 @@
1
- /*
2
- * @icen.ai/ui — Component: scroll-area(自定义滚动容器)
3
- *
4
- * 全局 base.css 已经提供细薄滚动条(所有元素默认生效)。
5
- * 本组件提供"显式带视觉边界的滚动区"——常用于:
6
- * - 侧边栏长列表
7
- * - 下拉面板内的滚动区
8
- * - 需要限定高度并强调"这里可以滚"的容器
9
- *
10
- * 完整契约:
11
- * <div class="scroll-area [--sm|--lg] [--both]">
12
- * 任意超长内容…
13
- * </div>
14
- *
15
- * 横向专用:<div class="scroll-area scroll-area--x">…</div>
16
- * 垂直专用:<div class="scroll-area scroll-area--y">…</div>
17
- *
18
- * 变体:
19
- * --x 仅横向滚动(纵向裁剪)
20
- * --y 仅纵向滚动(横向裁剪)
21
- * --both 双向滚动
22
- * --sm 窄滚动条(6px 宽)
23
- * --lg 正常滚动条(10px 宽,默认 8px)
24
- * --inset 内嵌阴影式(类似 code 编辑器)
25
- */
1
+ @layer icen.components {
2
+ /*
3
+ * @icen.ai/ui — Component: scroll-area(自定义滚动容器)
4
+ *
5
+ * 全局 base.css 已经提供细薄滚动条(所有元素默认生效)。
6
+ * 本组件提供"显式带视觉边界的滚动区"——常用于:
7
+ * - 侧边栏长列表
8
+ * - 下拉面板内的滚动区
9
+ * - 需要限定高度并强调"这里可以滚"的容器
10
+ *
11
+ * 完整契约:
12
+ * <div class="icen-scroll-area [--sm|--lg] [--both]">
13
+ * 任意超长内容…
14
+ * </div>
15
+ *
16
+ * 横向专用:<div class="icen-scroll-area icen-scroll-area--x">…</div>
17
+ * 垂直专用:<div class="icen-scroll-area icen-scroll-area--y">…</div>
18
+ *
19
+ * 变体:
20
+ * --x 仅横向滚动(纵向裁剪)
21
+ * --y 仅纵向滚动(横向裁剪)
22
+ * --both 双向滚动
23
+ * --sm 窄滚动条(6px 宽)
24
+ * --lg 正常滚动条(10px 宽,默认 8px)
25
+ * --inset 内嵌阴影式(类似 code 编辑器)
26
+ */
27
+
28
+ .icen-scroll-area {
29
+ overflow: auto;
30
+ overscroll-behavior: contain;
31
+ -webkit-overflow-scrolling: touch;
32
+ scroll-behavior: smooth;
33
+ }
34
+
35
+ .icen-scroll-area--x { overflow-x: auto; overflow-y: hidden; }
36
+ .icen-scroll-area--y { overflow-x: hidden; overflow-y: auto; }
37
+ .icen-scroll-area--both { overflow: auto; }
38
+
39
+ /* ── 尺寸变体:覆盖全局滚动条宽度 ── */
40
+ .icen-scroll-area--sm {
41
+ scrollbar-width: thin;
42
+ }
43
+ .icen-scroll-area--sm::-webkit-scrollbar {
44
+ width: 6px;
45
+ height: 6px;
46
+ }
47
+ .icen-scroll-area--sm::-webkit-scrollbar-thumb {
48
+ background: color-mix(in srgb, var(--icen-token-text-faint) 28%, transparent);
49
+ border-radius: 3px;
26
50
  /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
51
+ border: 0;
52
+ }
53
+
54
+ .icen-scroll-area--lg {
55
+ scrollbar-width: auto;
56
+ }
57
+ .icen-scroll-area--lg::-webkit-scrollbar {
58
+ width: 12px;
59
+ height: 12px;
60
+ }
61
+ .icen-scroll-area--lg::-webkit-scrollbar-thumb {
62
+ background: color-mix(in srgb, var(--icen-token-text-faint) 35%, transparent);
63
+ border-radius: var(--icen-radius-xs);
64
+ border: 2px solid transparent;
65
+ background-clip: padding-box;
66
+ }
67
+ .icen-scroll-area--lg::-webkit-scrollbar-thumb:hover {
68
+ background: color-mix(in srgb, var(--icen-token-text-faint) 50%, transparent);
69
+ background-clip: padding-box;
70
+ }
71
+
72
+ /* ── 内嵌变体:带视觉边界 ── */
73
+ .icen-scroll-area--inset {
74
+ background: var(--icen-token-bg-soft);
75
+ border: 1px solid var(--icen-token-line-soft);
76
+ border-radius: var(--icen-radius-md);
77
+ box-shadow: var(--icen-token-shadow-inset);
78
+ padding: var(--icen-density-space-sm);
79
+ }
80
+ .icen-scroll-area--inset:focus-visible {
81
+ outline: none;
82
+ border-color: var(--icen-control-focus-border);
83
+ box-shadow: var(--icen-control-focus-shadow);
84
+ }
85
+
86
+ /* ── 渐隐遮罩(可选):上下边缘渐隐,暗示可滚动 ── */
87
+ .icen-scroll-area--fade {
88
+ -webkit-mask-image: linear-gradient(
89
+ to bottom,
90
+ transparent 0,
91
+ transparent 0,
92
+ #000 var(--icen-density-space-sm),
93
+ #000 calc(100% - var(--icen-density-space-sm)),
94
+ transparent 100%
95
+ );
96
+ mask-image: linear-gradient(
97
+ to bottom,
98
+ transparent 0,
99
+ #000 var(--icen-density-space-sm),
100
+ #000 calc(100% - var(--icen-density-space-sm)),
101
+ transparent 100%
102
+ );
103
+ }
104
+
105
+ /* ── 可被键盘聚焦的滚动容器 ── */
106
+ .icen-scroll-area[tabindex='0']:focus-visible {
107
+ outline: none;
108
+ box-shadow: var(--icen-ring-soft);
109
+ border-radius: var(--icen-radius-md);
110
+ }
111
+
112
+ @media (prefers-reduced-motion: reduce) {
113
+ .icen-scroll-area { scroll-behavior: auto; }
114
+ }
27
115
 
28
- .scroll-area {
29
- overflow: auto;
30
- overscroll-behavior: contain;
31
- -webkit-overflow-scrolling: touch;
32
- scroll-behavior: smooth;
33
- }
34
-
35
- .scroll-area--x { overflow-x: auto; overflow-y: hidden; }
36
- .scroll-area--y { overflow-x: hidden; overflow-y: auto; }
37
- .scroll-area--both { overflow: auto; }
38
-
39
- /* ── 尺寸变体:覆盖全局滚动条宽度 ── */
40
- .scroll-area--sm {
41
- scrollbar-width: thin;
42
- }
43
- .scroll-area--sm::-webkit-scrollbar {
44
- width: 6px;
45
- height: 6px;
46
- }
47
- .scroll-area--sm::-webkit-scrollbar-thumb {
48
- background: color-mix(in srgb, var(--token-text-faint) 28%, transparent);
49
- border-radius: 3px;
50
- border: 0;
51
- }
52
-
53
- .scroll-area--lg {
54
- scrollbar-width: auto;
55
- }
56
- .scroll-area--lg::-webkit-scrollbar {
57
- width: 12px;
58
- height: 12px;
59
- }
60
- .scroll-area--lg::-webkit-scrollbar-thumb {
61
- background: color-mix(in srgb, var(--token-text-faint) 35%, transparent);
62
- border-radius: 6px;
63
- border: 2px solid transparent;
64
- background-clip: padding-box;
65
- }
66
- .scroll-area--lg::-webkit-scrollbar-thumb:hover {
67
- background: color-mix(in srgb, var(--token-text-faint) 50%, transparent);
68
- background-clip: padding-box;
69
- }
70
-
71
- /* ── 内嵌变体:带视觉边界 ── */
72
- .scroll-area--inset {
73
- background: var(--token-bg-soft);
74
- border: 1px solid var(--token-line-soft);
75
- border-radius: var(--radius-md);
76
- box-shadow: var(--token-shadow-inset);
77
- padding: var(--density-space-sm);
78
- }
79
- .scroll-area--inset:focus-visible {
80
- outline: none;
81
- border-color: var(--icen-control-focus-border);
82
- box-shadow: var(--icen-control-focus-shadow);
83
- }
84
-
85
- /* ── 渐隐遮罩(可选):上下边缘渐隐,暗示可滚动 ── */
86
- .scroll-area--fade {
87
- -webkit-mask-image: linear-gradient(
88
- to bottom,
89
- transparent 0,
90
- transparent 0,
91
- #000 var(--density-space-sm),
92
- #000 calc(100% - var(--density-space-sm)),
93
- transparent 100%
94
- );
95
- mask-image: linear-gradient(
96
- to bottom,
97
- transparent 0,
98
- #000 var(--density-space-sm),
99
- #000 calc(100% - var(--density-space-sm)),
100
- transparent 100%
101
- );
102
- }
103
-
104
- /* ── 可被键盘聚焦的滚动容器 ── */
105
- .scroll-area[tabindex='0']:focus-visible {
106
- outline: none;
107
- box-shadow: var(--icen-ring-soft);
108
- border-radius: var(--radius-md);
109
- }
110
-
111
- @media (prefers-reduced-motion: reduce) {
112
- .scroll-area { scroll-behavior: auto; }
113
116
  }