@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,226 +1,233 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: content(内容展示族)
3
4
  *
4
5
  * 包含:kbd(按键)/ code-inline(行内代码)/ list(分隔列表)/ accordion(手风琴,behaviors/accordion 配套)/
5
6
  * timeline(时间线)/ desc(描述列表)/ tree(树形,behaviors/tree 配套)
6
7
  * markup API 变体(正文"增强"段,behavior 不产出、由手写 markup 消费):
7
- * .accordion--cards / .code-inline--success|--warning|--error /
8
- * .timeline--right|--alternate|--sm / .timeline-extra / .timeline-dot--sm 及 dot 语义色(--error 等)
8
+ * .icen-accordion--cards / .icen-code-inline--success|--warning|--error /
9
+ * .icen-timeline--right|--alternate|--sm / .icen-timeline-extra / .icen-timeline-dot--sm 及 dot 语义色(--error 等)
9
10
  * 规格源自 opengal src/presentation/ui/data/exhibit.tsx 与 data/display.tsx。
10
11
  */
11
12
 
12
13
  /* ══════════════ kbd · 按键 ══════════════ */
13
- .kbd {
14
+ .icen-kbd {
14
15
  display: inline-flex;
15
16
  align-items: center;
16
17
  justify-content: center;
17
18
  vertical-align: middle;
18
- font-family: var(--font-mono);
19
+ font-family: var(--icen-font-mono);
19
20
  font-weight: 500;
20
- border-radius: var(--radius-xs);
21
- border: 1px solid var(--token-outline);
22
- background: var(--token-control);
23
- color: var(--token-text-muted);
24
- box-shadow: var(--token-shadow-inset);
21
+ border-radius: var(--icen-radius-xs);
22
+ border: 1px solid var(--icen-token-outline);
23
+ background: var(--icen-token-control);
24
+ color: var(--icen-token-text-muted);
25
+ box-shadow: var(--icen-token-shadow-inset);
25
26
  height: 20px;
26
27
  min-width: 20px;
27
- padding: 0 var(--density-space-xs);
28
- font-size: var(--density-font-size-xs);
28
+ padding: 0 var(--icen-density-space-xs);
29
+ font-size: var(--icen-density-font-size-xs);
29
30
  }
30
- .kbd--sm {
31
+ .icen-kbd--sm {
31
32
  height: 16px;
32
33
  min-width: 16px;
33
34
  padding: 0 4px;
34
- font-size: var(--density-font-size-2xs);
35
+ font-size: var(--icen-density-font-size-2xs);
35
36
  }
36
- .kbd-group {
37
+ .icen-kbd-group {
37
38
  display: inline-flex;
38
39
  align-items: center;
39
40
  gap: 2px;
40
- font-family: var(--font-mono);
41
- font-size: var(--density-font-size-xs);
42
- color: var(--token-text-muted);
41
+ font-family: var(--icen-font-mono);
42
+ font-size: var(--icen-density-font-size-xs);
43
+ color: var(--icen-token-text-muted);
43
44
  }
44
- .kbd-group .kbd { font-size: inherit; }
45
+ .icen-kbd-group .icen-kbd { font-size: inherit; }
45
46
 
46
47
  /* ══════════════ code-inline · 行内代码 ══════════════ */
47
- .code-inline {
48
- padding: 2px var(--density-space-xs);
49
- border-radius: var(--radius-xs);
50
- background: var(--token-control);
51
- border: 1px solid var(--token-outline-soft);
48
+ .icen-code-inline {
49
+ padding: 2px var(--icen-density-space-xs);
50
+ border-radius: var(--icen-radius-xs);
51
+ background: var(--icen-token-control);
52
+ border: 1px solid var(--icen-token-outline-soft);
52
53
  font-size: 0.9em;
53
- font-family: var(--font-mono);
54
- color: var(--token-accent);
54
+ font-family: var(--icen-font-mono);
55
+ color: var(--icen-token-accent-text, var(--icen-token-accent));
55
56
  word-break: break-word;
56
57
  }
57
58
 
58
59
  /* ══════════════ list · 分隔列表 ══════════════
59
- * DOM:<ul class="list [list--hover|list--compact]"><li class="list-item">…</li></ul>
60
+ * DOM:<ul class="icen-list [list--hover|icen-list--compact]"><li class="icen-list-item">…</li></ul>
60
61
  * list--hover:每项 hover 浮起(默认有 hover);
61
62
  * list--compact:缩小 padding。
62
63
  */
63
- .list {
64
+ .icen-list {
64
65
  list-style: none;
65
66
  margin: 0;
66
67
  padding: 0;
67
68
  }
68
- .list-item {
69
- padding: var(--density-space-sm);
70
- border-radius: var(--radius-sm);
69
+ .icen-list-item {
70
+ padding: var(--icen-density-space-sm);
71
+ border-radius: var(--icen-radius-sm);
71
72
  transition: background-color var(--icen-tx-fast);
72
73
  }
73
- .list-item:hover { background: var(--token-control-hover); }
74
- .list .list-item + .list-item { border-top: 1px solid var(--token-outline-soft); }
75
- .list--compact .list-item { padding: var(--density-space-xs) var(--density-space-sm); }
74
+ .icen-list-item:hover { background: var(--icen-token-control-hover); }
75
+ .icen-list .icen-list-item + .icen-list-item { border-top: 1px solid var(--icen-token-outline-soft); }
76
+ .icen-list--compact .icen-list-item { padding: var(--icen-density-space-xs) var(--icen-density-space-sm); }
76
77
 
77
78
  /* ══════════════ accordion · 手风琴(behaviors/accordion 配套) ══════════════
78
79
  * DOM:
79
- * <div class="accordion" data-single?>
80
- * <div class="accordion-item [.is-open] [.is-disabled]">
81
- * <button class="accordion-trigger" aria-expanded="true">标题 <svg class="accordion-chevron"/></button>
82
- * <div class="accordion-panel"><div class="accordion-panel-inner">内容</div></div>
80
+ * <div class="accordion" data-icen-single?>
81
+ * <div class="icen-accordion-item [.is-open] [.is-disabled]">
82
+ * <button class="icen-accordion-trigger" aria-expanded="true">标题 <svg class="icen-accordion-chevron"/></button>
83
+ * <div class="icen-accordion-panel"><div class="icen-accordion-panel-inner">内容</div></div>
83
84
  * </div>
84
85
  * </div>
85
86
  * 展开 = item 挂 .is-open;panel 用 grid-template-rows 0fr→1fr 做过渡。
86
- * data-single:展开一项自动收起其余(behavior 实现)。
87
+ * data-icen-single:展开一项自动收起其余(behavior 实现)。
87
88
  */
88
- .accordion-item {
89
- border-bottom: 1px solid var(--token-outline-soft);
89
+ .icen-accordion-item {
90
+ border-bottom: 1px solid var(--icen-token-outline-soft);
90
91
  }
91
- .accordion-item:last-child { border-bottom: 0; }
92
- .accordion-trigger {
92
+ .icen-accordion-item:last-child { border-bottom: 0; }
93
+ .icen-accordion-trigger {
93
94
  width: 100%;
94
95
  display: flex;
95
96
  align-items: center;
96
97
  justify-content: space-between;
97
- gap: var(--density-space-sm);
98
- padding: var(--density-space-sm);
99
- font-size: var(--density-font-size-md);
98
+ gap: var(--icen-density-space-sm);
99
+ padding: var(--icen-density-space-sm);
100
+ font-size: var(--icen-density-font-size-md);
100
101
  font-weight: 500;
101
- color: var(--token-text);
102
- text-align: left;
102
+ color: var(--icen-token-text);
103
+ text-align: start;
103
104
  background: none;
104
105
  border: 0;
105
106
  cursor: pointer;
106
- border-radius: var(--radius-sm);
107
+ border-radius: var(--icen-radius-sm);
107
108
  transition: background-color var(--icen-tx-fast);
108
109
  }
109
- .accordion-trigger:hover {
110
- background: var(--token-control-hover);
110
+ .icen-accordion-trigger:hover {
111
+ background: var(--icen-token-control-hover);
111
112
  }
112
- .accordion-trigger:focus-visible {
113
+ .icen-accordion-trigger:focus-visible {
113
114
  outline: none;
114
115
  box-shadow: var(--icen-ring);
115
116
  }
116
- .accordion-item.is-disabled .accordion-trigger,
117
- .accordion-item[aria-disabled='true'] .accordion-trigger {
117
+ .icen-accordion-item.is-disabled .icen-accordion-trigger,
118
+ .icen-accordion-item[aria-disabled='true'] .icen-accordion-trigger {
118
119
  opacity: var(--icen-disabled-opacity);
119
120
  cursor: not-allowed;
120
121
  pointer-events: none;
121
122
  }
122
- .accordion-chevron {
123
+ .icen-accordion-chevron {
123
124
  width: 14px;
124
125
  height: 14px;
125
126
  flex-shrink: 0;
126
- color: var(--token-text-faint);
127
+ color: var(--icen-token-text-faint);
127
128
  transition: transform var(--icen-tx-normal);
128
129
  }
129
- .accordion-item.is-open .accordion-chevron {
130
+ .icen-accordion-item.is-open .icen-accordion-chevron {
130
131
  transform: rotate(180deg);
131
132
  }
132
- .accordion-panel {
133
+ .icen-accordion-panel {
133
134
  display: grid;
134
135
  grid-template-rows: 0fr;
136
+ overflow: clip; /* 双保险:收起态任何残留内容都不许露出 */
135
137
  transition: grid-template-rows var(--icen-tx-normal);
136
138
  }
137
- .accordion-item.is-open .accordion-panel { grid-template-rows: 1fr; }
138
- .accordion-panel-inner {
139
+ .icen-accordion-item.is-open .icen-accordion-panel { grid-template-rows: 1fr; }
140
+ .icen-accordion-panel-inner {
139
141
  overflow: hidden;
140
142
  min-height: 0;
141
- padding: 0 var(--density-space-sm) var(--density-space-sm);
142
- font-size: var(--density-font-size-sm);
143
- color: var(--token-text-muted);
143
+ /* 块距随开合动画:静态 padding-bottom 会成为 0fr 轨道的最小内容贡献,
144
+ 收起态露出首行文字上缘(内边距不被 overflow 裁切) */
145
+ padding: 0 var(--icen-density-space-sm);
146
+ padding-block-end: 0;
147
+ transition: padding-block-end var(--icen-tx-normal);
148
+ font-size: var(--icen-density-font-size-sm);
149
+ color: var(--icen-token-text-muted);
144
150
  line-height: 1.6;
145
151
  }
152
+ .icen-accordion-item.is-open .icen-accordion-panel-inner { padding-block-end: var(--icen-density-space-sm); }
146
153
 
147
154
  /* 卡片式手风琴:整组包在带边框的卡片里 */
148
- .accordion--cards {
149
- border: 1px solid var(--token-outline-soft);
150
- border-radius: var(--radius-md);
155
+ .icen-accordion--cards {
156
+ border: 1px solid var(--icen-token-outline-soft);
157
+ border-radius: var(--icen-radius-md);
151
158
  overflow: hidden;
152
159
  }
153
- .accordion--cards .accordion-item {
160
+ .icen-accordion--cards .icen-accordion-item {
154
161
  border-bottom: 0;
155
162
  }
156
- .accordion--cards .accordion-item + .accordion-item {
157
- border-top: 1px solid var(--token-outline-soft);
163
+ .icen-accordion--cards .icen-accordion-item + .icen-accordion-item {
164
+ border-top: 1px solid var(--icen-token-outline-soft);
158
165
  }
159
166
 
160
167
  /* ══════════════ timeline · 时间线 ══════════════
161
- * DOM:.timeline-item > .timeline-dot + .timeline-body
168
+ * DOM:.icen-timeline-item > .icen-timeline-dot + .icen-timeline-body
162
169
  * 连接线 = item::after(相对 item 绝对定位,从 dot 下方贯穿到下一项),末项不画。
163
170
  */
164
- .timeline {
171
+ .icen-timeline {
165
172
  display: flex;
166
173
  flex-direction: column;
167
174
  }
168
- .timeline-item {
175
+ .icen-timeline-item {
169
176
  position: relative;
170
177
  display: flex;
171
- gap: var(--density-space-sm);
172
- padding-bottom: var(--density-space-lg);
178
+ gap: var(--icen-density-space-sm);
179
+ padding-bottom: var(--icen-density-space-lg);
173
180
  }
174
- .timeline-item:last-child { padding-bottom: 0; }
175
- .timeline-item:not(:last-child)::after {
181
+ .icen-timeline-item:last-child { padding-bottom: 0; }
182
+ .icen-timeline-item:not(:last-child)::after {
176
183
  content: '';
177
184
  position: absolute;
178
- left: 13.5px; /* 28px dot 的水平中心 */
185
+ inset-inline-start: 13.5px; /* 28px dot 的水平中心(dot 在 flex 起始缘,RTL 自动镜像) */
179
186
  top: 32px;
180
187
  bottom: 0;
181
188
  width: 1px;
182
- background: var(--token-outline-soft);
189
+ background: var(--icen-token-outline-soft);
183
190
  }
184
- .timeline-dot {
191
+ .icen-timeline-dot {
185
192
  width: 28px;
186
193
  height: 28px;
187
194
  flex-shrink: 0;
188
- border-radius: var(--radius-full);
195
+ border-radius: var(--icen-radius-full);
189
196
  display: flex;
190
197
  align-items: center;
191
198
  justify-content: center;
192
- background: var(--token-control);
193
- border: 1px solid var(--token-outline-soft);
194
- color: var(--token-text-muted);
199
+ background: var(--icen-token-control);
200
+ border: 1px solid var(--icen-token-outline-soft);
201
+ color: var(--icen-token-text-muted);
195
202
  z-index: 1;
196
203
  }
197
- .timeline-dot svg { width: 13px; height: 13px; }
198
- .timeline-dot--accent { background: var(--token-accent); color: var(--token-on-accent); border-color: transparent; }
199
- .timeline-dot--success { background: var(--token-success); color: var(--token-on-accent); border-color: transparent; }
200
- .timeline-dot--warning { background: var(--token-warning); color: var(--token-on-accent); border-color: transparent; }
201
- .timeline-dot--error { background: var(--token-error); color: var(--token-on-accent); border-color: transparent; }
202
- .timeline-dot--info { background: var(--token-info); color: var(--token-on-accent); border-color: transparent; }
204
+ .icen-timeline-dot svg { width: 13px; height: 13px; }
205
+ .icen-timeline-dot--accent { background: var(--icen-token-accent-strong); color: var(--icen-token-on-accent); border-color: transparent; }
206
+ .icen-timeline-dot--success { background: var(--icen-token-success); color: var(--icen-token-on-accent); border-color: transparent; }
207
+ .icen-timeline-dot--warning { background: var(--icen-token-warning); color: var(--icen-token-on-accent); border-color: transparent; }
208
+ .icen-timeline-dot--error { background: var(--icen-token-error); color: var(--icen-token-on-accent); border-color: transparent; }
209
+ .icen-timeline-dot--info { background: var(--icen-token-info); color: var(--icen-token-on-accent); border-color: transparent; }
203
210
 
204
- .timeline-body { flex: 1; min-width: 0; }
205
- .timeline-head {
211
+ .icen-timeline-body { flex: 1; min-inline-size: 0; }
212
+ .icen-timeline-head {
206
213
  display: flex;
207
214
  align-items: center;
208
- gap: var(--density-space-sm);
215
+ gap: var(--icen-density-space-sm);
209
216
  }
210
- .timeline-title {
211
- font-size: var(--density-font-size-md);
217
+ .icen-timeline-title {
218
+ font-size: var(--icen-density-font-size-md);
212
219
  font-weight: 500;
213
- color: var(--token-text);
220
+ color: var(--icen-token-text);
214
221
  }
215
- .timeline-time {
216
- font-size: var(--density-font-size-xs);
217
- color: var(--token-text-faint);
218
- margin-left: auto;
222
+ .icen-timeline-time {
223
+ font-size: var(--icen-density-font-size-xs);
224
+ color: var(--icen-token-text-faint);
225
+ margin-inline-start: auto;
219
226
  font-variant-numeric: tabular-nums;
220
227
  }
221
- .timeline-desc {
222
- font-size: var(--density-font-size-sm);
223
- color: var(--token-text-muted);
228
+ .icen-timeline-desc {
229
+ font-size: var(--icen-density-font-size-sm);
230
+ color: var(--icen-token-text-muted);
224
231
  margin: 4px 0 0;
225
232
  line-height: 1.5;
226
233
  }
@@ -229,96 +236,101 @@
229
236
  * 列数由容器 style="--desc-cols:N" 指定,默认 2;item 可用 style="--desc-span:N" 跨列。
230
237
  * --bordered 变体:gap:1px 露出容器底色形成格线。
231
238
  */
232
- .desc { display: flex; flex-direction: column; gap: var(--density-space-sm); }
233
- .desc-title {
234
- font-size: var(--density-font-size-md);
239
+ .icen-desc { display: flex; flex-direction: column; gap: var(--icen-density-space-sm); }
240
+ .icen-desc-title {
241
+ font-size: var(--icen-density-font-size-md);
235
242
  font-weight: 500;
236
- color: var(--token-text);
243
+ color: var(--icen-token-text);
237
244
  margin: 0;
238
245
  }
239
- .desc-grid {
246
+ .icen-desc-grid {
240
247
  display: grid;
241
248
  grid-template-columns: repeat(var(--desc-cols, 2), minmax(0, 1fr));
242
249
  gap: 1px;
243
250
  margin: 0;
244
251
  }
245
- .desc--bordered .desc-grid {
246
- background: var(--token-outline-soft);
247
- border: 1px solid var(--token-outline-soft);
248
- border-radius: var(--radius-md);
252
+ .icen-desc--bordered .icen-desc-grid {
253
+ background: var(--icen-token-outline-soft);
254
+ border: 1px solid var(--icen-token-outline-soft);
255
+ border-radius: var(--icen-radius-md);
249
256
  overflow: hidden;
250
257
  }
251
- .desc-item { grid-column: span var(--desc-span, 1); }
252
- .desc--bordered .desc-item {
253
- background: var(--token-card);
254
- padding: var(--density-space-sm) var(--density-space-md);
258
+ .icen-desc-item { grid-column: span var(--desc-span, 1); }
259
+ .icen-desc--bordered .icen-desc-item {
260
+ background: var(--icen-token-card);
261
+ padding: var(--icen-density-space-sm) var(--icen-density-space-md);
255
262
  }
256
- .desc:not(.desc--bordered) .desc-item {
263
+ .icen-desc:not(.icen-desc--bordered) .icen-desc-item {
257
264
  display: flex;
258
265
  flex-direction: column;
259
266
  gap: 2px;
260
267
  }
261
- .desc-item dt {
262
- font-size: var(--density-font-size-xs);
263
- color: var(--token-text-faint);
268
+ .icen-desc-item dt {
269
+ font-size: var(--icen-density-font-size-xs);
270
+ color: var(--icen-token-text-faint);
264
271
  }
265
- .desc-item dd {
266
- font-size: var(--density-font-size-md);
267
- color: var(--token-text);
272
+ .icen-desc-item dd {
273
+ font-size: var(--icen-density-font-size-md);
274
+ color: var(--icen-token-text);
268
275
  margin: 0;
269
276
  line-height: 1.5;
270
277
  }
271
278
 
272
279
  @media (max-width: 640px) {
273
- .desc-grid { grid-template-columns: 1fr !important; }
280
+ .icen-desc-grid { grid-template-columns: 1fr !important; /* guard:allow-important 状态/守卫覆盖需压制变体优先级 */ }
274
281
  }
275
282
 
276
283
  /* ══════════════ tree · 树形(behaviors/tree 配套) ══════════════
277
284
  * DOM:
278
- * <ul class="tree"><li>
279
- * <div class="tree-node [.is-selected] [.is-disabled]" style="--depth:0">
280
- * <button class="tree-toggle [.is-collapsed]"><svg/></button>
281
- * <span class="tree-label">节点</span>
285
+ * <ul class="icen-tree"><li>
286
+ * <div class="icen-tree-node [.is-selected] [.is-disabled]" style="--depth:0">
287
+ * <button class="icen-tree-toggle [.is-collapsed]"><svg/></button>
288
+ * <span class="icen-tree-label">节点</span>
282
289
  * </div>
283
290
  * <ul>…子节点…</ul>
284
291
  * </li></ul>
285
292
  * 折叠 = toggle 挂 .is-collapsed(chevron 转 -90°)+ 子 ul hidden;选中 = node 挂 .is-selected。
286
293
  */
287
- .tree, .tree ul {
294
+ .icen-tree, .icen-tree ul {
288
295
  list-style: none;
289
296
  margin: 0;
290
297
  padding: 0;
291
298
  }
292
- .tree { user-select: none; }
293
- .tree-node {
299
+ .icen-tree { user-select: none; }
300
+ .icen-tree-node {
294
301
  display: flex;
295
302
  align-items: center;
296
- gap: var(--density-space-xs);
297
- padding: var(--density-space-xs) var(--density-space-sm) var(--density-space-xs) calc(4px + var(--depth, 0) * 14px);
298
- border-radius: var(--radius-sm);
299
- font-size: var(--density-font-size-md);
300
- color: var(--token-text);
303
+ gap: var(--icen-density-space-xs);
304
+ /* 深度缩进沿 inline-start(RTL 下树向左侧生长) */
305
+ padding-block: var(--icen-density-space-xs);
306
+ padding-inline: calc(4px + var(--depth, 0) * 14px) var(--icen-density-space-sm);
307
+ border-radius: var(--icen-radius-sm);
308
+ font-size: var(--icen-density-font-size-md);
309
+ color: var(--icen-token-text);
301
310
  cursor: pointer;
302
311
  transition: background-color var(--icen-tx-fast);
303
312
  }
304
- .tree-node:hover { background: var(--token-control-hover); }
305
- .tree-node:focus-visible,
306
- .tree-node:focus-within {
313
+ .icen-tree-node:hover { background: var(--icen-token-control-hover); }
314
+ .icen-tree-node:focus-visible,
315
+ .icen-tree-node:focus-within {
307
316
  outline: none;
308
317
  box-shadow: var(--icen-ring);
309
318
  }
310
- .tree-node.is-selected,
311
- .tree-node[aria-selected='true'] {
312
- background: var(--token-accent-subtle);
313
- color: var(--token-accent);
319
+ .icen-tree-node.is-selected,
320
+ .icen-tree-node[aria-selected='true'] {
321
+ background: var(--icen-token-accent-subtle);
322
+ color: var(--icen-token-accent-text, var(--icen-token-accent-deep, var(--icen-token-accent)));
314
323
  font-weight: 500;
315
324
  }
316
- .tree-node.is-disabled,
317
- .tree-node[aria-disabled='true'] {
318
- opacity: var(--icen-disabled-opacity);
325
+ .icen-tree-node.is-disabled,
326
+ .icen-tree-node[aria-disabled='true'] {
319
327
  pointer-events: none;
320
328
  }
321
- .tree-toggle {
329
+ .icen-tree-node.is-disabled .icen-tree-label,
330
+ .icen-tree-node[aria-disabled='true'] .icen-tree-label {
331
+ color: var(--icen-token-text-muted); /* 禁用≠淡到不可读:不整行降透明(axe 会把透明度算进对比度),标签落 muted */
332
+ }
333
+ .icen-tree-toggle {
322
334
  width: 18px;
323
335
  height: 18px;
324
336
  flex-shrink: 0;
@@ -328,53 +340,53 @@
328
340
  padding: 0;
329
341
  border: 0;
330
342
  background: none;
331
- color: var(--token-text-muted);
343
+ color: var(--icen-token-text-muted);
332
344
  cursor: pointer;
333
345
  }
334
- .tree-toggle:hover { color: var(--token-text); }
335
- .tree-toggle:focus-visible {
346
+ .icen-tree-toggle:hover { color: var(--icen-token-text); }
347
+ .icen-tree-toggle:focus-visible {
336
348
  outline: none;
337
- border-radius: var(--radius-xs);
349
+ border-radius: var(--icen-radius-xs);
338
350
  box-shadow: var(--icen-ring);
339
351
  }
340
- .tree-toggle svg {
352
+ .icen-tree-toggle svg {
341
353
  width: 13px;
342
354
  height: 13px;
343
355
  transition: transform var(--icen-tx-fast);
344
356
  }
345
- .tree-toggle.is-collapsed svg { transform: rotate(-90deg); }
346
- .tree-toggle[aria-hidden='true'] { visibility: hidden; pointer-events: none; }
347
- .tree-label {
357
+ .icen-tree-toggle.is-collapsed svg { transform: rotate(-90deg); }
358
+ .icen-tree-toggle[aria-hidden='true'] { visibility: hidden; pointer-events: none; }
359
+ .icen-tree-label {
348
360
  flex: 1;
349
361
  min-width: 0;
350
362
  overflow: hidden;
351
363
  text-overflow: ellipsis;
352
364
  white-space: nowrap;
353
365
  }
354
- .tree-icon {
366
+ .icen-tree-icon {
355
367
  flex-shrink: 0;
356
368
  width: 14px;
357
369
  height: 14px;
358
- color: var(--token-text-muted);
370
+ color: var(--icen-token-text-muted);
359
371
  }
360
- .tree-node.is-selected .tree-icon { color: var(--token-accent); }
361
- .tree-badge {
372
+ .icen-tree-node.is-selected .icen-tree-icon { color: var(--icen-token-accent); }
373
+ .icen-tree-badge {
362
374
  display: inline-flex;
363
375
  align-items: center;
364
376
  justify-content: center;
365
377
  min-width: 16px;
366
378
  height: 16px;
367
379
  padding: 0 4px;
368
- font-size: var(--density-font-size-2xs);
380
+ font-size: var(--icen-density-font-size-2xs);
369
381
  font-weight: 600;
370
- color: var(--token-on-accent);
371
- background: var(--token-accent);
372
- border-radius: var(--radius-full);
382
+ color: var(--icen-token-on-accent);
383
+ background: var(--icen-token-accent-strong);
384
+ border-radius: var(--icen-radius-full);
373
385
  flex-shrink: 0;
374
386
  }
375
387
 
376
388
  @media (prefers-reduced-motion: reduce) {
377
- .accordion-panel, .accordion-chevron, .tree-toggle svg, .list-item, .tree-node {
389
+ .icen-accordion-panel, .icen-accordion-chevron, .icen-tree-toggle svg, .icen-list-item, .icen-tree-node {
378
390
  transition: none;
379
391
  }
380
392
  }
@@ -382,196 +394,190 @@
382
394
  /* ── list 增强 ── */
383
395
 
384
396
  /* 列表项带前置图标/头像 */
385
- .list-item-leading {
397
+ .icen-list-item-leading {
386
398
  display: inline-flex;
387
399
  align-items: center;
388
400
  justify-content: center;
389
401
  flex-shrink: 0;
390
- margin-right: var(--density-space-sm);
402
+ margin-inline-end: var(--icen-density-space-sm);
391
403
  }
392
- .list-item-leading svg { width: 16px; height: 16px; color: var(--token-text-faint); }
393
- .list-item-content {
404
+ .icen-list-item-leading svg { width: 16px; height: 16px; color: var(--icen-token-text-faint); }
405
+ .icen-list-item-content {
394
406
  flex: 1;
395
- min-width: 0;
407
+ min-inline-size: 0;
396
408
  display: flex;
397
409
  flex-direction: column;
398
410
  gap: 1px;
399
411
  }
400
- .list-item-title {
401
- font-size: var(--density-font-size-md);
402
- color: var(--token-text);
412
+ .icen-list-item-title {
413
+ font-size: var(--icen-density-font-size-md);
414
+ color: var(--icen-token-text);
403
415
  overflow: hidden;
404
416
  text-overflow: ellipsis;
405
417
  white-space: nowrap;
406
418
  }
407
- .list-item-meta {
408
- font-size: var(--density-font-size-xs);
409
- color: var(--token-text-faint);
419
+ .icen-list-item-meta {
420
+ font-size: var(--icen-density-font-size-xs);
421
+ color: var(--icen-token-text-faint);
410
422
  }
411
- .list-item-trailing {
423
+ .icen-list-item-trailing {
412
424
  flex-shrink: 0;
413
- margin-left: var(--density-space-sm);
414
- font-size: var(--density-font-size-xs);
415
- color: var(--token-text-faint);
425
+ margin-inline-start: var(--icen-density-space-sm);
426
+ font-size: var(--icen-density-font-size-xs);
427
+ color: var(--icen-token-text-faint);
416
428
  }
417
- .list-item--selectable {
429
+ .icen-list-item--selectable {
418
430
  cursor: pointer;
419
431
  }
420
- .list-item.is-selected {
421
- background: var(--token-accent-subtle);
432
+ .icen-list-item.is-selected {
433
+ background: var(--icen-token-accent-subtle);
422
434
  }
423
- .list-item.is-selected .list-item-title { color: var(--token-accent); font-weight: 500; }
435
+ .icen-list-item.is-selected .icen-list-item-title { color: var(--icen-token-accent); font-weight: 500; }
424
436
 
425
437
  /* 列表项 flex 布局(leading + content + trailing) */
426
- .list-item--flex {
438
+ .icen-list-item--flex {
427
439
  display: flex;
428
440
  align-items: center;
429
441
  }
430
442
 
431
443
  /* 斑马列表 */
432
- .list--striped .list-item:nth-child(odd) {
433
- background: color-mix(in srgb, var(--token-bg-soft) 40%, transparent);
444
+ .icen-list--striped .icen-list-item:nth-child(odd) {
445
+ background: color-mix(in srgb, var(--icen-token-bg-soft) 40%, transparent);
434
446
  }
435
447
 
436
448
  /* ── timeline 增强 ── */
437
449
 
438
- /* 右侧时间线(dot 在右) */
439
- .timeline--right .timeline-item { flex-direction: row-reverse; }
440
- .timeline--right .timeline-item:not(:last-child)::after {
441
- left: auto;
442
- right: 13.5px;
450
+ /* 右侧时间线(物理变体:dot 固定在右,RTL 语义不变) */
451
+ .icen-timeline--right .icen-timeline-item { flex-direction: row-reverse; }
452
+ .icen-timeline--right .icen-timeline-item:not(:last-child)::after {
453
+ left: auto; /* guard:allow-physical --right 是按物理侧命名的变体 */
454
+ right: 13.5px; /* guard:allow-physical --right 是按物理侧命名的变体 */
443
455
  }
444
- .timeline--right .timeline-body { text-align: right; }
445
- .timeline--right .timeline-time { margin-left: 0; margin-right: auto; }
456
+ .icen-timeline--right .icen-timeline-body { text-align: right; /* guard:allow-physical --right 物理变体:正文贴物理右侧 */ }
457
+ .icen-timeline--right .icen-timeline-time { margin-left: 0; /* guard:allow-physical --right 物理变体 */ margin-right: auto; /* guard:allow-physical --right 物理变体 */ }
446
458
 
447
- /* 交替时间线(奇左偶右) */
448
- .timeline--alternate .timeline-item:nth-child(even) { flex-direction: row-reverse; }
449
- .timeline--alternate .timeline-item:nth-child(even):not(:last-child)::after {
450
- left: auto; right: 13.5px;
459
+ /* 交替时间线(奇物理左偶物理右,变体名即物理侧约定) */
460
+ .icen-timeline--alternate .icen-timeline-item:nth-child(even) { flex-direction: row-reverse; }
461
+ .icen-timeline--alternate .icen-timeline-item:nth-child(even):not(:last-child)::after {
462
+ left: auto; /* guard:allow-physical --alternate 偶数项钉在物理右侧 */
463
+ right: 13.5px; /* guard:allow-physical --alternate 偶数项钉在物理右侧 */
451
464
  }
452
- .timeline--alternate .timeline-item:nth-child(even) .timeline-body { text-align: right; }
453
- .timeline--alternate .timeline-item:nth-child(even) .timeline-time {
454
- margin-left: 0; margin-right: auto;
465
+ .icen-timeline--alternate .icen-timeline-item:nth-child(even) .icen-timeline-body { text-align: right; /* guard:allow-physical --alternate 偶数项正文贴物理右侧 */ }
466
+ .icen-timeline--alternate .icen-timeline-item:nth-child(even) .icen-timeline-time {
467
+ margin-left: 0; /* guard:allow-physical --alternate 偶数项 */
468
+ margin-right: auto; /* guard:allow-physical --alternate 偶数项 */
455
469
  }
456
470
 
457
471
  /* 自定义 dot 尺寸 */
458
- .timeline-dot--sm { width: 20px; height: 20px; }
459
- .timeline-dot--sm svg { width: 10px; height: 10px; }
460
- .timeline--sm .timeline-item:not(:last-child)::after { left: 10px; top: 24px; }
472
+ .icen-timeline-dot--sm { width: 20px; height: 20px; }
473
+ .icen-timeline-dot--sm svg { width: 10px; height: 10px; }
474
+ .icen-timeline--sm .icen-timeline-item:not(:last-child)::after { inset-inline-start: 10px; top: 24px; }
461
475
 
462
476
  /* 时间线自定义内容槽(放标签、卡片等) */
463
- .timeline-extra {
464
- margin-top: var(--density-space-xs);
465
- padding: var(--density-space-sm);
466
- background: var(--token-bg-soft);
467
- border-radius: var(--radius-sm);
468
- font-size: var(--density-font-size-sm);
477
+ .icen-timeline-extra {
478
+ margin-top: var(--icen-density-space-xs);
479
+ padding: var(--icen-density-space-sm);
480
+ background: var(--icen-token-bg-soft);
481
+ border-radius: var(--icen-radius-sm);
482
+ font-size: var(--icen-density-font-size-sm);
469
483
  }
470
484
 
471
485
  /* ── desc 增强 ── */
472
486
 
473
487
  /* 行内描述(label: value 在同一行) */
474
- .desc--inline .desc-item {
488
+ .icen-desc--inline .icen-desc-item {
475
489
  display: flex;
476
490
  align-items: baseline;
477
- gap: var(--density-space-sm);
491
+ gap: var(--icen-density-space-sm);
478
492
  padding: 4px 0;
479
493
  }
480
- .desc--inline .desc-item dt {
494
+ .icen-desc--inline .icen-desc-item dt {
481
495
  flex-shrink: 0;
482
- min-width: 80px;
496
+ min-inline-size: 80px;
483
497
  }
484
- .desc--inline .desc-item dd {
498
+ .icen-desc--inline .icen-desc-item dd {
485
499
  flex: 1;
486
500
  }
487
501
 
488
502
  /* 垂直描述(label 在上,value 在下) */
489
- .desc--vertical .desc-item {
503
+ .icen-desc--vertical .icen-desc-item {
490
504
  display: flex;
491
505
  flex-direction: column;
492
506
  gap: 2px;
493
507
  }
494
508
 
495
509
  /* 可复制描述值 */
496
- .desc-copy {
510
+ .icen-desc-copy {
497
511
  display: inline-flex;
498
512
  align-items: center;
499
- gap: var(--density-space-xs);
513
+ gap: var(--icen-density-space-xs);
500
514
  }
501
- .desc-copy-btn {
515
+ .icen-desc-copy-btn {
502
516
  display: inline-flex;
503
517
  align-items: center;
504
518
  padding: 2px;
505
519
  border: 0;
506
- border-radius: var(--radius-xs);
520
+ border-radius: var(--icen-radius-xs);
507
521
  background: transparent;
508
- color: var(--token-text-faint);
522
+ color: var(--icen-token-text-faint);
509
523
  cursor: pointer;
510
524
  transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
511
525
  }
512
- .desc-copy-btn:hover { color: var(--token-accent); background: var(--token-fill-1); }
513
- .desc-copy-btn svg { width: 12px; height: 12px; }
526
+ .icen-desc-copy-btn:hover { color: var(--icen-token-accent); background: var(--icen-token-fill-1); }
527
+ .icen-desc-copy-btn svg { width: 12px; height: 12px; }
514
528
 
515
529
  /* ── tree 增强 ── */
516
530
 
517
- /* 带连接线的树 */
518
- .tree--lined ul {
531
+ /* 带连接线的树(连接线沿 inline-start 侧缩进,RTL 自动镜像) */
532
+ .icen-tree--lined ul {
519
533
  position: relative;
520
- margin-left: 7px;
521
- padding-left: 0;
522
- border-left: 1px solid var(--token-outline-soft);
534
+ margin-inline-start: 7px;
535
+ padding-inline-start: 0;
536
+ border-inline-start: 1px solid var(--icen-token-outline-soft);
523
537
  }
524
- .tree--lined .tree-node {
538
+ .icen-tree--lined .icen-tree-node {
525
539
  position: relative;
526
540
  }
527
- .tree--lined ul > li > .tree-node::before {
541
+ .icen-tree--lined ul > li > .icen-tree-node::before {
528
542
  content: '';
529
543
  position: absolute;
530
- left: -8px;
544
+ inset-inline-start: -8px;
531
545
  top: 50%;
532
546
  width: 8px;
533
547
  height: 1px;
534
- background: var(--token-outline-soft);
548
+ background: var(--icen-token-outline-soft);
535
549
  }
536
550
 
537
551
  /* 树搜索高亮 */
538
- .tree-label mark {
539
- background: color-mix(in srgb, var(--token-warning) 30%, transparent);
552
+ .icen-tree-label mark {
553
+ background: color-mix(in srgb, var(--icen-token-warning) 30%, transparent);
540
554
  color: inherit;
541
- border-radius: 2px;
555
+ border-radius: 2px; /* guard:allow-radius 微构件(bar/dot/track/指示器等图形级,不属容器圆角面) */
542
556
  padding: 0 1px;
543
557
  }
544
558
 
545
559
  /* ── kbd 增强 ── */
546
560
 
547
561
  /* 大号 kbd(展示用) */
548
- .kbd--lg {
562
+ .icen-kbd--lg {
549
563
  height: 28px;
550
564
  min-width: 28px;
551
- padding: 0 var(--density-space-sm);
552
- font-size: var(--density-font-size-md);
565
+ padding: 0 var(--icen-density-space-sm);
566
+ font-size: var(--icen-density-font-size-md);
553
567
  }
554
568
 
555
569
  /* kbd 按下态(动画反馈) */
556
- .kbd.is-pressed {
570
+ .icen-kbd.is-pressed {
557
571
  transform: translateY(1px);
558
572
  box-shadow: none;
559
573
  }
560
574
 
561
575
  /* ── code-inline 增强 ── */
562
- .code-inline--success { color: var(--token-success); }
563
- .code-inline--warning { color: var(--token-warning); }
564
- .code-inline--error { color: var(--token-error); }
565
-
566
- /* 代码块(多行,非行内) */
567
- .code-block {
568
- padding: var(--density-space-sm) var(--density-space-md);
569
- background: var(--token-bg-soft);
570
- border: 1px solid var(--token-outline-soft);
571
- border-radius: var(--radius-md);
572
- font-family: var(--font-mono);
573
- font-size: var(--density-font-size-sm);
574
- color: var(--token-text);
575
- overflow-x: auto;
576
- line-height: 1.6;
576
+ .icen-code-inline--success { color: var(--icen-token-success); }
577
+ .icen-code-inline--warning { color: var(--icen-token-warning); }
578
+ .icen-code-inline--error { color: var(--icen-token-error); }
579
+
580
+ /* 代码块(多行,非行内):由独立组件 code-block.css 承担(标题栏/行号/折叠/diff/
581
+ * shiki 协同),本文件不再承载 .icen-code-block 样式。 */
582
+
577
583
  }