@icen.ai/ui 0.10.0 → 0.11.1

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 (362) hide show
  1. package/AGENTS.md +79 -309
  2. package/LICENSE +21 -0
  3. package/README.md +43 -54
  4. package/dist/base.css +68 -22
  5. package/dist/behaviors/accordion.mjs +1 -1
  6. package/dist/behaviors/ai-branch.mjs +14 -0
  7. package/dist/behaviors/ai-chat.d.mts +2 -2
  8. package/dist/behaviors/ai-chat.mjs +66 -10
  9. package/dist/behaviors/ai-composer.d.mts +5 -5
  10. package/dist/behaviors/ai-composer.mjs +34 -10
  11. package/dist/behaviors/ai-core.mjs +14 -0
  12. package/dist/behaviors/ai-diff.mjs +14 -0
  13. package/dist/behaviors/ai-feedback.mjs +14 -0
  14. package/dist/behaviors/ai-panel.d.mts +2 -2
  15. package/dist/behaviors/ai-panel.mjs +14 -0
  16. package/dist/behaviors/ai-provider.d.mts +1 -1
  17. package/dist/behaviors/ai-provider.mjs +14 -0
  18. package/dist/behaviors/ai-threads.mjs +14 -0
  19. package/dist/behaviors/ai-tool.d.mts +1 -1
  20. package/dist/behaviors/ai-tool.mjs +299 -24
  21. package/dist/behaviors/ai-tools.mjs +1179 -28
  22. package/dist/behaviors/autocomplete.d.mts +1 -1
  23. package/dist/behaviors/autocomplete.mjs +14 -0
  24. package/dist/behaviors/back-top.mjs +14 -0
  25. package/dist/behaviors/carousel.mjs +21 -1
  26. package/dist/behaviors/cascader.mjs +27 -0
  27. package/dist/behaviors/charts.d.mts +12 -1
  28. package/dist/behaviors/charts.mjs +298 -20
  29. package/dist/behaviors/code-block.mjs +22 -1
  30. package/dist/behaviors/command-palette.mjs +3 -3
  31. package/dist/behaviors/context-menu.d.mts +2 -2
  32. package/dist/behaviors/context-menu.mjs +14 -0
  33. package/dist/behaviors/controls.d.mts +8 -8
  34. package/dist/behaviors/controls.mjs +50 -6
  35. package/dist/behaviors/copy.mjs +14 -0
  36. package/dist/behaviors/datatable.d.mts +3 -3
  37. package/dist/behaviors/datatable.mjs +89 -11
  38. package/dist/behaviors/date-picker.mjs +14 -0
  39. package/dist/behaviors/events.d.mts +10 -10
  40. package/dist/behaviors/events.mjs +11 -1
  41. package/dist/behaviors/form-validate.d.mts +10 -1
  42. package/dist/behaviors/form-validate.mjs +279 -4611
  43. package/dist/behaviors/i18n.d.mts +14 -0
  44. package/dist/behaviors/i18n.mjs +28 -0
  45. package/dist/behaviors/input.mjs +16 -0
  46. package/dist/behaviors/kb-access.d.mts +2 -2
  47. package/dist/behaviors/kb-access.mjs +21 -2
  48. package/dist/behaviors/kb-acl.d.mts +2 -2
  49. package/dist/behaviors/kb-acl.mjs +14 -0
  50. package/dist/behaviors/kb-answer.d.mts +2 -2
  51. package/dist/behaviors/kb-answer.mjs +298 -23
  52. package/dist/behaviors/kb-audit.d.mts +2 -2
  53. package/dist/behaviors/kb-audit.mjs +14 -0
  54. package/dist/behaviors/kb-canvas.d.mts +3 -3
  55. package/dist/behaviors/kb-canvas.mjs +14 -0
  56. package/dist/behaviors/kb-chain.d.mts +2 -2
  57. package/dist/behaviors/kb-chain.mjs +14 -0
  58. package/dist/behaviors/kb-checkpoint.d.mts +2 -2
  59. package/dist/behaviors/kb-checkpoint.mjs +14 -0
  60. package/dist/behaviors/kb-chunks.d.mts +2 -2
  61. package/dist/behaviors/kb-chunks.mjs +14 -0
  62. package/dist/behaviors/kb-citation.d.mts +2 -2
  63. package/dist/behaviors/kb-citation.mjs +33 -6
  64. package/dist/behaviors/kb-clarify.d.mts +2 -2
  65. package/dist/behaviors/kb-clarify.mjs +14 -0
  66. package/dist/behaviors/kb-conflict.d.mts +2 -2
  67. package/dist/behaviors/kb-conflict.mjs +14 -0
  68. package/dist/behaviors/kb-connector.d.mts +2 -2
  69. package/dist/behaviors/kb-connector.mjs +14 -0
  70. package/dist/behaviors/kb-core.d.mts +1 -1
  71. package/dist/behaviors/kb-core.mjs +14 -0
  72. package/dist/behaviors/kb-eval.d.mts +2 -2
  73. package/dist/behaviors/kb-eval.mjs +21 -2
  74. package/dist/behaviors/kb-explain.d.mts +2 -2
  75. package/dist/behaviors/kb-explain.mjs +26 -2
  76. package/dist/behaviors/kb-filter.d.mts +2 -2
  77. package/dist/behaviors/kb-filter.mjs +21 -2
  78. package/dist/behaviors/kb-gap.d.mts +2 -2
  79. package/dist/behaviors/kb-gap.mjs +14 -0
  80. package/dist/behaviors/kb-hittest.d.mts +2 -2
  81. package/dist/behaviors/kb-hittest.mjs +15 -1
  82. package/dist/behaviors/kb-metadata.mjs +19 -0
  83. package/dist/behaviors/kb-passage.d.mts +2 -2
  84. package/dist/behaviors/kb-passage.mjs +14 -0
  85. package/dist/behaviors/kb-pipeline.d.mts +2 -2
  86. package/dist/behaviors/kb-pipeline.mjs +14 -0
  87. package/dist/behaviors/kb-qa.mjs +14 -0
  88. package/dist/behaviors/kb-rerank.d.mts +2 -2
  89. package/dist/behaviors/kb-rerank.mjs +14 -0
  90. package/dist/behaviors/kb-retrieval.d.mts +2 -2
  91. package/dist/behaviors/kb-retrieval.mjs +31 -4
  92. package/dist/behaviors/kb-review.d.mts +2 -2
  93. package/dist/behaviors/kb-review.mjs +21 -2
  94. package/dist/behaviors/kb-sandbox.d.mts +2 -2
  95. package/dist/behaviors/kb-sandbox.mjs +20 -1
  96. package/dist/behaviors/kb-segment.d.mts +2 -2
  97. package/dist/behaviors/kb-segment.mjs +15 -1
  98. package/dist/behaviors/kb-select.mjs +21 -2
  99. package/dist/behaviors/kb-sources.d.mts +2 -2
  100. package/dist/behaviors/kb-sources.mjs +14 -0
  101. package/dist/behaviors/kb-sql.d.mts +2 -2
  102. package/dist/behaviors/kb-sql.mjs +14 -0
  103. package/dist/behaviors/kb-trace.d.mts +2 -2
  104. package/dist/behaviors/kb-trace.mjs +22 -3
  105. package/dist/behaviors/kb-visibility.d.mts +2 -2
  106. package/dist/behaviors/kb-visibility.mjs +14 -0
  107. package/dist/behaviors/kb-who-can.d.mts +2 -2
  108. package/dist/behaviors/kb-who-can.mjs +21 -2
  109. package/dist/behaviors/mentions.d.mts +1 -1
  110. package/dist/behaviors/mentions.mjs +14 -0
  111. package/dist/behaviors/modal.d.mts +1 -1
  112. package/dist/behaviors/modal.mjs +14 -0
  113. package/dist/behaviors/motion.d.mts +16 -0
  114. package/dist/behaviors/motion.mjs +39 -0
  115. package/dist/behaviors/notification.d.mts +2 -2
  116. package/dist/behaviors/notification.mjs +27 -3
  117. package/dist/behaviors/panel.mjs +14 -0
  118. package/dist/behaviors/scroll-area.d.mts +17 -0
  119. package/dist/behaviors/scroll-area.mjs +59 -0
  120. package/dist/behaviors/select.mjs +21 -2
  121. package/dist/behaviors/slider.mjs +3 -3
  122. package/dist/behaviors/split-pane.mjs +2 -0
  123. package/dist/behaviors/suggestions.mjs +14 -0
  124. package/dist/behaviors/tabs.mjs +10 -0
  125. package/dist/behaviors/tag-input.mjs +14 -0
  126. package/dist/behaviors/theme-switcher.d.mts +2 -2
  127. package/dist/behaviors/theme-switcher.mjs +30 -2
  128. package/dist/behaviors/theme.mjs +16 -2
  129. package/dist/behaviors/toast.d.mts +2 -2
  130. package/dist/behaviors/toast.mjs +14 -0
  131. package/dist/behaviors/tree-select.mjs +27 -0
  132. package/dist/behaviors/tree.mjs +4 -4
  133. package/dist/behaviors/upload.mjs +14 -0
  134. package/dist/behaviors/url-safety.d.mts +8 -0
  135. package/dist/behaviors/url-safety.mjs +11 -0
  136. package/dist/components/accordion.d.mts +2 -0
  137. package/dist/components/ai-branch.d.mts +2 -0
  138. package/dist/components/ai-chat.css +40 -33
  139. package/dist/components/ai-chat.d.mts +2 -0
  140. package/dist/components/ai-composer.d.mts +2 -0
  141. package/dist/components/ai-context.d.mts +2 -0
  142. package/dist/components/ai-context.mjs +1 -0
  143. package/dist/components/ai-diff.css +6 -6
  144. package/dist/components/ai-diff.d.mts +2 -0
  145. package/dist/components/ai-feedback.d.mts +2 -0
  146. package/dist/components/ai-files.d.mts +2 -0
  147. package/dist/components/ai-message.d.mts +2 -0
  148. package/dist/components/ai-panel.css +12 -10
  149. package/dist/components/ai-reasoning.d.mts +2 -0
  150. package/dist/components/ai-subagent.d.mts +2 -0
  151. package/dist/components/ai-subagent.mjs +1 -0
  152. package/dist/components/ai-threads.d.mts +2 -0
  153. package/dist/components/ai-todo.d.mts +2 -0
  154. package/dist/components/ai-todo.mjs +1 -0
  155. package/dist/components/ai-tool-call.d.mts +2 -0
  156. package/dist/components/ai-tool-call.mjs +1 -0
  157. package/dist/components/ai-tool.css +16 -16
  158. package/dist/components/ai-usage.d.mts +2 -0
  159. package/dist/components/alert.d.mts +2 -0
  160. package/dist/components/autocomplete.css +12 -12
  161. package/dist/components/autocomplete.d.mts +2 -0
  162. package/dist/components/avatar.d.mts +2 -0
  163. package/dist/components/back-top.css +47 -16
  164. package/dist/components/back-top.d.mts +2 -0
  165. package/dist/components/badge.css +1 -1
  166. package/dist/components/badge.d.mts +2 -0
  167. package/dist/components/breadcrumb.css +26 -8
  168. package/dist/components/breadcrumb.d.mts +2 -0
  169. package/dist/components/btn.css +67 -62
  170. package/dist/components/btn.d.mts +2 -0
  171. package/dist/components/card.css +22 -22
  172. package/dist/components/card.d.mts +2 -0
  173. package/dist/components/carousel.d.mts +2 -0
  174. package/dist/components/cascader.css +56 -35
  175. package/dist/components/cascader.d.mts +2 -0
  176. package/dist/components/chart-area.css +46 -0
  177. package/dist/components/chart-area.d.mts +2 -0
  178. package/dist/components/chart-bar.css +66 -19
  179. package/dist/components/chart-bar.d.mts +2 -0
  180. package/dist/components/chart-calendar.d.mts +2 -0
  181. package/dist/components/chart-gauge.css +23 -3
  182. package/dist/components/chart-gauge.d.mts +2 -0
  183. package/dist/components/chart-graph.css +15 -3
  184. package/dist/components/chart-graph.d.mts +2 -0
  185. package/dist/components/chart-heatmap.css +117 -95
  186. package/dist/components/chart-heatmap.d.mts +2 -0
  187. package/dist/components/chart-line.css +54 -0
  188. package/dist/components/chart-line.d.mts +2 -0
  189. package/dist/components/chart-map.d.mts +2 -0
  190. package/dist/components/chart-pie.css +29 -0
  191. package/dist/components/chart-pie.d.mts +2 -0
  192. package/dist/components/chart-radar.css +50 -1
  193. package/dist/components/chart-radar.d.mts +2 -0
  194. package/dist/components/chart-scatter.css +39 -2
  195. package/dist/components/chart-scatter.d.mts +2 -0
  196. package/dist/components/chart-sparkline.css +20 -0
  197. package/dist/components/chart-sparkline.d.mts +2 -0
  198. package/dist/components/chart-stack.css +16 -5
  199. package/dist/components/chart-stack.d.mts +2 -0
  200. package/dist/components/charts.css +109 -35
  201. package/dist/components/charts.d.mts +2 -0
  202. package/dist/components/code-block.css +10 -8
  203. package/dist/components/code-block.d.mts +2 -0
  204. package/dist/components/command-palette.css +45 -38
  205. package/dist/components/command-palette.d.mts +2 -0
  206. package/dist/components/content.css +62 -57
  207. package/dist/components/context-menu.d.mts +2 -0
  208. package/dist/components/copy.css +10 -10
  209. package/dist/components/copy.d.mts +2 -0
  210. package/dist/components/datatable.css +72 -59
  211. package/dist/components/datatable.d.mts +2 -0
  212. package/dist/components/date-picker.css +26 -26
  213. package/dist/components/date-picker.d.mts +2 -0
  214. package/dist/components/desc.d.mts +2 -0
  215. package/dist/components/dropdown.d.mts +2 -0
  216. package/dist/components/empty.css +16 -16
  217. package/dist/components/empty.d.mts +2 -0
  218. package/dist/components/feedback.css +31 -29
  219. package/dist/components/form-validate.css +20 -6
  220. package/dist/components/form-validate.d.mts +2 -0
  221. package/dist/components/form.css +17 -14
  222. package/dist/components/form.d.mts +2 -0
  223. package/dist/components/icon.css +21 -10
  224. package/dist/components/icon.d.mts +2 -0
  225. package/dist/components/input.css +22 -22
  226. package/dist/components/input.d.mts +2 -0
  227. package/dist/components/kb-access.d.mts +2 -0
  228. package/dist/components/kb-acl.d.mts +2 -0
  229. package/dist/components/kb-agent.css +134 -55
  230. package/dist/components/kb-answer.d.mts +2 -0
  231. package/dist/components/kb-audit.d.mts +2 -0
  232. package/dist/components/kb-canvas.d.mts +2 -0
  233. package/dist/components/kb-chain.d.mts +2 -0
  234. package/dist/components/kb-checkpoint.d.mts +2 -0
  235. package/dist/components/kb-chunks.d.mts +2 -0
  236. package/dist/components/kb-citation.d.mts +2 -0
  237. package/dist/components/kb-clarify.d.mts +2 -0
  238. package/dist/components/kb-conflict.d.mts +2 -0
  239. package/dist/components/kb-connector.d.mts +2 -0
  240. package/dist/components/kb-data.css +192 -80
  241. package/dist/components/kb-eval.d.mts +2 -0
  242. package/dist/components/kb-explain.d.mts +2 -0
  243. package/dist/components/kb-filter.d.mts +2 -0
  244. package/dist/components/kb-gap.d.mts +2 -0
  245. package/dist/components/kb-ground.css +165 -73
  246. package/dist/components/kb-hittest.d.mts +2 -0
  247. package/dist/components/kb-ingest.css +308 -113
  248. package/dist/components/kb-metadata.d.mts +2 -0
  249. package/dist/components/kb-ops.css +189 -75
  250. package/dist/components/kb-passage.d.mts +2 -0
  251. package/dist/components/kb-perm.css +158 -87
  252. package/dist/components/kb-pipeline.d.mts +2 -0
  253. package/dist/components/kb-qa.d.mts +2 -0
  254. package/dist/components/kb-rerank.d.mts +2 -0
  255. package/dist/components/kb-retrieval.d.mts +2 -0
  256. package/dist/components/kb-review.d.mts +2 -0
  257. package/dist/components/kb-sandbox.d.mts +2 -0
  258. package/dist/components/kb-search.css +353 -116
  259. package/dist/components/kb-segment.d.mts +2 -0
  260. package/dist/components/kb-sources.d.mts +2 -0
  261. package/dist/components/kb-sql.d.mts +2 -0
  262. package/dist/components/kb-trace.d.mts +2 -0
  263. package/dist/components/kb-visibility.d.mts +2 -0
  264. package/dist/components/kb-who-can.d.mts +2 -0
  265. package/dist/components/kb.css +60 -36
  266. package/dist/components/kb.d.mts +2 -0
  267. package/dist/components/kbd.d.mts +2 -0
  268. package/dist/components/layout.css +10 -10
  269. package/dist/components/layout.d.mts +2 -0
  270. package/dist/components/list.d.mts +2 -0
  271. package/dist/components/material-chinese.css +10 -0
  272. package/dist/components/material-soviet.css +10 -0
  273. package/dist/components/material.css +61 -18
  274. package/dist/components/media-card.d.mts +2 -0
  275. package/dist/components/media.css +22 -27
  276. package/dist/components/mentions.css +18 -17
  277. package/dist/components/mentions.d.mts +2 -0
  278. package/dist/components/menu.css +32 -28
  279. package/dist/components/modal.css +30 -27
  280. package/dist/components/modal.d.mts +2 -0
  281. package/dist/components/nav.css +48 -44
  282. package/dist/components/nav.d.mts +2 -0
  283. package/dist/components/notification.css +31 -25
  284. package/dist/components/notification.d.mts +2 -0
  285. package/dist/components/pagination.css +15 -13
  286. package/dist/components/pagination.d.mts +2 -0
  287. package/dist/components/panel.css +19 -20
  288. package/dist/components/panel.d.mts +2 -0
  289. package/dist/components/pill.css +8 -7
  290. package/dist/components/pill.d.mts +2 -0
  291. package/dist/components/popover.css +32 -23
  292. package/dist/components/popover.d.mts +2 -0
  293. package/dist/components/progress.d.mts +2 -0
  294. package/dist/components/rating.d.mts +2 -0
  295. package/dist/components/result.d.mts +2 -0
  296. package/dist/components/scroll-area.css +84 -112
  297. package/dist/components/scroll-area.d.mts +2 -0
  298. package/dist/components/scroll-area.mjs +1 -0
  299. package/dist/components/segmented.css +47 -29
  300. package/dist/components/segmented.d.mts +2 -0
  301. package/dist/components/select.css +80 -41
  302. package/dist/components/select.d.mts +2 -0
  303. package/dist/components/sidebar.css +42 -38
  304. package/dist/components/sidebar.d.mts +2 -0
  305. package/dist/components/skeleton.d.mts +2 -0
  306. package/dist/components/slider.css +26 -22
  307. package/dist/components/slider.d.mts +2 -0
  308. package/dist/components/spinner.d.mts +2 -0
  309. package/dist/components/split-pane.css +16 -7
  310. package/dist/components/split-pane.d.mts +2 -0
  311. package/dist/components/stat.css +17 -16
  312. package/dist/components/stat.d.mts +2 -0
  313. package/dist/components/steps.css +26 -26
  314. package/dist/components/steps.d.mts +2 -0
  315. package/dist/components/switch.css +78 -39
  316. package/dist/components/switch.d.mts +2 -0
  317. package/dist/components/table.css +54 -32
  318. package/dist/components/table.d.mts +2 -0
  319. package/dist/components/tabs.css +53 -32
  320. package/dist/components/tabs.d.mts +2 -0
  321. package/dist/components/tag-input.css +12 -8
  322. package/dist/components/tag-input.d.mts +2 -0
  323. package/dist/components/tag.css +20 -12
  324. package/dist/components/tag.d.mts +2 -0
  325. package/dist/components/theme-switcher.css +7 -7
  326. package/dist/components/theme-switcher.d.mts +2 -0
  327. package/dist/components/timeline.d.mts +2 -0
  328. package/dist/components/toast.css +34 -30
  329. package/dist/components/toast.d.mts +2 -0
  330. package/dist/components/toolbar.css +19 -18
  331. package/dist/components/toolbar.d.mts +2 -0
  332. package/dist/components/tooltip.css +9 -8
  333. package/dist/components/tooltip.d.mts +2 -0
  334. package/dist/components/tree-select.css +63 -40
  335. package/dist/components/tree-select.d.mts +2 -0
  336. package/dist/components/tree.d.mts +2 -0
  337. package/dist/components/upload.css +9 -11
  338. package/dist/components/upload.d.mts +2 -0
  339. package/dist/index.d.mts +85 -84
  340. package/dist/index.mjs +14644 -13935
  341. package/dist/react.d.mts +18 -18
  342. package/dist/react.mjs +377 -36
  343. package/dist/registry.json +797 -64
  344. package/dist/tokens/colors.css +6 -0
  345. package/dist/tokens/design.css +137 -31
  346. package/dist/tokens/dtcg.json +9592 -2008
  347. package/dist/tokens/figma.variables.json +7451 -2141
  348. package/dist/tokens/motion.css +51 -0
  349. package/dist/tokens/pixel.css +10 -0
  350. package/dist/tokens/scrollbars.css +40 -0
  351. package/dist/tokens/tokens-studio.json +8390 -1142
  352. package/dist/tokens/typography.css +33 -0
  353. package/dist/tokens.css +402 -82
  354. package/dist/ui.css +4196 -2163
  355. package/dist/vue.d.mts +17 -17
  356. package/dist/vue.mjs +371 -34
  357. package/docs/spec/charts-scale-a11y.md +115 -0
  358. package/docs/spec/design-philosophy.md +5 -5
  359. package/docs/spec/design-primitives.md +10 -10
  360. package/docs/spec/motion-typography.md +105 -0
  361. package/docs/spec/scrollbars.md +46 -0
  362. package/package.json +17 -3
