@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,92 +1,93 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: slider(单值 / 双滑块)
3
4
  * 规格源自 opengal primitives/input.tsx 的 Slider 与 advanced-input.tsx 的 DualRangeSlider;
4
5
  * 与 behaviors/slider.ts 配套(透明原生 range 覆盖层驱动 fill/thumb 定位)。
5
6
  *
6
7
  * 完整契约:
7
- * <div class="slider [--sm|--lg] [--vertical] [.is-disabled]" data-min=0 data-max=100 data-step=1>
8
- * <div class="slider-track"></div>
9
- * <div class="slider-fill" style="width:40%"></div> 单值:from 0
8
+ * <div class="icen-slider [--sm|--lg] [--vertical] [.is-disabled]" data-icen-min=0 data-icen-max=100 data-icen-step=1>
9
+ * <div class="icen-slider-track"></div>
10
+ * <div class="icen-slider-fill" style="width:40%"></div> 单值:from 0
10
11
  * OR
11
- * <div class="slider-range" style="left:20%; right:35%"></div> 双值:选中段
12
- * <div class="slider-thumb" style="left:calc(40% - 8px)"></div> 单 thumb
12
+ * <div class="icen-slider-range" style="left:20%; right:35%"></div> 双值:选中段
13
+ * <div class="icen-slider-thumb" style="left:calc(40% - 8px)"></div> 单 thumb
13
14
  * OR
14
- * <div class="slider-thumb slider-thumb--lo" …>
15
- * <div class="slider-thumb slider-thumb--hi" …> 双 thumb
16
- * <input class="slider-native" type="range" /> 单:1 个;双:2 个 [data-thumb=lo|hi]
15
+ * <div class="icen-slider-thumb slider-thumb--lo" …>
16
+ * <div class="icen-slider-thumb slider-thumb--hi" …> 双 thumb
17
+ * <input class="icen-slider-native" type="range" /> 单:1 个;双:2 个 [data-icen-thumb=lo|hi]
17
18
  * </div>
18
19
  *
19
20
  * 带标签行:
20
- * <div class="slider-row">
21
- * <span class="slider-label">音量</span>
22
- * <span class="slider-value">40</span> ← behavior 同步当前值,tabular-nums
21
+ * <div class="icen-slider-row">
22
+ * <span class="icen-slider-label">音量</span>
23
+ * <span class="icen-slider-value">40</span> ← behavior 同步当前值,tabular-nums
23
24
  * </div>
24
25
  *
25
26
  * behavior 维护:thumb 位置 % 化、aria-valuenow/min/max、键盘 ←/→ 步进、Shift 十步、双滑块互锁。
26
27
  */
27
28
 
