@icen.ai/ui 0.8.1 → 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 (335) hide show
  1. package/AGENTS.md +176 -75
  2. package/README.md +66 -88
  3. package/dist/base.css +208 -179
  4. package/dist/behaviors/accordion.mjs +8 -8
  5. package/dist/behaviors/ai-branch.d.mts +19 -0
  6. package/dist/behaviors/ai-branch.mjs +1133 -0
  7. package/dist/behaviors/ai-chat.d.mts +12 -10
  8. package/dist/behaviors/ai-chat.mjs +1125 -155
  9. package/dist/behaviors/ai-composer.d.mts +44 -12
  10. package/dist/behaviors/ai-composer.mjs +2084 -523
  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 +26 -0
  15. package/dist/behaviors/ai-feedback.mjs +1212 -0
  16. package/dist/behaviors/ai-panel.d.mts +21 -7
  17. package/dist/behaviors/ai-panel.mjs +1308 -264
  18. package/dist/behaviors/ai-provider.mjs +1003 -101
  19. package/dist/behaviors/ai-threads.d.mts +38 -0
  20. package/dist/behaviors/ai-threads.mjs +1233 -0
  21. package/dist/behaviors/ai-tool.d.mts +2 -2
  22. package/dist/behaviors/ai-tool.mjs +2042 -396
  23. package/dist/behaviors/ai-tools.d.mts +89 -16
  24. package/dist/behaviors/ai-tools.mjs +4453 -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 +174 -8
  34. package/dist/behaviors/charts.mjs +2632 -192
  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 +313 -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 +34 -0
  68. package/dist/behaviors/kb-access.mjs +2459 -0
  69. package/dist/behaviors/kb-acl.d.mts +50 -0
  70. package/dist/behaviors/kb-acl.mjs +1345 -0
  71. package/dist/behaviors/kb-answer.d.mts +38 -0
  72. package/dist/behaviors/kb-answer.mjs +3707 -0
  73. package/dist/behaviors/kb-audit.d.mts +23 -0
  74. package/dist/behaviors/kb-audit.mjs +1297 -0
  75. package/dist/behaviors/kb-canvas.d.mts +44 -0
  76. package/dist/behaviors/kb-canvas.mjs +1512 -0
  77. package/dist/behaviors/kb-chain.d.mts +15 -0
  78. package/dist/behaviors/kb-chain.mjs +1192 -0
  79. package/dist/behaviors/kb-checkpoint.d.mts +16 -0
  80. package/dist/behaviors/kb-checkpoint.mjs +1492 -0
  81. package/dist/behaviors/kb-chunks.d.mts +31 -0
  82. package/dist/behaviors/kb-chunks.mjs +1414 -0
  83. package/dist/behaviors/kb-citation.d.mts +38 -0
  84. package/dist/behaviors/kb-citation.mjs +1699 -0
  85. package/dist/behaviors/kb-clarify.d.mts +20 -0
  86. package/dist/behaviors/kb-clarify.mjs +1176 -0
  87. package/dist/behaviors/kb-conflict.d.mts +22 -0
  88. package/dist/behaviors/kb-conflict.mjs +1206 -0
  89. package/dist/behaviors/kb-connector.d.mts +17 -0
  90. package/dist/behaviors/kb-connector.mjs +1303 -0
  91. package/dist/behaviors/kb-core.d.mts +534 -0
  92. package/dist/behaviors/kb-core.mjs +1805 -0
  93. package/dist/behaviors/kb-eval.d.mts +22 -0
  94. package/dist/behaviors/kb-eval.mjs +2235 -0
  95. package/dist/behaviors/kb-explain.d.mts +11 -0
  96. package/dist/behaviors/kb-explain.mjs +1165 -0
  97. package/dist/behaviors/kb-filter.d.mts +31 -0
  98. package/dist/behaviors/kb-filter.mjs +2417 -0
  99. package/dist/behaviors/kb-gap.d.mts +27 -0
  100. package/dist/behaviors/kb-gap.mjs +1195 -0
  101. package/dist/behaviors/kb-hittest.d.mts +34 -0
  102. package/dist/behaviors/kb-hittest.mjs +1352 -0
  103. package/dist/behaviors/kb-metadata.d.mts +29 -0
  104. package/dist/behaviors/kb-metadata.mjs +1248 -0
  105. package/dist/behaviors/kb-passage.d.mts +41 -0
  106. package/dist/behaviors/kb-passage.mjs +1469 -0
  107. package/dist/behaviors/kb-pipeline.d.mts +18 -0
  108. package/dist/behaviors/kb-pipeline.mjs +1301 -0
  109. package/dist/behaviors/kb-qa.d.mts +26 -0
  110. package/dist/behaviors/kb-qa.mjs +1260 -0
  111. package/dist/behaviors/kb-rerank.d.mts +20 -0
  112. package/dist/behaviors/kb-rerank.mjs +1248 -0
  113. package/dist/behaviors/kb-retrieval.d.mts +49 -0
  114. package/dist/behaviors/kb-retrieval.mjs +2585 -0
  115. package/dist/behaviors/kb-review.d.mts +44 -0
  116. package/dist/behaviors/kb-review.mjs +2282 -0
  117. package/dist/behaviors/kb-sandbox.d.mts +33 -0
  118. package/dist/behaviors/kb-sandbox.mjs +1247 -0
  119. package/dist/behaviors/kb-segment.d.mts +32 -0
  120. package/dist/behaviors/kb-segment.mjs +1431 -0
  121. package/dist/behaviors/kb-select.d.mts +24 -0
  122. package/dist/behaviors/kb-select.mjs +1989 -0
  123. package/dist/behaviors/kb-sources.d.mts +27 -0
  124. package/dist/behaviors/kb-sources.mjs +1287 -0
  125. package/dist/behaviors/kb-sql.d.mts +43 -0
  126. package/dist/behaviors/kb-sql.mjs +1865 -0
  127. package/dist/behaviors/kb-trace.d.mts +16 -0
  128. package/dist/behaviors/kb-trace.mjs +1328 -0
  129. package/dist/behaviors/kb-visibility.d.mts +44 -0
  130. package/dist/behaviors/kb-visibility.mjs +1331 -0
  131. package/dist/behaviors/kb-who-can.d.mts +32 -0
  132. package/dist/behaviors/kb-who-can.mjs +2216 -0
  133. package/dist/behaviors/mentions.d.mts +93 -0
  134. package/dist/behaviors/mentions.mjs +2152 -0
  135. package/dist/behaviors/modal.d.mts +4 -3
  136. package/dist/behaviors/modal.mjs +1055 -33
  137. package/dist/behaviors/nav.d.mts +1 -1
  138. package/dist/behaviors/nav.mjs +6 -6
  139. package/dist/behaviors/notification.d.mts +16 -8
  140. package/dist/behaviors/notification.mjs +1615 -265
  141. package/dist/behaviors/panel.d.mts +4 -0
  142. package/dist/behaviors/panel.mjs +994 -0
  143. package/dist/behaviors/popover.d.mts +28 -5
  144. package/dist/behaviors/popover.mjs +225 -24
  145. package/dist/behaviors/select.d.mts +5 -2
  146. package/dist/behaviors/select.mjs +1410 -117
  147. package/dist/behaviors/sidebar.d.mts +1 -1
  148. package/dist/behaviors/sidebar.mjs +13 -13
  149. package/dist/behaviors/slider.d.mts +1 -1
  150. package/dist/behaviors/slider.mjs +9 -9
  151. package/dist/behaviors/split-pane.d.mts +1 -1
  152. package/dist/behaviors/split-pane.mjs +7 -7
  153. package/dist/behaviors/suggestions.d.mts +27 -0
  154. package/dist/behaviors/suggestions.mjs +1089 -0
  155. package/dist/behaviors/svg-parse.d.mts +14 -0
  156. package/dist/behaviors/svg-parse.mjs +37 -0
  157. package/dist/behaviors/tabs.d.mts +2 -2
  158. package/dist/behaviors/tabs.mjs +25 -25
  159. package/dist/behaviors/tag-input.d.mts +23 -5
  160. package/dist/behaviors/tag-input.mjs +1359 -104
  161. package/dist/behaviors/theme-switcher.d.mts +24 -0
  162. package/dist/behaviors/theme-switcher.mjs +1981 -0
  163. package/dist/behaviors/theme.d.mts +15 -8
  164. package/dist/behaviors/theme.mjs +390 -28
  165. package/dist/behaviors/toast.d.mts +24 -25
  166. package/dist/behaviors/toast.mjs +1266 -88
  167. package/dist/behaviors/tooltip.d.mts +4 -0
  168. package/dist/behaviors/tooltip.mjs +378 -0
  169. package/dist/behaviors/tree-select.d.mts +69 -0
  170. package/dist/behaviors/tree-select.mjs +1907 -0
  171. package/dist/behaviors/tree.d.mts +1 -1
  172. package/dist/behaviors/tree.mjs +15 -15
  173. package/dist/behaviors/upload.d.mts +3 -2
  174. package/dist/behaviors/upload.mjs +1076 -66
  175. package/dist/cli.mjs +5 -6
  176. package/dist/components/ai-branch.mjs +3 -0
  177. package/dist/components/ai-chat.css +846 -458
  178. package/dist/components/ai-diff.css +153 -132
  179. package/dist/components/ai-feedback.mjs +3 -0
  180. package/dist/components/ai-panel.css +495 -270
  181. package/dist/components/ai-threads.mjs +3 -0
  182. package/dist/components/ai-tool.css +393 -238
  183. package/dist/components/autocomplete.css +61 -0
  184. package/dist/components/autocomplete.mjs +3 -0
  185. package/dist/components/back-top.css +34 -31
  186. package/dist/components/badge.css +44 -41
  187. package/dist/components/breadcrumb.css +67 -46
  188. package/dist/components/btn.css +80 -74
  189. package/dist/components/card.css +117 -106
  190. package/dist/components/cascader.css +311 -0
  191. package/dist/components/cascader.mjs +3 -0
  192. package/dist/components/chart-area.css +8 -2
  193. package/dist/components/chart-bar.css +95 -33
  194. package/dist/components/chart-gauge.css +14 -11
  195. package/dist/components/chart-graph.css +60 -0
  196. package/dist/components/chart-graph.mjs +4 -0
  197. package/dist/components/chart-heatmap.css +96 -90
  198. package/dist/components/chart-line.css +8 -3
  199. package/dist/components/chart-map.mjs +3 -0
  200. package/dist/components/chart-pie.css +9 -6
  201. package/dist/components/chart-radar.css +8 -5
  202. package/dist/components/chart-scatter.css +9 -6
  203. package/dist/components/chart-scatter.mjs +1 -1
  204. package/dist/components/chart-sparkline.css +5 -2
  205. package/dist/components/chart-stack.css +14 -11
  206. package/dist/components/charts.css +190 -67
  207. package/dist/components/charts.mjs +1 -0
  208. package/dist/components/code-block.css +418 -0
  209. package/dist/components/code-block.mjs +4 -0
  210. package/dist/components/command-palette.css +138 -117
  211. package/dist/components/content.css +257 -251
  212. package/dist/components/copy.css +72 -44
  213. package/dist/components/datatable.css +423 -181
  214. package/dist/components/date-picker.css +135 -104
  215. package/dist/components/empty.css +68 -65
  216. package/dist/components/feedback.css +201 -183
  217. package/dist/components/form-validate.css +120 -0
  218. package/dist/components/form-validate.mjs +3 -0
  219. package/dist/components/form.css +150 -127
  220. package/dist/components/icon.css +102 -0
  221. package/dist/components/icon.mjs +3 -0
  222. package/dist/components/input.css +159 -104
  223. package/dist/components/kb-access.mjs +4 -0
  224. package/dist/components/kb-acl.mjs +4 -0
  225. package/dist/components/kb-agent.css +496 -0
  226. package/dist/components/kb-answer.mjs +4 -0
  227. package/dist/components/kb-audit.mjs +4 -0
  228. package/dist/components/kb-canvas.mjs +4 -0
  229. package/dist/components/kb-chain.mjs +4 -0
  230. package/dist/components/kb-checkpoint.mjs +4 -0
  231. package/dist/components/kb-chunks.mjs +4 -0
  232. package/dist/components/kb-citation.mjs +4 -0
  233. package/dist/components/kb-clarify.mjs +4 -0
  234. package/dist/components/kb-conflict.mjs +4 -0
  235. package/dist/components/kb-connector.mjs +4 -0
  236. package/dist/components/kb-data.css +653 -0
  237. package/dist/components/kb-eval.mjs +4 -0
  238. package/dist/components/kb-explain.mjs +4 -0
  239. package/dist/components/kb-filter.mjs +4 -0
  240. package/dist/components/kb-gap.mjs +4 -0
  241. package/dist/components/kb-ground.css +578 -0
  242. package/dist/components/kb-hittest.mjs +4 -0
  243. package/dist/components/kb-ingest.css +882 -0
  244. package/dist/components/kb-metadata.mjs +4 -0
  245. package/dist/components/kb-ops.css +554 -0
  246. package/dist/components/kb-passage.mjs +4 -0
  247. package/dist/components/kb-perm.css +433 -0
  248. package/dist/components/kb-pipeline.mjs +4 -0
  249. package/dist/components/kb-qa.mjs +4 -0
  250. package/dist/components/kb-rerank.mjs +4 -0
  251. package/dist/components/kb-retrieval.mjs +4 -0
  252. package/dist/components/kb-review.mjs +4 -0
  253. package/dist/components/kb-sandbox.mjs +4 -0
  254. package/dist/components/kb-search.css +897 -0
  255. package/dist/components/kb-segment.mjs +4 -0
  256. package/dist/components/kb-sources.mjs +4 -0
  257. package/dist/components/kb-sql.mjs +4 -0
  258. package/dist/components/kb-trace.mjs +4 -0
  259. package/dist/components/kb-visibility.mjs +4 -0
  260. package/dist/components/kb-who-can.mjs +4 -0
  261. package/dist/components/kb.css +263 -0
  262. package/dist/components/kb.mjs +9 -0
  263. package/dist/components/layout.css +85 -82
  264. package/dist/components/material-chinese.css +73 -0
  265. package/dist/components/material-soviet.css +76 -0
  266. package/dist/components/material.css +275 -0
  267. package/dist/components/media.css +220 -166
  268. package/dist/components/mentions.css +189 -0
  269. package/dist/components/mentions.mjs +3 -0
  270. package/dist/components/menu.css +113 -105
  271. package/dist/components/modal.css +107 -112
  272. package/dist/components/nav.css +118 -115
  273. package/dist/components/notification.css +238 -174
  274. package/dist/components/pagination.css +56 -53
  275. package/dist/components/panel.css +66 -63
  276. package/dist/components/panel.mjs +1 -0
  277. package/dist/components/pill.css +81 -71
  278. package/dist/components/popover.css +67 -53
  279. package/dist/components/scroll-area.css +113 -110
  280. package/dist/components/segmented.css +146 -143
  281. package/dist/components/select.css +206 -186
  282. package/dist/components/sidebar.css +137 -127
  283. package/dist/components/slider.css +117 -114
  284. package/dist/components/split-pane.css +112 -109
  285. package/dist/components/stat.css +112 -106
  286. package/dist/components/steps.css +109 -103
  287. package/dist/components/switch.css +138 -134
  288. package/dist/components/table.css +131 -107
  289. package/dist/components/tabs.css +114 -108
  290. package/dist/components/tag-input.css +48 -133
  291. package/dist/components/tag.css +81 -71
  292. package/dist/components/theme-switcher.css +105 -0
  293. package/dist/components/theme-switcher.mjs +3 -0
  294. package/dist/components/toast.css +100 -86
  295. package/dist/components/toolbar.css +45 -42
  296. package/dist/components/tooltip.css +102 -43
  297. package/dist/components/tooltip.mjs +1 -0
  298. package/dist/components/tree-select.css +416 -0
  299. package/dist/components/tree-select.mjs +3 -0
  300. package/dist/components/upload.css +135 -92
  301. package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
  302. package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
  303. package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
  304. package/dist/fonts/OFL.txt +96 -0
  305. package/dist/fonts/README.md +14 -0
  306. package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
  307. package/dist/index.d.mts +64 -15
  308. package/dist/index.mjs +28049 -8595
  309. package/dist/react.d.mts +91 -0
  310. package/dist/react.mjs +8208 -0
  311. package/dist/registry.json +454 -15
  312. package/dist/tokens/chinese.css +44 -0
  313. package/dist/tokens/colors.css +365 -1222
  314. package/dist/tokens/design.css +109 -0
  315. package/dist/tokens/dtcg.json +11198 -0
  316. package/dist/tokens/figma.variables.json +7017 -0
  317. package/dist/tokens/icon-masks.css +78 -0
  318. package/dist/tokens/pixel.css +50 -0
  319. package/dist/tokens/soviet.css +44 -0
  320. package/dist/tokens/style-profiles.css +36 -547
  321. package/dist/tokens/themes.json +308 -0
  322. package/dist/tokens/tokens-studio.json +6728 -0
  323. package/dist/tokens/typography.css +21 -18
  324. package/dist/tokens.css +1555 -1801
  325. package/dist/ui.css +16147 -8597
  326. package/dist/vue.d.mts +344 -0
  327. package/dist/vue.mjs +7781 -0
  328. package/docs/spec/ai-input-experience.md +75 -0
  329. package/docs/spec/ai-native.md +238 -147
  330. package/docs/spec/design-philosophy.md +189 -0
  331. package/docs/spec/design-primitives.md +196 -0
  332. package/docs/spec/kb-family.md +475 -0
  333. package/package.json +42 -7
  334. package/dist/retro-effects.css +0 -255
  335. package/dist/tokens/retro-effects.css +0 -255
@@ -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
  }