package/dist/tokens.css CHANGED
@@ -359,6 +359,12 @@
359
359
  --icen-token-surface-glass: color-mix(in srgb, var(--icen-token-surface) var(--icen-design-glass-opacity), transparent);
360
360
  --icen-token-overlay-bg: var(--icen-token-surface-glass);
361
361
  --icen-token-scrollbar-size: 8px;
362
+ --icen-token-scrollbar-size-sm: 6px;
363
+ --icen-token-scrollbar-size-lg: 12px;
364
+ --icen-token-scrollbar-inset: 2px;
365
+ --icen-token-scrollbar-gutter: auto;
366
+ --icen-token-scrollbar-idle-delay: 900ms;
367
+ --icen-token-scrollbar-fade-duration: var(--icen-duration-normal);
362
368
  --icen-token-scrollbar-track: transparent;
363
369
  --icen-token-scrollbar-thumb: color-mix(in srgb, var(--icen-design-ink) 22%, transparent);
364
370
  --icen-token-scrollbar-thumb-hover: color-mix(in srgb, var(--icen-design-ink) 38%, transparent);
@@ -394,6 +400,46 @@
394
400
  }
395
401
 
396
402
 
403
+ /* ── tokens/scrollbars.css ── */
404
+ /* Policy slots inherit across a component subtree; activity never inherits.
405
+ Without the optional behavior, auto/scroll retain a visible fallback. */
406
+ :where([data-icen-scrollbars-ready]) {
407
+ --icen-scrollbar-auto-idle: 0%;
408
+ --icen-scrollbar-idle: var(--icen-scrollbar-auto-idle);
409
+ --icen-scrollbar-hover: var(--icen-scrollbar-auto-idle);
410
+ }
411
+ :where([data-icen-scrollbars='auto'], [data-icen-scrollbars='scroll']) {
412
+ --icen-scrollbar-idle: var(--icen-scrollbar-auto-idle, 100%);
413
+ --icen-scrollbar-hover: 100%;
414
+ --icen-scrollbar-active: 100%;
415
+ --icen-scrollbar-width: thin;
416
+ --icen-scrollbar-webkit-width: auto;
417
+ --icen-scrollbar-display: block;
418
+ }
419
+ :where([data-icen-scrollbars='scroll']) {
420
+ --icen-scrollbar-hover: var(--icen-scrollbar-auto-idle, 100%);
421
+ }
422
+ :where([data-icen-scrollbars='visible']) {
423
+ --icen-scrollbar-idle: 100%;
424
+ --icen-scrollbar-hover: 100%;
425
+ --icen-scrollbar-active: 100%;
426
+ --icen-scrollbar-width: thin;
427
+ --icen-scrollbar-webkit-width: auto;
428
+ --icen-scrollbar-display: block;
429
+ }
430
+ :where([data-icen-scrollbars='hidden']) {
431
+ --icen-scrollbar-idle: 0%;
432
+ --icen-scrollbar-hover: 0%;
433
+ --icen-scrollbar-active: 0%;
434
+ --icen-scrollbar-width: none;
435
+ --icen-scrollbar-webkit-width: none;
436
+ --icen-scrollbar-display: none;
437
+ }
438
+ :where([data-icen-scrollbar-gutter='stable']) { --icen-token-scrollbar-gutter: stable; }
439
+ :where([data-icen-scrollbar-gutter='both-edges']) { --icen-token-scrollbar-gutter: stable both-edges; }
440
+ :where([data-icen-scrollbar-gutter='auto']) { --icen-token-scrollbar-gutter: auto; }
441
+
442
+
397
443
  /* ── tokens/style-profiles.css ── */