28
- .slider {
29
+ .icen-slider {
29
30
  position: relative;
30
31
  height: 20px;
31
32
  width: 100%;
32
33
  --slider-thumb-size: 16px;
33
34
  --slider-track-height: 6px;
34
35
  }
35
- .slider--sm {
36
+ .icen-slider--sm {
36
37
  height: 16px;
37
38
  --slider-thumb-size: 12px;
38
39
  --slider-track-height: 4px;
39
40
  }
40
- .slider--lg {
41
+ .icen-slider--lg {
41
42
  height: 24px;
42
43
  --slider-thumb-size: 20px;
43
44
  --slider-track-height: 8px;
44
45
  }
45
- .slider.is-disabled,
46
- .slider[aria-disabled='true'],
47
- .slider[data-disabled] {
46
+ .icen-slider.is-disabled,
47
+ .icen-slider[aria-disabled='true'],
48
+ .icen-slider[data-icen-disabled] {
48
49
  opacity: var(--icen-disabled-opacity);
49
50
  cursor: not-allowed;
50
51
  }
51
52
 
52
53
  /* 垂直方向(orient=vertical),常见于音量/色相 */
53
- .slider--vertical {
54
+ .icen-slider--vertical {
54
55
  width: 20px;
55
56
  height: 100%;
56
57
  min-height: 120px;
57
58
  }
58
- .slider--vertical.slider--sm { width: 16px; }
59
- .slider--vertical.slider--lg { width: 24px; }
59
+ .icen-slider--vertical.icen-slider--sm { width: 16px; }
60
+ .icen-slider--vertical.icen-slider--lg { width: 24px; }
60
61
 
61
- .slider-track {
62
+ .icen-slider-track {
62
63
  position: absolute;
63
- left: 0; right: 0;
64
+ inset-inline: 0;
64
65
  top: 50%;
65
66
  transform: translateY(-50%);
66
67
  height: var(--slider-track-height);
67
- border-radius: var(--radius-full);
68
- background: color-mix(in srgb, var(--token-line-soft) 50%, transparent);
68
+ border-radius: var(--icen-radius-full);
69
+ background: color-mix(in srgb, var(--icen-token-line-soft) 50%, transparent);
69
70
  }
70
- .slider--vertical .slider-track {
71
- left: 50%; right: auto;
71
+ .icen-slider--vertical .icen-slider-track {
72
+ left: 50%; right: auto; /* guard:allow-physical 垂直变体轨道水平居中(translateX(-50%) 配套) */
72
73
  top: 0; bottom: 0;
73
74
  transform: translateX(-50%);
74
75
  height: 100%;
75
76
  width: var(--slider-track-height);
76
77
  }
77
78
 
78
- .slider-fill {
79
+ .icen-slider-fill {
79
80
  position: absolute;
80
- left: 0;
81
+ left: 0; /* guard:allow-physical 填充段起点/宽度由 behavior 按物理坐标内联写入(同 popover 模式),RTL 视觉暂不镜像 */
81
82
  top: 50%;
82
83
  transform: translateY(-50%);
83
84
  height: var(--slider-track-height);
84
- border-radius: var(--radius-full);
85
- background: var(--token-accent);
85
+ border-radius: var(--icen-radius-full);
86
+ background: var(--icen-token-accent);
86
87
  transition: width var(--icen-tx-normal);
87
88
  }
88
- .slider--vertical .slider-fill {
89
- left: 50%;
89
+ .icen-slider--vertical .icen-slider-fill {
90
+ left: 50%; /* guard:allow-physical 垂直变体水平居中(translateX(-50%) 配套) */
90
91
  top: auto; bottom: 0;
91
92
  transform: translateX(-50%);
92
93
  width: var(--slider-track-height);
@@ -94,20 +95,20 @@
94
95
  transition: height var(--icen-tx-normal);
95
96
  }
96
97
 
97
- /* 双滑块选中段:left = lo%、right = (100 - hi)% */
98
- .slider-range {
98
+ /* 双滑块选中段:left/right 由 behavior 按物理坐标内联写入(lo% / 100-hi%),RTL 视觉暂不镜像 */
99
+ .icen-slider-range {
99
100
  position: absolute;
100
101
  top: 50%;
101
102
  transform: translateY(-50%);
102
103
  height: var(--slider-track-height);
103
- border-radius: var(--radius-full);
104
- background: var(--token-accent);
104
+ border-radius: var(--icen-radius-full);
105
+ background: var(--icen-token-accent);
105
106
  transition:
106
- left var(--icen-tx-normal),
107
- right var(--icen-tx-normal);
107
+ left var(--icen-tx-normal), /* guard:allow-physical 与 behavior 内联写入的物理 left 配套 */
108
+ right var(--icen-tx-normal); /* guard:allow-physical 与 behavior 内联写入的物理 right 配套 */
108
109
  }
109
- .slider--vertical .slider-range {
110
- left: 50%;
110
+ .icen-slider--vertical .icen-slider-range {
111
+ left: 50%; /* guard:allow-physical 垂直变体水平居中(translateX(-50%) 配套) */
111
112
  top: auto;
112
113
  transform: translateX(-50%);
113
114
  width: var(--slider-track-height);
@@ -117,40 +118,40 @@
117
118
  bottom var(--icen-tx-normal);
118
119
  }
119
120
 
120
- .slider-thumb {
121
+ .icen-slider-thumb {
121
122
  position: absolute;
122
123
  top: 50%;
123
124
  transform: translate(-50%, -50%);
124
125
  width: var(--slider-thumb-size);
125
126
  height: var(--slider-thumb-size);
126
- border-radius: var(--radius-full);
127
- background: var(--token-card);
128
- border: 2px solid var(--token-accent);
129
- box-shadow: var(--token-shadow-card);
127
+ border-radius: var(--icen-radius-full);
128
+ background: var(--icen-token-card);
129
+ border: 2px solid var(--icen-token-accent);
130
+ box-shadow: var(--icen-token-shadow-card);
130
131
  pointer-events: none;
131
132
  transition:
132
133
  transform var(--icen-tx-fast),
133
134
  box-shadow var(--icen-tx-fast),
134
135
  border-color var(--icen-tx-fast);
135
136
  }
136
- .slider--vertical .slider-thumb {
137
+ .icen-slider--vertical .icen-slider-thumb {
137
138
  top: auto;
138
- left: 50%;
139
+ left: 50%; /* guard:allow-physical 垂直变体水平居中(translate(-50%) 配套) */
139
140
  transform: translate(-50%, 50%);
140
141
  }
141
- .slider:hover .slider-thumb {
142
- border-color: var(--token-accent-deep, var(--token-accent));
142
+ .icen-slider:hover .icen-slider-thumb {
143
+ border-color: var(--icen-token-accent-deep, var(--icen-token-accent));
143
144
  }
144
145
  /* 原生 input 透明,焦点环镜像到可见 thumb 上(消费 --icen-ring-soft) */
145
- .slider:focus-within .slider-thumb {
146
+ .icen-slider:focus-within .icen-slider-thumb {
146
147
  transform: translate(-50%, -50%) scale(1.15);
147
- box-shadow: var(--icen-ring-soft), var(--token-shadow-card);
148
+ box-shadow: var(--icen-ring-soft), var(--icen-token-shadow-card);
148
149
  }
149
- .slider--vertical:focus-within .slider-thumb {
150
+ .icen-slider--vertical:focus-within .icen-slider-thumb {
150
151
  transform: translate(-50%, 50%) scale(1.15);
151
152
  }
152
153
 
153
- .slider-native {
154
+ .icen-slider-native {
154
155
  position: absolute;
155
156
  inset: 0;
156
157
  width: 100%;
@@ -163,32 +164,32 @@
163
164
  appearance: none;
164
165
  background: transparent;
165
166
  }
166
- .slider-native:disabled { cursor: not-allowed; }
167
- .slider-native:focus { outline: none; }
167
+ .icen-slider-native:disabled { cursor: not-allowed; }
168
+ .icen-slider-native:focus { outline: none; }
168
169
 
169
170
  /* 双滑块需要两个 native input 叠加,--z 错开避免相互拦截 */
170
- .slider--dual .slider-native[data-thumb='hi'] { z-index: 2; }
171
+ .icen-slider--dual .icen-slider-native[data-icen-thumb='hi'] { z-index: 2; }
171
172
 
172
173
  /* 当前值标签 */
173
- .slider-value {
174
+ .icen-slider-value {
174
175
  font-variant-numeric: tabular-nums;
175
- color: var(--token-text);
176
+ color: var(--icen-token-text);
176
177
  }
177
178
 
178
- .slider-row {
179
+ .icen-slider-row {
179
180
  display: flex;
180
181
  align-items: center;
181
182
  justify-content: space-between;
182
- gap: var(--density-space-sm);
183
- font-size: var(--density-font-size-sm);
184
- color: var(--token-text-muted);
183
+ gap: var(--icen-density-space-sm);
184
+ font-size: var(--icen-density-font-size-sm);
185
+ color: var(--icen-token-text-muted);
185
186
  }
186
- .slider-label { color: var(--token-text-muted); }
187
+ .icen-slider-label { color: var(--icen-token-text-muted); }
187
188
 
188
189
  /* 刻度(behavior 可选渲染) */
189
- .slider-ticks {
190
+ .icen-slider-ticks {
190
191
  position: absolute;
191
- left: 0; right: 0;
192
+ inset-inline: 0;
192
193
  top: 50%;
193
194
  height: var(--slider-track-height);
194
195
  transform: translateY(-50%);
@@ -196,125 +197,127 @@
196
197
  justify-content: space-between;
197
198
  pointer-events: none;
198
199
  }
199
- .slider-tick {
200
+ .icen-slider-tick {
200
201
  width: 1px;
201
202
  height: 100%;
202
- background: color-mix(in srgb, var(--token-text) 12%, transparent);
203
+ background: color-mix(in srgb, var(--icen-token-text) 12%, transparent);
203
204
  }
204
205
 
205
206
  /* ── 带标签的刻度(marks)── */
206
- .slider-marks {
207
+ .icen-slider-marks {
207
208
  position: relative;
208
209
  height: 20px;
209
210
  margin-top: 2px;
210
- font-size: var(--density-font-size-xs);
211
- color: var(--token-text-faint);
211
+ font-size: var(--icen-density-font-size-xs);
212
+ color: var(--icen-token-text-faint);
212
213
  font-variant-numeric: tabular-nums;
213
214
  }
214
- .slider-mark {
215
+ .icen-slider-mark {
215
216
  position: absolute;
216
217
  transform: translateX(-50%);
217
218
  white-space: nowrap;
218
219
  cursor: pointer;
219
220
  transition: color var(--icen-tx-fast);
220
221
  }
221
- .slider-mark:hover {
222
- color: var(--token-accent);
222
+ .icen-slider-mark:hover {
223
+ color: var(--icen-token-accent);
223
224
  }
224
- .slider-mark.is-active {
225
- color: var(--token-accent);
225
+ .icen-slider-mark.is-active {
226
+ color: var(--icen-token-accent);
226
227
  font-weight: 500;
227
228
  }
228
- /* 刻度上的大点(配合 marks 使用) */
229
- .slider-mark::before {
229
+ /* 刻度上的大点(配合 marks 使用;left 由 behavior 按物理坐标内联写入) */
230
+ .icen-slider-mark::before {
230
231
  content: '';
231
232
  position: absolute;
232
- left: 50%;
233
+ left: 50%; /* guard:allow-physical 刻度点水平居中于 mark 标签(translateX(-50%) 配套) */
233
234
  top: -8px;
234
235
  width: 3px;
235
236
  height: 3px;
236
- border-radius: var(--radius-full);
237
- background: var(--token-text-faint);
237
+ border-radius: var(--icen-radius-full);
238
+ background: var(--icen-token-text-faint);
238
239
  transform: translateX(-50%);
239
240
  transition: background-color var(--icen-tx-fast);
240
241
  }
241
- .slider-mark:hover::before,
242
- .slider-mark.is-active::before {
243
- background: var(--token-accent);
242
+ .icen-slider-mark:hover::before,
243
+ .icen-slider-mark.is-active::before {
244
+ background: var(--icen-token-accent);
244
245
  }
245
246
 
246
247
  /* ── 值提示气泡(拖拽时出现)── */
247
- .slider-tooltip {
248
+ .icen-slider-tooltip {
248
249
  position: absolute;
249
250
  bottom: calc(50% + var(--slider-thumb-size));
250
251
  transform: translateX(-50%);
251
- padding: 2px var(--density-space-xs);
252
- background: var(--token-text);
253
- color: var(--token-card-strong);
254
- font-size: var(--density-font-size-xs);
252
+ padding: 2px var(--icen-density-space-xs);
253
+ background: var(--icen-token-text);
254
+ color: var(--icen-token-card-strong);
255
+ font-size: var(--icen-density-font-size-xs);
255
256
  font-variant-numeric: tabular-nums;
256
- border-radius: var(--radius-xs);
257
+ border-radius: var(--icen-radius-xs);
257
258
  white-space: nowrap;
258
259
  pointer-events: none;
259
260
  opacity: 0;
260
261
  transition: opacity var(--icen-tx-fast);
261
262
  z-index: 3;
262
263
  }
263
- .slider-tooltip::after {
264
+ .icen-slider-tooltip::after {
264
265
  content: '';
265
266
  position: absolute;
266
267
  top: 100%;
267
- left: 50%;
268
+ left: 50%; /* guard:allow-physical 气泡尾巴水平居中(translateX(-50%) 配套) */
268
269
  transform: translateX(-50%);
269
270
  border: 4px solid transparent;
270
- border-top-color: var(--token-text);
271
+ border-top-color: var(--icen-token-text);
271
272
  }
272
- .slider:active .slider-tooltip,
273
- .slider:focus-within .slider-tooltip {
273
+ .icen-slider:active .icen-slider-tooltip,
274
+ .icen-slider:focus-within .icen-slider-tooltip {
274
275
  opacity: 1;
275
276
  }
276
- .slider--vertical .slider-tooltip {
277
+ .icen-slider--vertical .icen-slider-tooltip {
277
278
  bottom: auto;
278
- left: calc(50% + var(--slider-thumb-size));
279
+ left: calc(50% + var(--slider-thumb-size)); /* guard:allow-physical 垂直变体:气泡位于轨道右侧(物理几何) */
279
280
  top: 50%;
280
281
  transform: translate(0, -50%);
281
282
  }
282
- .slider--vertical .slider-tooltip::after {
283
+ .icen-slider--vertical .icen-slider-tooltip::after {
283
284
  top: 50%;
284
- left: auto;
285
- right: 100%;
285
+ left: auto; /* guard:allow-physical 垂直变体尾巴贴气泡物理左侧 */
286
+ right: 100%; /* guard:allow-physical 垂直变体尾巴指向左侧(物理几何) */
286
287
  transform: translateY(-50%);
287
288
  border-top-color: transparent;
288
- border-right-color: var(--token-text);
289
+ border-right-color: var(--icen-token-text); /* guard:allow-physical 垂直变体左指箭头(物理几何) */
289
290
  }
290
291
 
291
292
  /* ── 滑块拖拽态(active 时放大) ── */
292
- .slider:active .slider-thumb {
293
+ .icen-slider:active .icen-slider-thumb {
293
294
  transform: translate(-50%, -50%) scale(1.25);
294
295
  }
295
- .slider--vertical:active .slider-thumb {
296
+ .icen-slider--vertical:active .icen-slider-thumb {
296
297
  transform: translate(-50%, 50%) scale(1.25);
297
298
  }
298
299
 
299
300
  /* ── 填充段带渐变(高级视觉) ── */
300
- .slider-fill--gradient,
301
- .slider-range--gradient {
301
+ .icen-slider-fill--gradient,
302
+ .icen-slider-range--gradient {
302
303
  background: linear-gradient(90deg,
303
- color-mix(in srgb, var(--token-accent) 60%, transparent),
304
- var(--token-accent));
304
+ color-mix(in srgb, var(--icen-token-accent) 60%, transparent),
305
+ var(--icen-token-accent));
305
306
  }
306
307
 
307
308
  /* ── 禁用态填充色变灰 ── */
308
- .slider.is-disabled .slider-fill,
309
- .slider.is-disabled .slider-range {
310
- background: var(--token-fill-2);
309
+ .icen-slider.is-disabled .icen-slider-fill,
310
+ .icen-slider.is-disabled .icen-slider-range {
311
+ background: var(--icen-token-fill-2);
311
312
  }
312
- .slider.is-disabled .slider-thumb {
313
- border-color: var(--token-text-faint);
313
+ .icen-slider.is-disabled .icen-slider-thumb {
314
+ border-color: var(--icen-token-text-faint);
314
315
  }
315
316
 
316
317
  @media (prefers-reduced-motion: reduce) {
317
- .slider-fill, .slider-range, .slider-thumb { transition: none; }
318
- .slider-tooltip { transition: none; }
319
- .slider-mark, .slider-mark::before { transition: none; }
318
+ .icen-slider-fill, .icen-slider-range, .icen-slider-thumb { transition: none; }
319
+ .icen-slider-tooltip { transition: none; }
320
+ .icen-slider-mark, .icen-slider-mark::before { transition: none; }
321
+ }
322
+
320
323
  }
@@ -1,111 +1,114 @@
1
- /*
2
- * @icen.ai/ui — Component: split-pane(分栏拖拽容器,与 behaviors/split-pane 配套)
3
- *
4
- * 契约:
5
- * <div class="split-pane [--vertical]" data-split-pane style="--split: 50%">
6
- * <div class="split-pane-first">左侧(或上侧)内容</div>
7
- * <div class="split-pane-divider" role="separator" aria-orientation="vertical" aria-valuenow="50"></div>
8
- * <div class="split-pane-second">右侧(或下侧)内容</div>
9
- * </div>
10
- *
11
- * behavior 接管 .split-pane-divider 的 pointer 拖拽,按比例更新 --split 变量
12
- * (范围 10% – 90%);双击分隔条复位到 50%。
13
- *
14
- * 常用于:编辑器左右分栏 / 后台主从布局 / 邮件列表+详情。
15
- */
1
+ @layer icen.components {
2
+ /*
3
+ * @icen.ai/ui — Component: split-pane(分栏拖拽容器,与 behaviors/split-pane 配套)
4
+ *
5
+ * 契约:
6
+ * <div class="icen-split-pane [--vertical]" data-icen-split-pane style="--split: 50%">
7
+ * <div class="icen-split-pane-first">首个面板(LTR 左 / RTL 镜像右;或上侧)内容</div>
8
+ * <div class="icen-split-pane-divider" role="separator" aria-orientation="vertical" aria-valuenow="50"></div>
9
+ * <div class="icen-split-pane-second">次个面板(LTR 右 / RTL 镜像左;或下侧)内容</div>
10
+ * </div>
11
+ *
12
+ * behavior 接管 .icen-split-pane-divider 的 pointer 拖拽,按比例更新 --split 变量
13
+ * (范围 10% – 90%);双击分隔条复位到 50%。
14
+ *
15
+ * 常用于:编辑器左右分栏 / 后台主从布局 / 邮件列表+详情。
16
+ */
17
+
18
+ .icen-split-pane {
19
+ display: flex;
20
+ align-items: stretch;
21
+ width: 100%;
22
+ height: 100%;
23
+ min-height: 200px;
24
+ overflow: hidden;
25
+ background: var(--icen-token-surface);
26
+ border: 1px solid var(--icen-token-line-soft);
27
+ border-radius: var(--icen-radius-md);
28
+ }
29
+
30
+ .icen-split-pane-first {
31
+ flex: 0 0 var(--split, 50%);
32
+ min-width: 0;
33
+ overflow: auto;
34
+ overscroll-behavior: contain;
35
+ }
36
+ .icen-split-pane-second {
37
+ flex: 1 1 auto;
38
+ min-width: 0;
39
+ overflow: auto;
40
+ overscroll-behavior: contain;
41
+ }
42
+
43
+ /* ── 分隔条(默认纵向 col-resize) ── */
44
+ .icen-split-pane-divider {
45
+ flex: 0 0 6px;
46
+ position: relative;
47
+ background: var(--icen-token-line-soft);
48
+ cursor: col-resize;
49
+ user-select: none;
50
+ touch-action: none;
51
+ transition: background var(--icen-tx-fast);
52
+ }
53
+ .icen-split-pane-divider::after {
54
+ content: '';
55
+ position: absolute;
56
+ top: 50%;
57
+ left: 50%; /* guard:allow-physical 分隔条圆点居中(translate(-50%,-50%) 配套) */
58
+ width: 2px;
59
+ height: 28px;
60
+ border-radius: 1px;
16
61
  /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
62
+ background: var(--icen-token-text-faint);
63
+ opacity: 0.35;
64
+ transform: translate(-50%, -50%);
65
+ transition: opacity var(--icen-tx-fast), background-color var(--icen-tx-fast);
66
+ }
67
+ .icen-split-pane-divider:hover::after,
68
+ .icen-split-pane-divider.is-dragging::after {
69
+ opacity: 1;
70
+ background: var(--icen-token-accent);
71
+ }
72
+ .icen-split-pane-divider:hover,
73
+ .icen-split-pane-divider.is-dragging {
74
+ background: color-mix(in srgb, var(--icen-token-accent) 14%, var(--icen-token-line-soft));
75
+ }
76
+ .icen-split-pane-divider:focus-visible {
77
+ outline: none;
78
+ background: color-mix(in srgb, var(--icen-token-accent) 18%, var(--icen-token-line-soft));
79
+ }
80
+
81
+ /* ── 纵向布局(上下分栏) ── */
82
+ .icen-split-pane--vertical {
83
+ flex-direction: column;
84
+ }
85
+ .icen-split-pane--vertical .icen-split-pane-first {
86
+ flex: 0 0 var(--split, 50%);
87
+ min-height: 0;
88
+ }
89
+ .icen-split-pane--vertical .icen-split-pane-second {
90
+ flex-basis: auto;
91
+ min-height: 0;
92
+ }
93
+ .icen-split-pane--vertical .icen-split-pane-divider {
94
+ cursor: row-resize;
95
+ flex-basis: 6px;
96
+ height: 6px;
97
+ width: auto;
98
+ }
99
+ .icen-split-pane--vertical .icen-split-pane-divider::after {
100
+ width: 28px;
101
+ height: 2px;
102
+ }
103
+
104
+ /* ── 嵌套分栏不应再有外边框 ── */
105
+ .icen-split-pane .icen-split-pane {
106
+ border: 0;
107
+ border-radius: 0;
108
+ }
109
+
110
+ @media (prefers-reduced-motion: reduce) {
111
+ .icen-split-pane-divider { transition: none; }
112
+ .icen-split-pane-divider::after { transition: none; }
113
+ }
17
114
 
18
- .split-pane {
19
- display: flex;
20
- align-items: stretch;
21
- width: 100%;
22
- height: 100%;
23
- min-height: 200px;
24
- overflow: hidden;
25
- background: var(--token-surface);
26
- border: 1px solid var(--token-line-soft);
27
- border-radius: var(--radius-md);
28
- }
29
-
30
- .split-pane-first {
31
- flex: 0 0 var(--split, 50%);
32
- min-width: 0;
33
- overflow: auto;
34
- overscroll-behavior: contain;
35
- }
36
- .split-pane-second {
37
- flex: 1 1 auto;
38
- min-width: 0;
39
- overflow: auto;
40
- overscroll-behavior: contain;
41
- }
42
-
43
- /* ── 分隔条(默认纵向 col-resize) ── */
44
- .split-pane-divider {
45
- flex: 0 0 6px;
46
- position: relative;
47
- background: var(--token-line-soft);
48
- cursor: col-resize;
49
- user-select: none;
50
- touch-action: none;
51
- transition: background var(--icen-tx-fast);
52
- }
53
- .split-pane-divider::after {
54
- content: '';
55
- position: absolute;
56
- top: 50%;
57
- left: 50%;
58
- width: 2px;
59
- height: 28px;
60
- border-radius: 1px;
61
- background: var(--token-text-faint);
62
- opacity: 0.35;
63
- transform: translate(-50%, -50%);
64
- transition: opacity var(--icen-tx-fast), background-color var(--icen-tx-fast);
65
- }
66
- .split-pane-divider:hover::after,
67
- .split-pane-divider.is-dragging::after {
68
- opacity: 1;
69
- background: var(--token-accent);
70
- }
71
- .split-pane-divider:hover,
72
- .split-pane-divider.is-dragging {
73
- background: color-mix(in srgb, var(--token-accent) 14%, var(--token-line-soft));
74
- }
75
- .split-pane-divider:focus-visible {
76
- outline: none;
77
- background: color-mix(in srgb, var(--token-accent) 18%, var(--token-line-soft));
78
- }
79
-
80
- /* ── 纵向布局(上下分栏) ── */
81
- .split-pane--vertical {
82
- flex-direction: column;
83
- }
84
- .split-pane--vertical .split-pane-first {
85
- flex: 0 0 var(--split, 50%);
86
- min-height: 0;
87
- }
88
- .split-pane--vertical .split-pane-second {
89
- flex-basis: auto;
90
- min-height: 0;
91
- }
92
- .split-pane--vertical .split-pane-divider {
93
- cursor: row-resize;
94
- flex-basis: 6px;
95
- height: 6px;
96
- width: auto;
97
- }
98
- .split-pane--vertical .split-pane-divider::after {
99
- width: 28px;
100
- height: 2px;
101
- }
102
-
103
- /* ── 嵌套分栏不应再有外边框 ── */
104
- .split-pane .split-pane {
105
- border: 0;
106
- border-radius: 0;
107
- }
108
-
109
- @media (prefers-reduced-motion: reduce) {
110
- .split-pane-divider { transition: none; }
111
- .split-pane-divider::after { transition: none; }
112
115
  }