398
444
  /* Shared fallback defaults. Built-in primitive recipes live in design/pixel/chinese/soviet.css. */
399
445
  :root {
@@ -475,6 +521,33 @@
475
521
  --icen-line-height-body: 1.7;
476
522
  /* 独家定义(style-profiles.css 的 :root 不再重复;profile 差异化在各 .style-* 块覆盖) */
477
523
  --icen-line-height-heading: 1.2;
524
+
525
+ /* ── 内容排版尺度(模块比例 1.250 大三度,clamp 流体插值) ──
526
+ 面向内容/文档排版(标题、正文、长文);控件字号仍由 --icen-density-font-size-* 驱动,
527
+ 两套尺度解耦:密度档只压缩控件,不挤压阅读。DTCG 无法表示 clamp() → 明示跳过。 */
528
+ --icen-type-ratio: 1.25;
529
+ --icen-type-xs: clamp(.6875rem, .66rem + .12vw, .75rem);
530
+ --icen-type-sm: clamp(.7813rem, .74rem + .18vw, .9rem);
531
+ --icen-type-md: clamp(.875rem, .82rem + .24vw, 1rem);
532
+ --icen-type-lg: clamp(1rem, .92rem + .36vw, 1.25rem);
533
+ --icen-type-xl: clamp(1.25rem, 1.1rem + .66vw, 1.5625rem);
534
+ --icen-type-2xl: clamp(1.5625rem, 1.32rem + 1.05vw, 1.9531rem);
535
+ --icen-type-3xl: clamp(1.9531rem, 1.56rem + 1.7vw, 2.4414rem);
536
+
537
+ /* ── 行高 / 字距 / 字重尺度(角色别名 --icen-line-height-body 等保留;本组供新组件与内容区) ── */
538
+ --icen-leading-tight: 1.3; /* 大字号标题 */
539
+ --icen-leading-base: 1.6; /* 正文:拉丁与 CJK 混排的安全下限 */
540
+ --icen-leading-loose: 1.8; /* 长文/文档页 */
541
+ --icen-tracking-tight: -.02em; /* 大号拉丁标题收紧;CJK 不用(CJK 字距一律 0) */
542
+ --icen-tracking-base: 0;
543
+ --icen-tracking-wide: .04em; /* 眉标/小型大写 */
544
+ --icen-weight-regular: 400;
545
+ --icen-weight-medium: 500;
546
+ --icen-weight-semibold: 600;
547
+ --icen-weight-bold: 700;
548
+
549
+ /* ── 数据区 OpenType 特性(.icen-numeric / .icen-font-math 之外的增量入口) ── */
550
+ --icen-feature-data: "tnum" 1, "lnum" 1;
478
551
  }
479
552
 
480
553
  /* ── 全局排版 ── */
@@ -498,66 +571,215 @@ h1, h2, h3, h4, h5, h6 {
498
571
  font-variant-numeric: lining-nums tabular-nums;
499
572
  }
500
573
 
574
+ /* ── CJK 标点挤压:渐进增强(text-spacing-trim,Chrome 123+)。
575
+ 不支持时保持浏览器默认——不 polyfill,不猜不静默,此处是有意声明的可降级增强。 ── */
576
+ @supports (text-spacing-trim: trim-start) {
577
+ body { text-spacing-trim: trim-start; }
578
+ }
579
+
580
+
581
+ /* ── tokens/motion.css ── */
582
+ /*
583
+ * @icen.ai/ui — Motion Tokens(动效令牌层)
584
+ * 时长阶梯 / 缓动集 / 位移与缩放幅度 / 编排间隔。组件只消费令牌,不写死时长与曲线。
585
+ *
586
+ * 消费路径:
587
+ * 组件读语义别名 --icen-duration-* / --icen-ease-*(design.css 映射到本层 × --icen-design-motion);
588
+ * 新组件可直接读 --icen-motion-*(绝对基值,不经缩放)。
589
+ * 降级链:prefers-reduced-motion 或 <html data-icen-motion="reduce"> → base.css 把
590
+ * --icen-design-motion 归零(过渡瞬时完成,状态反馈保留)+ 循环动画单次瞬时 + 平滑滚动关闭;
591
+ * data-icen-motion="full" 可强制恢复(演示机 / 用户显式选择)。
592
+ * 原语联动:pixel 原语把本层缓动全部改写为 steps(1, end)(点阵逐帧美学)。
593
+ * DTCG:duration / cubicBezier / dimension / number 各族经 scripts/dtcg.mjs 导出;
594
+ * linear() / steps() / clamp() 超经典版规范,明示跳过(记录在 dtcg.json 的 ai.icen.skipped)。
595
+ */
596
+ :root {
597
+ /* ── 时长阶梯(基值;语义别名经 --icen-design-motion 缩放) ── */
598
+ --icen-motion-duration-instant: 0ms; /* 即时:无动画状态切换(像素原语全量) */
599
+ --icen-motion-duration-fast: 110ms; /* 微反馈:hover / press / 焦点环 */
600
+ --icen-motion-duration-base: 180ms; /* 常规:展开收起、淡入淡出、勾选 */
601
+ --icen-motion-duration-slow: 260ms; /* 浮层进出、面板滑入、modal */
602
+ --icen-motion-duration-deliberate: 420ms; /* 页面级转场、强调入场(克制使用) */
603
+
604
+ /* ── 缓动集 ── */
605
+ --icen-motion-ease-standard: cubic-bezier(.45, 0, .25, 1); /* 持续类状态变化 */
606
+ --icen-motion-ease-enter: cubic-bezier(.16, 1, .3, 1); /* 入场:快出慢归 */
607
+ --icen-motion-ease-exit: cubic-bezier(.4, 0, 1, 1); /* 离场:快进加速 */
608
+ --icen-motion-ease-emphasized: cubic-bezier(.22, .8, .24, 1); /* 强调:长减速弧 */
609
+ --icen-motion-ease-spring: cubic-bezier(.22, .8, .24, 1); /* 弹簧近似;支持 linear() 时由下方覆盖 */
610
+
611
+ /* ── 幅度(位移/缩放令牌:编排一致的物理量) ── */
612
+ --icen-motion-shift-sm: 2px; /* 行内微移(列表项 hover) */
613
+ --icen-motion-shift-md: 6px; /* 浮层/气泡入场位移 */
614
+ --icen-motion-shift-lg: 12px; /* 抽屉/面板入场位移 */
615
+ --icen-motion-scale-enter: .96; /* 弹层入场起始缩放 */
616
+ --icen-motion-scale-press: .985; /* 按下形变 */
617
+
618
+ /* ── 编排(stagger:列表/卡片瀑布入场) ── */
619
+ --icen-motion-stagger-step: 24ms; /* 相邻项延迟步长 */
620
+ --icen-motion-stagger-count: 5; /* 最多级联项数(超出同拍,避免长尾等待) */
621
+ }
622
+
623
+ /* damped spring 近似(过冲 ≈8%):linear() 停点语法(Chrome 113+ / Safari 17.2+ / FF 112+)。
624
+ 不支持时保持上方 emphasized 回退——不猜不静默之外,这里是有意声明的可降级增强。 */
625
+ @supports (transition-timing-function: linear(0, 1)) {
626
+ :root {
627
+ --icen-motion-ease-spring: linear(0, .42, .78, 1, 1.08, .96, 1.02, 1);
628
+ }
629
+ }
630
+
501
631
 
502
632
  /* ── tokens/design.css ── */
503
- /* 现代 primitive: geometry, type, rhythm and lighting. Color palettes live in themes.json. */
633
+ /* 现代 primitive: geometry, type, rhythm and lighting. Color palettes live in themes.json.
634
+ *
635
+ * The default primitive describes a precise desktop application surface: compact
636
+ * controls, restrained type, layered neutral surfaces and short, purposeful
637
+ * feedback. All values are semantic inputs; components never hardcode them.
638
+ * Other primitives (chinese / soviet / pixel) override this file's seeds and keep
639
+ * their own identity, so every rule here remains palette- and primitive-safe.
640
+ */
504
641
  :root {
642
+ /* ── Control geometry ── */
505
643
  --icen-design-radius: 10px;
506
644
  --icen-design-space: 4px;
507
- --icen-design-control-height: 40px;
508
- --icen-design-font-size: 14px;
509
- --icen-design-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
510
- --icen-design-glass-blur: 20px;
645
+ --icen-design-control-height: 34px;
646
+ --icen-design-font-size: 13px;
647
+ --icen-design-font: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI Variable Text',
648
+ 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
649
+ --icen-design-glass-blur: 24px;
511
650
  --icen-design-motion: 1;
512
- }
513
651
 
514
- /* Materials and geometry belong to the primitive, across every palette. */
652
+ /* Semantic aliases consumed by component CSS. The height scale follows the
653
+ * active density; the aliases exist so components read intent, not arithmetic. */
654
+ --icen-control-height-sm: var(--icen-density-input-height-sm);
655
+ --icen-control-height-md: var(--icen-density-input-height-md);
656
+ --icen-control-height-lg: var(--icen-density-input-height-lg);
657
+ --icen-control-radius-sm: var(--icen-radius-sm);
658
+ --icen-control-radius: var(--icen-radius-sm);
659
+ --icen-control-radius-lg: var(--icen-radius-md);
660
+ --icen-control-padding-inline-sm: 9px;
661
+ --icen-control-padding-inline: 12px;
662
+ --icen-control-padding-inline-lg: 16px;
663
+ --icen-field-padding-inline: 9px;
664
+ --icen-field-padding-inline-sm: 8px;
665
+ --icen-control-gap: 6px;
666
+ --icen-control-gap-sm: 4px;
667
+ --icen-control-icon: 15px;
668
+ --icen-control-border-width: 1px;
669
+
670
+ /* Type roles. Sizes stay on the density scale; these aliases name the role. */
671
+ --icen-font-size-title: var(--icen-density-font-size-lg);
672
+ --icen-font-size-section: var(--icen-density-font-size-md);
673
+ --icen-font-size-control: var(--icen-density-font-size-md);
674
+ --icen-font-size-caption: var(--icen-density-font-size-xs);
675
+ --icen-font-weight-control: 500;
676
+ --icen-font-weight-title: 600;
677
+ --icen-font-weight-label: 500;
678
+ --icen-letter-spacing-control: -.006em;
679
+ --icen-letter-spacing-caption: .01em;
680
+
681
+ /* Motion: one-shot state changes are short; spatial entrances use the enter
682
+ * curve. No bouncy physics for ordinary controls.
683
+ * 语义别名 → tokens/motion.css 基值 × --icen-design-motion(reduced-motion / pixel 原语归零)。 */
684
+ --icen-duration-instant: calc(var(--icen-motion-duration-instant) * var(--icen-design-motion));
685
+ --icen-duration-fast: calc(var(--icen-motion-duration-fast) * var(--icen-design-motion));
686
+ --icen-duration-normal: calc(var(--icen-motion-duration-base) * var(--icen-design-motion));
687
+ --icen-duration-slow: calc(var(--icen-motion-duration-slow) * var(--icen-design-motion));
688
+ --icen-duration-deliberate: calc(var(--icen-motion-duration-deliberate) * var(--icen-design-motion));
689
+ --icen-ease-out: var(--icen-motion-ease-emphasized);
690
+ --icen-ease-in: cubic-bezier(.5, 0, .8, .2);
691
+ --icen-ease-in-out: var(--icen-motion-ease-standard);
692
+ --icen-ease-enter: var(--icen-motion-ease-enter);
693
+ --icen-ease-exit: var(--icen-motion-ease-exit);
694
+ --icen-ease-bounce: var(--icen-ease-out);
695
+ --icen-hover-border: var(--icen-token-line);
696
+ --icen-hover-border-strong: var(--icen-token-line-strong);
697
+ --icen-press: scale(.985);
698
+ --icen-press-soft: none;
699
+ --icen-disabled-opacity: .45;
700
+ --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px color-mix(in srgb, var(--icen-token-accent) 62%, transparent);
701
+ --icen-ring-soft: 0 0 0 3px color-mix(in srgb, var(--icen-token-accent) 18%, transparent);
702
+ --icen-control-focus-border: color-mix(in srgb, var(--icen-token-accent) 62%, var(--icen-token-line));
703
+ --icen-control-focus-shadow: inset 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) 8%, transparent), 0 0 0 3px color-mix(in srgb, var(--icen-token-accent) 18%, transparent);
704
+
705
+ /* Material motion: chrome and floating surfaces share a blur radius family. */
706
+ --icen-material-blur-chrome: 18px;
707
+ --icen-material-blur-floating: 28px;
708
+ --icen-material-saturate: 1.4;
709
+ }
710
+
711
+ /* Materials and geometry belong to the primitive, across every palette.
712
+ * Recompute the whole derived surface at each palette/theme boundary so an
713
+ * inherited resolved value can never freeze across a theme switch. */
515
714
  :root, [data-icen-preset], [data-icen-theme="dark"] {
715
+ /* Surface hierarchy: canvas → content → chrome → floating → modal. Chrome and
716
+ * toolbar sit between canvas and content; selected rows are a tinted content
717
+ * surface, not a second card. */
718
+ --icen-token-surface-chrome: color-mix(in srgb, var(--icen-design-canvas) 46%, var(--icen-design-surface));
719
+ --icen-token-surface-toolbar: color-mix(in srgb, var(--icen-design-canvas) 38%, var(--icen-design-surface));
720
+ --icen-token-surface-sidebar: color-mix(in srgb, var(--icen-design-canvas) 66%, var(--icen-design-surface));
721
+ --icen-token-surface-content: var(--icen-design-surface);
722
+ --icen-token-surface-raised: var(--icen-design-raised);
723
+ --icen-token-surface-pressed: color-mix(in srgb, var(--icen-design-ink) 8%, var(--icen-design-surface));
724
+ --icen-token-surface-selected: var(--icen-token-accent-subtle);
725
+
726
+ /* Interaction fills. Hover is a hint, pressed a physical push, selected a
727
+ * persistent state; none of them is used as a substitute for another. */
728
+ --icen-token-fill-hover: color-mix(in srgb, var(--icen-design-ink) 5%, transparent);
729
+ --icen-token-fill-pressed: color-mix(in srgb, var(--icen-design-ink) 9%, transparent);
730
+ --icen-token-fill-selected: color-mix(in srgb, var(--icen-design-accent) 13%, transparent);
731
+ --icen-token-separator-soft: var(--icen-token-line-soft);
732
+ --icen-token-separator: var(--icen-token-line);
733
+ --icen-token-separator-strong: var(--icen-token-line-strong);
734
+ --icen-token-focus-indicator: color-mix(in srgb, var(--icen-token-accent) 62%, transparent);
735
+ --icen-token-control-border: color-mix(in srgb, var(--icen-design-ink) 19%, transparent);
736
+ --icen-token-control-border-hover: color-mix(in srgb, var(--icen-design-ink) 28%, transparent);
516
737
  --icen-token-surface-glass: color-mix(in srgb, var(--icen-token-surface) var(--icen-design-glass-opacity), transparent);
738
+ --icen-token-surface-glass-chrome: color-mix(in srgb, var(--icen-token-surface-toolbar) 88%, transparent);
739
+
517
740
  /* Contact, near-field and ambient shadows share a light source. Negative
518
741
  * spread keeps the shadow under the object instead of fogging its outline. */
519
- --icen-token-shadow-card: 0 1px 2px -1px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent), 0 4px 10px -5px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .7), transparent), 0 12px 24px -12px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .5), transparent);
520
- --icen-token-shadow-elevated: 0 1px 3px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .75), transparent), 0 8px 20px -8px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent), 0 24px 48px -16px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent);
521
- --icen-token-shadow-overlay: 0 2px 6px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent), 0 16px 36px -12px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * 1.2), transparent), 0 40px 88px -24px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * 1.2), transparent);
742
+ --icen-token-shadow-card:
743
+ 0 1px 1px -1px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .5), transparent),
744
+ 0 3px 8px -4px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .55), transparent),
745
+ 0 10px 24px -16px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .45), transparent);
746
+ --icen-token-shadow-elevated:
747
+ 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .55), transparent),
748
+ 0 8px 20px -8px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .8), transparent),
749
+ 0 26px 52px -22px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent);
750
+ --icen-token-shadow-overlay:
751
+ 0 2px 6px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .7), transparent),
752
+ 0 16px 36px -12px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * 1.1), transparent),
753
+ 0 44px 88px -28px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * 1.15), transparent);
754
+ --icen-token-shadow-control:
755
+ inset 0 1px 0 color-mix(in srgb, var(--icen-token-top-highlight) 55%, transparent),
756
+ 0 1px 1.5px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .38), transparent);
757
+ --icen-token-shadow-field: inset 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .3), transparent);
522
758
  --icen-token-top-highlight: color-mix(in srgb, var(--icen-design-light) var(--icen-design-highlight-strength), transparent);
523
759
  --icen-token-shadow-inset: inset 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .35), transparent), inset 0 -1px 0 color-mix(in srgb, var(--icen-token-top-highlight) 45%, transparent);
524
760
  --icen-token-shadow-popover: var(--icen-token-shadow-elevated);
525
761
  --icen-token-material-edge: color-mix(in srgb, var(--icen-token-text) var(--icen-design-edge-strength), transparent);
526
762
  --icen-token-material-light: inset 0 1px 0 var(--icen-token-top-highlight), inset 0 -1px 0 color-mix(in srgb, var(--icen-token-top-highlight) 18%, transparent);
527
- --icen-token-scrim: color-mix(in srgb, var(--icen-design-shadow-color) 32%, transparent);
763
+ --icen-token-scrim: color-mix(in srgb, var(--icen-design-shadow-color) 38%, transparent);
528
764
  }
529
765
 
530
766
  :root {
531
767
  --icen-design-light: #ffffff;
532
- --icen-radius-xs: max(0px, calc(var(--icen-design-radius) - 6px));
768
+ --icen-radius-xs: max(0px, calc(var(--icen-design-radius) - 5px));
533
769
  --icen-radius-sm: max(0px, calc(var(--icen-design-radius) - 2px));
534
770
  --icen-radius-md: var(--icen-design-radius);
535
- --icen-radius-lg: calc(var(--icen-design-radius) + 6px);
536
- --icen-radius-xl: calc(var(--icen-design-radius) + 14px);
771
+ --icen-radius-lg: calc(var(--icen-design-radius) + 4px);
772
+ --icen-radius-xl: calc(var(--icen-design-radius) + 10px);
537
773
  --icen-radius-full: 999px;
538
774
  --icen-font-body: var(--icen-design-font);
539
775
  --icen-font-heading: var(--icen-design-font);
540
776
  --icen-font-cjk: var(--icen-design-font);
541
- --icen-font-mono: ui-monospace, SFMono-Regular, Consolas, monospace;
777
+ --icen-font-mono: ui-monospace, 'SF Mono', SFMono-Regular, 'Cascadia Mono', 'Segoe UI Mono', Consolas, monospace;
542
778
  --icen-font-mono-paper: var(--icen-font-mono);
543
- --icen-line-height-body: 1.55;
779
+ --icen-line-height-body: 1.5;
544
780
  --icen-line-height-heading: 1.25;
545
781
  --icen-letter-spacing-body: 0;
546
- --icen-letter-spacing-heading: -.02em;
547
- --icen-duration-fast: calc(120ms * var(--icen-design-motion));
548
- --icen-duration-normal: calc(180ms * var(--icen-design-motion));
549
- --icen-duration-slow: calc(260ms * var(--icen-design-motion));
550
- --icen-ease-out: cubic-bezier(.16, 1, .3, 1);
551
- --icen-ease-bounce: var(--icen-ease-out);
552
- --icen-hover-border: var(--icen-token-line);
553
- --icen-hover-border-strong: var(--icen-token-line-strong);
554
- --icen-press: scale(.985);
555
- --icen-press-soft: scale(.99);
556
- --icen-disabled-opacity: .48;
557
- --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
558
- --icen-ring-soft: 0 0 0 3px var(--icen-token-accent-subtle);
559
- --icen-control-focus-border: var(--icen-token-accent);
560
- --icen-control-focus-shadow: var(--icen-token-shadow-inset), var(--icen-ring-soft);
782
+ --icen-letter-spacing-heading: -.015em;
561
783
  }
562
784
 
563
785
  /* Density changes rhythm and row height, never shrinks reading text. Re-declare
@@ -578,6 +800,12 @@ h1, h2, h3, h4, h5, h6 {
578
800
  --icen-density-input-height-sm: max(28px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset) - 8px));
579
801
  --icen-density-input-height-md: calc(var(--icen-design-control-height) + var(--icen-design-density-offset));
580
802
  --icen-density-input-height-lg: calc(var(--icen-design-control-height) + var(--icen-design-density-offset) + 8px);
803
+ --icen-density-item-height: max(24px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset) - 6px));
804
+ /* 控件高度别名必须在密度边界重新声明:只写在 :root 会在根上解析成固定值,
805
+ * 之后嵌套 [data-icen-density] 覆盖密度时不再联动。 */
806
+ --icen-control-height-sm: var(--icen-density-input-height-sm);
807
+ --icen-control-height-md: var(--icen-density-input-height-md);
808
+ --icen-control-height-lg: var(--icen-density-input-height-lg);
581
809
  --icen-density-font-size-2xs: max(12px, calc(var(--icen-design-font-size) - 2px));
582
810
  --icen-density-font-size-xs: max(12px, calc(var(--icen-design-font-size) - 2px));
583
811
  --icen-density-font-size-sm: max(12px, calc(var(--icen-design-font-size) - 1px));
@@ -585,6 +813,10 @@ h1, h2, h3, h4, h5, h6 {
585
813
  --icen-density-font-size-lg: calc(var(--icen-design-font-size) + 2px);
586
814
  --icen-density-font-size-xl: calc(var(--icen-design-font-size) + 6px);
587
815
  --icen-density-font-size-2xl: calc(var(--icen-design-font-size) + 12px);
816
+ --icen-font-size-title: var(--icen-density-font-size-lg);
817
+ --icen-font-size-section: var(--icen-density-font-size-md);
818
+ --icen-font-size-control: var(--icen-density-font-size-md);
819
+ --icen-font-size-caption: var(--icen-density-font-size-xs);
588
820
  }
589
821
  :root[data-icen-density="compact"],
590
822
  :root [data-icen-density="compact"] {
@@ -601,11 +833,15 @@ h1, h2, h3, h4, h5, h6 {
601
833
  --icen-density-input-height-sm: max(44px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset) - 8px));
602
834
  --icen-density-input-height-md: max(44px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset)));
603
835
  --icen-density-input-height-lg: max(44px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset) + 8px));
836
+ --icen-density-item-height: max(44px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset) - 6px));
604
837
  }
605
838
  }
839
+ /* reduced-motion:本原语时长乘数归零(唯一的变量开关点;base.css 负责动画/滚动压制)。
840
+ 手动覆盖:data-icen-motion="full" 在系统降级时恢复;"reduce" 无需系统设置即降级。 */
606
841
  @media (prefers-reduced-motion: reduce) {
607
- :root { --icen-design-motion: 0; }
842
+ :root:not([data-icen-motion="full"]) { --icen-design-motion: 0; }
608
843
  }
844
+ :root[data-icen-motion="reduce"] { --icen-design-motion: 0; }
609
845
 
610
846
 
611
847
  /* ── tokens/chinese.css ── */
@@ -741,6 +977,16 @@ h1, h2, h3, h4, h5, h6 {
741
977
  --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
742
978
  --icen-ring-soft: 0 0 0 2px var(--icen-token-accent);
743
979
  --icen-control-focus-shadow: 0 0 0 2px var(--icen-token-accent);
980
+ /* shadow-inset 被本原语置 none,base.css 合成的 error 版会变成非法的「none, …」
981
+ 列表 → 整条 box-shadow 失效:像素原语自持一份硬边错误光环 */
982
+ --icen-control-error-shadow: 0 0 0 2px var(--icen-token-error);
983
+ /* 点阵逐帧美学:动效令牌层全部改写为 steps(时长已由 --icen-design-motion: 0 归零,
984
+ 缓动改写面向直接消费 --icen-motion-ease-* 的新组件,双保险) */
985
+ --icen-motion-ease-standard: steps(1, end);
986
+ --icen-motion-ease-enter: steps(1, end);
987
+ --icen-motion-ease-exit: steps(1, end);
988
+ --icen-motion-ease-emphasized: steps(1, end);
989
+ --icen-motion-ease-spring: steps(1, end);
744
990
  --icen-ease-out: steps(1, end);
745
991
  --icen-ease-bounce: steps(1, end);
746
992
  }
@@ -829,17 +1075,21 @@ h1, h2, h3, h4, h5, h6 {
829
1075
  @layer icen.components {
830
1076
  /* Material contract (default 现代 primitive; theme via data-icen-preset):
831
1077
  * <section data-icen-material="content|chrome|floating">arbitrary content</section>
832
- * content = opaque reading; chrome = translucent navigation; floating = temporary
1078
+ * content = opaque reading; chrome = navigation; floating = temporary
833
1079
  * operations. HTML primitives need no JS. Existing components consume the same
834
1080
  * recipes automatically. Force opaque via html[data-icen-transparency="reduced"].
835
1081
  * This file ships with tokens.css as well as ui.css; kit consumers need no extras.
1082
+ *
1083
+ * 分层登记(guard: tier-direction 文件级白名单):材料适配是横切层——选中态/磨砂
1084
+ * 配方覆盖 .icen-ai-composer-popup* 与 .icen-kb-checkpoint-menu-item 等 Beta 类名;
1085
+ * Beta 类名变更对本文件仅静默降级,不破坏 Core 用户,故允许 Core 引用 Beta。
836
1086
  */
837
1087
  /* The base layer also defines interaction defaults. Keep the primitive's
838
1088
  * interaction recipe in the components layer so separately imported base.css
839
1089
  * cannot quietly restore a different press/focus model. */
840
1090
  :root:where(:not([data-icen-style]),[data-icen-style="modern"]) {
841
1091
  --icen-press: scale(.985);
842
- --icen-press-soft: scale(.99);
1092
+ --icen-press-soft: none;
843
1093
  --icen-hover-border: var(--icen-token-line);
844
1094
  --icen-hover-border-strong: var(--icen-token-line-strong);
845
1095
  --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
@@ -951,23 +1201,21 @@ h1, h2, h3, h4, h5, h6 {
951
1201
  }
952
1202
  :root .icen-nav { box-shadow: var(--icen-token-material-light); }
953
1203
  :root .icen-btn {
954
- --btn-border-hover: var(--icen-token-line);
955
- gap: var(--icen-density-space-sm);
956
- border-radius: var(--icen-radius-md);
957
- letter-spacing: 0;
1204
+ --btn-border-hover: var(--icen-hover-border);
1205
+ gap: var(--icen-control-gap);
1206
+ border-radius: var(--icen-control-radius);
1207
+ letter-spacing: var(--icen-letter-spacing-control);
958
1208
  }
959
1209
  :root .icen-btn-primary { --btn-border-hover: var(--icen-token-accent-strong); }
960
1210
  :root :is(.icen-btn-ghost,.icen-btn-link) { --btn-border-hover: transparent; }
961
1211
  :root .icen-btn-link { --btn-fg: var(--icen-token-accent-text); }
962
- :root .icen-btn-primary:hover:not(:focus-visible) { box-shadow: none; }
963
- :root .icen-btn:active:not(:disabled):not([aria-disabled="true"]):not([data-icen-disabled]):not(.is-loading) { transform: var(--icen-press-soft); }
964
- :root .icen-btn-danger:hover { color: var(--icen-token-error); background: var(--icen-token-error-muted); }
965
- :root .icen-segmented { padding: var(--icen-density-space-xs); gap: var(--icen-density-space-xs); }
966
- :root .icen-segmented-item { border-radius: max(0px, calc(var(--icen-radius-md) - var(--icen-density-space-xs) - 1px)); }
1212
+ :root .icen-btn-danger:hover:not(:disabled) { color: var(--icen-token-error); background: var(--icen-token-error-muted); }
1213
+ :root .icen-segmented { padding: 3px; gap: 2px; }
1214
+ :root .icen-segmented-item { border-radius: max(0px, calc(var(--icen-radius-md) - 4px)); }
967
1215
  :root :is(.icen-segmented-item.is-active,.icen-segmented-item[aria-checked="true"],.icen-toggle-group-btn.is-active) {
968
1216
  background: var(--icen-token-surface);
969
1217
  color: var(--icen-token-text);
970
- box-shadow: var(--icen-token-shadow-card);
1218
+ box-shadow: var(--icen-token-shadow-control);
971
1219
  }
972
1220
  :root :is(.icen-menu,.icen-popover,.icen-select-panel) { border-radius: var(--icen-radius-lg); }
973
1221
  :root .icen-modal {
@@ -980,33 +1228,74 @@ h1, h2, h3, h4, h5, h6 {
980
1228
  -webkit-backdrop-filter: none;
981
1229
  }
982
1230
  :root .icen-card--elevated { box-shadow: var(--icen-token-shadow-card); }
983
- :root .icen-card--interactive:hover { transform: none; border-color: var(--icen-token-line); }
1231
+ :root .icen-card--interactive:hover { transform: none; border-color: var(--icen-token-control-border-hover); }
984
1232
  :root .icen-card--interactive:focus-within { box-shadow: var(--icen-ring); }
985
- :root .icen-switch-thumb { background: var(--icen-token-text-muted); }
986
- :root .icen-switch[aria-checked="true"] .icen-switch-thumb { background: var(--icen-token-on-accent); }
987
- :root .icen-input-wrap--sm { padding-inline: var(--icen-density-space-sm); }
988
1233
  /* 现代: small controls have a legible edge and a quiet, tactile surface. Keep
989
1234
  * these optical refinements local to the default primitive; other primitives
990
1235
  * supply their own surface physics without fighting a global component rule. */
991
1236
  :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:not(.icen-btn-ghost):not(.icen-btn-link) {
992
- box-shadow: inset 0 1px 0 color-mix(in srgb, var(--icen-token-top-highlight) 45%, transparent), 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .35), transparent);
1237
+ background-image: linear-gradient(
1238
+ to bottom,
1239
+ color-mix(in srgb, var(--icen-token-top-highlight) 32%, transparent),
1240
+ transparent 52%
1241
+ );
1242
+ box-shadow: var(--icen-token-shadow-control);
1243
+ }
1244
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn-primary {
1245
+ background-image: linear-gradient(
1246
+ to bottom,
1247
+ color-mix(in srgb, var(--icen-token-top-highlight) 16%, transparent),
1248
+ transparent 58%
1249
+ );
993
1250
  }
994
1251
  :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:focus-visible {
995
1252
  box-shadow: var(--icen-ring);
996
1253
  }
1254
+ /* Stable opaque planes keep content readable over any application backdrop. */
1255
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav,.icen-toast,.icen-notification,.icen-chart-tooltip,.icen-back-top,.icen-carousel-arrow) {
1256
+ background: var(--icen-token-surface);
1257
+ backdrop-filter: none;
1258
+ -webkit-backdrop-filter: none;
1259
+ }
1260
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) [data-icen-material="chrome"] {
1261
+ background: var(--icen-token-surface-toolbar);
1262
+ }
1263
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-nav.is-scrolled {
1264
+ background: var(--icen-token-surface-toolbar);
1265
+ }
1266
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) :is(.icen-card-tag,.icen-media-card-overlay,.icen-carousel-dot,.icen-carousel-index,.icen-spinner-overlay) {
1267
+ backdrop-filter: none;
1268
+ -webkit-backdrop-filter: none;
1269
+ }
997
1270
  :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:active:not(:disabled):not([aria-disabled="true"]):not([data-icen-disabled]):not(.is-loading) {
1271
+ background-image: none;
998
1272
  box-shadow: var(--icen-token-shadow-inset);
999
1273
  }
1000
1274
  :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:active:focus-visible {
1001
1275
  box-shadow: var(--icen-token-shadow-inset), var(--icen-ring);
1002
1276
  }
1003
1277
  :root:where(:not([data-icen-style]),[data-icen-style="modern"]) :is(.icen-input-wrap,.icen-textarea-wrap) {
1004
- padding-inline: var(--icen-density-space-md);
1278
+ padding-inline: var(--icen-field-padding-inline);
1279
+ padding-block: 0;
1005
1280
  }
1006
1281
  :root:where(:not([data-icen-style]),[data-icen-style="modern"]) :is(.icen-input,.icen-textarea)::placeholder {
1007
1282
  color: var(--icen-token-text-faint);
1008
1283
  opacity: 1;
1009
1284
  }
1285
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-segmented {
1286
+ background: var(--icen-token-surface-raised);
1287
+ border-color: var(--icen-token-line-soft);
1288
+ box-shadow: none;
1289
+ }
1290
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-segmented-item.is-active,
1291
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-segmented-item[aria-checked="true"] {
1292
+ border: 1px solid color-mix(in srgb, var(--icen-token-line) 72%, transparent);
1293
+ margin: -1px;
1294
+ }
1295
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-toggle-group {
1296
+ background: var(--icen-token-surface-raised);
1297
+ border-color: var(--icen-token-line-soft);
1298
+ }
1010
1299
  /* Data readability is explicit, never applied to every numeral in prose. */
1011
1300
  :root :is(.icen-numeric,.icen-table,.icen-datatable,.icen-stat-num) { font-variant-numeric: lining-nums tabular-nums; }
1012
1301
  /* Any translucent material has an opaque alternative, including native controls. */
@@ -1103,6 +1392,8 @@ h1, h2, h3, h4, h5, h6 {
1103
1392
  /* 中式 material adapter. DOM contract: html[data-icen-style="chinese"] with
1104
1393
  * existing ICEN components or [data-icen-material="content|chrome|floating"].
1105
1394
  * No additional wrappers, decorative pseudo-elements or JavaScript required.
1395
+ * 分层登记(guard: tier-direction 白名单):横切材料适配引用 Beta 类名
1396
+ * .icen-ai-composer-popup,理由同 material.css 头注释。
1106
1397
  */
1107
1398
  :root[data-icen-style="chinese"] {
1108
1399
  --icen-press: scale(.995);
@@ -1160,6 +1451,14 @@ h1, h2, h3, h4, h5, h6 {
1160
1451
  @media (prefers-reduced-motion: reduce) {
1161
1452
  :root[data-icen-style="chinese"] { --icen-press: none; --icen-press-soft: none; }
1162
1453
  }
1454
+ /* 减少透明偏好:玻璃面回落实底,文字不叠在内容上 */
1455
+ @media (prefers-reduced-transparency: reduce) {
1456
+ :root[data-icen-style="chinese"] :is(.icen-card--glass, [data-icen-material="floating"], .icen-command-palette) {
1457
+ background: var(--icen-token-surface-raised);
1458
+ -webkit-backdrop-filter: none;
1459
+ backdrop-filter: none;
1460
+ }
1461
+ }
1163
1462
  @media (forced-colors: active) {
1164
1463
  :root[data-icen-style="chinese"] :is([data-icen-material],.icen-card,.icen-panel,.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-modal,.icen-nav) {
1165
1464
  background: Canvas;
@@ -1174,6 +1473,8 @@ h1, h2, h3, h4, h5, h6 {
1174
1473
  /* 苏式 material adapter. DOM contract: html[data-icen-style="soviet"] with
1175
1474
  * existing ICEN components or [data-icen-material="content|chrome|floating"].
1176
1475
  * Structural emphasis belongs to frame/header/action, not long-form text.
1476
+ * 分层登记(guard: tier-direction 白名单):横切材料适配引用 Beta 类名
1477
+ * .icen-ai-composer-popup,理由同 material.css 头注释。
1177
1478
  */
1178
1479
  :root[data-icen-style="soviet"] {
1179
1480
  --icen-press: translateY(1px);
@@ -1233,6 +1534,14 @@ h1, h2, h3, h4, h5, h6 {
1233
1534
  @media (prefers-reduced-motion: reduce) {
1234
1535
  :root[data-icen-style="soviet"] { --icen-press: none; --icen-press-soft: none; }
1235
1536
  }
1537
+ /* 减少透明偏好:玻璃面回落实底,文字不叠在内容上 */
1538
+ @media (prefers-reduced-transparency: reduce) {
1539
+ :root[data-icen-style="soviet"] :is(.icen-card--glass, [data-icen-material="floating"], .icen-command-palette) {
1540
+ background: var(--icen-token-surface-raised);
1541
+ -webkit-backdrop-filter: none;
1542
+ backdrop-filter: none;
1543
+ }
1544
+ }
1236
1545
  @media (forced-colors: active) {
1237
1546
  :root[data-icen-style="soviet"] :is([data-icen-material],.icen-card,.icen-panel,.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-modal,.icen-nav) {
1238
1547
  background: Canvas;
@@ -1265,9 +1574,9 @@ h1, h2, h3, h4, h5, h6 {
1265
1574
  cursor: pointer;
1266
1575
  transition: opacity var(--icen-tx-fast), background-color var(--icen-tx-fast), color var(--icen-tx-fast), transform var(--icen-tx-fast);
1267
1576
  }
1268
- .icen-icon-action:hover { background: var(--icen-token-fill-1); color: var(--icen-token-text); }
1269
- .icen-icon-action:active { transform: scale(.94); }
1270
- .icen-icon-action:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 2px; }
1577
+ .icen-icon-action:hover { background: var(--icen-token-fill-hover); color: var(--icen-token-text); }
1578
+ .icen-icon-action:active { background: var(--icen-token-fill-pressed); }
1579
+ .icen-icon-action:focus-visible { outline: none; box-shadow: var(--icen-ring); }
1271
1580
  .icen-icon-action:disabled { opacity: var(--icen-disabled-opacity); pointer-events: none; }
1272
1581
  @media (hover: hover) and (pointer: fine) {
1273
1582
  .icen-icon-action[data-icen-reveal] { opacity: 0; }
@@ -1280,7 +1589,6 @@ h1, h2, h3, h4, h5, h6 {
1280
1589
  }
1281
1590
  @media (prefers-reduced-motion: reduce) {
1282
1591
  .icen-icon-action { transition: none; }
1283
- .icen-icon-action:active { transform: none; }
1284
1592
  }
1285
1593
 
1286
1594
  :root[data-icen-style="pixel"] .icen-symbol { stroke-linecap: square; stroke-linejoin: miter; shape-rendering: crispEdges; }
@@ -1312,11 +1620,14 @@ h1, h2, h3, h4, h5, h6 {
1312
1620
  .icen-search-clear > svg { inline-size: 16px; block-size: 16px; pointer-events: none; }
1313
1621
  .icen-search-clear:hover {
1314
1622
  color: var(--icen-token-text);
1315
- background: var(--icen-token-surface-hover);
1623
+ background: var(--icen-token-fill-hover);
1624
+ }
1625
+ .icen-search-clear:active {
1626
+ background: var(--icen-token-fill-pressed);
1316
1627
  }
1317
1628
  .icen-search-clear:focus-visible {
1318
- outline: 2px solid var(--icen-token-accent);
1319
- outline-offset: -2px;
1629
+ outline: none;
1630
+ box-shadow: var(--icen-ring);
1320
1631
  }
1321
1632
  @media (prefers-reduced-motion: reduce) {
1322
1633
  .icen-search-clear { transition: none; }
@@ -1338,13 +1649,22 @@ h1, h2, h3, h4, h5, h6 {
1338
1649
  .icen-suggestion-symbol > svg { inline-size: 16px; block-size: 16px; }
1339
1650
  .icen-suggestion-copy { flex: 1; min-inline-size: 0; overflow-wrap: anywhere; }
1340
1651
  .icen-suggestion-status.is-loading .icen-suggestion-symbol > svg { animation: icen-spin calc(var(--icen-duration-normal) * 4) linear infinite; }
1341
- .icen-suggestion-retry { flex: 0 0 auto; padding-inline: var(--icen-density-space-sm); min-block-size: var(--icen-density-input-height-sm); border: 1px solid var(--icen-token-outline-soft); border-radius: var(--icen-radius-sm); background: var(--icen-token-fill-1); color: var(--icen-token-text); font: inherit; cursor: pointer; }
1342
- .icen-suggestion-retry:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 1px; }
1343
- @media (hover: hover) and (pointer: fine) { .icen-suggestion-retry:hover { background: var(--icen-token-fill-2); } }
1652
+ .icen-suggestion-retry { flex: 0 0 auto; padding-inline: var(--icen-density-space-sm); min-block-size: var(--icen-density-input-height-sm); border: 1px solid var(--icen-token-outline-soft); border-radius: var(--icen-radius-sm); background: var(--icen-token-fill-1); color: var(--icen-token-text); font: inherit; cursor: pointer; transition: background-color var(--icen-tx-fast), border-color var(--icen-tx-fast); }
1653
+ .icen-suggestion-retry:focus-visible { outline: none; box-shadow: var(--icen-ring); }
1654
+ @media (hover: hover) and (pointer: fine) { .icen-suggestion-retry:hover { background: var(--icen-token-fill-2); border-color: var(--icen-token-line); } }
1344
1655
  @media (pointer: coarse) { .icen-suggestion-retry { min-inline-size: 44px; min-block-size: 44px; } }
1345
1656
  :root[data-icen-style="pixel"] .icen-suggestion-status.is-loading .icen-suggestion-symbol > svg { animation-timing-function: steps(8,end); }
1346
1657
  @media (prefers-reduced-motion: reduce) { .icen-suggestion-status.is-loading .icen-suggestion-symbol > svg { animation: none; } }
1347
1658
 
1659
+ @media (forced-colors: active) {
1660
+ .icen-icon-action,
1661
+ .icen-search-clear,
1662
+ .icen-suggestion-retry { border: 1px solid CanvasText; }
1663
+ .icen-icon-action:focus-visible,
1664
+ .icen-search-clear:focus-visible,
1665
+ .icen-suggestion-retry:focus-visible { outline: 2px solid Highlight; outline-offset: 1px; box-shadow: none; }
1666
+ }
1667
+
1348
1668
  /*
1349
1669
  * @icen.ai/ui — Component: input(wrapper 式输入框 / 多行 / 搜索)
1350
1670
  * 规格源自 opengal primitives/input.tsx;与 behaviors/input.ts 配套。
@@ -1376,16 +1696,16 @@ h1, h2, h3, h4, h5, h6 {
1376
1696
  .icen-kb-filter-value {
1377
1697
  box-sizing: border-box;
1378
1698
  min-inline-size: 0;
1379
- block-size: var(--input-height, var(--icen-density-input-height-md));
1380
- padding: 0 var(--input-padding-inline, var(--icen-density-space-sm));
1699
+ block-size: var(--input-height, var(--icen-control-height-md));
1700
+ padding: 0 var(--input-padding-inline, var(--icen-field-padding-inline));
1381
1701
  font-family: var(--icen-font-body);
1382
- font-size: var(--input-font-size, var(--icen-density-font-size-md));
1383
- line-height: 1.5;
1702
+ font-size: var(--input-font-size, var(--icen-font-size-control));
1703
+ line-height: 1.4;
1384
1704
  color: var(--icen-token-text);
1385
1705
  background: var(--icen-token-control);
1386
- border: 1px solid var(--icen-token-outline-soft);
1387
- border-radius: var(--icen-radius-md);
1388
- box-shadow: var(--icen-token-shadow-inset);
1706
+ border: var(--icen-control-border-width) solid var(--icen-token-control-border);
1707
+ border-radius: var(--icen-control-radius);
1708
+ box-shadow: var(--icen-token-shadow-field);
1389
1709
  transition: border-color var(--icen-tx-fast), box-shadow var(--icen-tx-fast);
1390
1710
  }
1391
1711
  .icen-input-wrap {
@@ -1396,7 +1716,7 @@ h1, h2, h3, h4, h5, h6 {
1396
1716
  inline-size: 100%;
1397
1717
  }
1398
1718
  :is(.icen-input-wrap,.icen-input-control,.icen-kb-input,.icen-kb-retrieval-query,.icen-kb-hittest-input,.icen-kb-filter-field,.icen-kb-filter-value):hover {
1399
- border-color: var(--icen-hover-border);
1719
+ border-color: var(--icen-token-control-border-hover);
1400
1720
  }
1401
1721
  :is(.icen-input-wrap,.icen-input-control,.icen-kb-input,.icen-kb-retrieval-query,.icen-kb-hittest-input,.icen-kb-filter-field,.icen-kb-filter-value):focus-within {
1402
1722
  outline: none;
@@ -1423,13 +1743,13 @@ h1, h2, h3, h4, h5, h6 {
1423
1743
  /* 尺寸变体 */
1424
1744
  .icen-input-wrap--sm, .icen-input-control--sm,
1425
1745
  .icen-kb-input, .icen-kb-retrieval-query, .icen-kb-hittest-input, .icen-kb-filter-field, .icen-kb-filter-value {
1426
- --input-height: var(--icen-density-input-height-sm);
1427
- --input-padding-inline: max(8px, calc(var(--icen-density-space-sm) * 1.25));
1746
+ --input-height: var(--icen-control-height-sm);
1747
+ --input-padding-inline: var(--icen-field-padding-inline-sm);
1428
1748
  --input-font-size: var(--icen-density-font-size-sm);
1429
1749
  }
1430
1750
  .icen-input-wrap--lg, .icen-input-control--lg {
1431
- --input-height: var(--icen-density-input-height-lg);
1432
- --input-padding-inline: var(--icen-density-space-md);
1751
+ --input-height: var(--icen-control-height-lg);
1752
+ --input-padding-inline: var(--icen-control-padding-inline-lg);
1433
1753
  --input-font-size: var(--icen-density-font-size-lg);
1434
1754
  }
1435
1755
 
@@ -1445,7 +1765,7 @@ h1, h2, h3, h4, h5, h6 {
1445
1765
  font: inherit;
1446
1766
  }
1447
1767
  .icen-input::placeholder {
1448
- color: color-mix(in srgb, var(--icen-token-text-faint) 60%, transparent);
1768
+ color: var(--icen-token-text-faint); /* 全量 faint:60% 混透浅色仅 ~2.4:1 低于 AA(faint 全量 ≥4.9:1) */
1449
1769
  }
1450
1770
  .icen-input:read-only {
1451
1771
  color: var(--icen-token-text-muted);
@@ -1508,7 +1828,7 @@ h1, h2, h3, h4, h5, h6 {
1508
1828
  align-items: center;
1509
1829
  justify-content: center;
1510
1830
  flex-shrink: 0;
1511
- width: 22px; height: 22px;
1831
+ width: 24px; height: 24px; /* WCAG 2.5.8 下限(22 → 24) */
1512
1832
  padding: 0;
1513
1833
  border: none;
1514
1834
  background: transparent;
@@ -1537,14 +1857,14 @@ h1, h2, h3, h4, h5, h6 {
1537
1857
  display: flex;
1538
1858
  width: 100%;
1539
1859
  background: var(--icen-token-control);
1540
- border: 1px solid var(--icen-token-outline-soft);
1541
- border-radius: var(--icen-radius-md);
1542
- box-shadow: var(--icen-token-shadow-inset);
1860
+ border: var(--icen-control-border-width) solid var(--icen-token-control-border);
1861
+ border-radius: var(--icen-control-radius);
1862
+ box-shadow: var(--icen-token-shadow-field);
1543
1863
  transition: border-color var(--icen-tx-fast),
1544
1864
  box-shadow var(--icen-tx-fast);
1545
1865
  }
1546
1866
  .icen-textarea-wrap:hover {
1547
- border-color: var(--icen-hover-border);
1867
+ border-color: var(--icen-token-control-border-hover);
1548
1868
  }
1549
1869
  .icen-textarea-wrap:focus-within {
1550
1870
  box-shadow: var(--icen-control-focus-shadow);
@@ -1567,19 +1887,19 @@ h1, h2, h3, h4, h5, h6 {
1567
1887
 
1568
1888
  .icen-textarea {
1569
1889
  width: 100%;
1570
- padding: var(--icen-density-space-sm) var(--icen-density-space-md);
1890
+ padding: var(--icen-density-space-sm) var(--icen-field-padding-inline);
1571
1891
  background: transparent;
1572
1892
  border: none;
1573
1893
  outline: none;
1574
1894
  resize: vertical;
1575
1895
  color: var(--icen-token-text);
1576
1896
  font: inherit;
1577
- font-size: var(--icen-density-font-size-md);
1897
+ font-size: var(--icen-font-size-control);
1578
1898
  line-height: 1.5;
1579
- min-height: calc(3 * 1.5em + 24px);
1899
+ min-height: calc(3 * 1.5em + 22px);
1580
1900
  }
1581
1901
  .icen-textarea::placeholder {
1582
- color: color-mix(in srgb, var(--icen-token-text-faint) 60%, transparent);
1902
+ color: var(--icen-token-text-faint); /* 全量 faint:60% 混透浅色仅 ~2.4:1 低于 AA(faint 全量 ≥4.9:1) */
1583
1903
  }
1584
1904
 
1585
1905
  /* 字符计数(behavior 可挂到 .icen-input-wrap 或 .icen-textarea-wrap 内行内末端) */