@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,3 +1,4 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: media(媒体族)
3
4
  *
@@ -11,157 +12,164 @@
11
12
  */
12
13
 
13
14
  /* ══════════════ avatar · 头像 ══════════════ */
14
- .avatar {
15
+ .icen-avatar {
15
16
  position: relative;
16
17
  display: inline-flex;
17
18
  align-items: center;
18
19
  justify-content: center;
19
20
  overflow: hidden;
20
- border-radius: var(--radius-full);
21
- background: var(--token-accent-subtle);
22
- color: var(--token-accent);
21
+ border-radius: var(--icen-radius-full);
22
+ background: var(--icen-token-accent-subtle);
23
+ color: var(--icen-token-accent);
23
24
  font-weight: 600;
24
25
  width: 36px;
25
26
  height: 36px;
26
- font-size: var(--density-font-size-sm);
27
+ font-size: var(--icen-density-font-size-sm);
27
28
  flex-shrink: 0;
28
29
  user-select: none;
29
30
  }
30
- .avatar--xs { width: 20px; height: 20px; font-size: var(--density-font-size-2xs); }
31
- .avatar--sm { width: 28px; height: 28px; font-size: var(--density-font-size-2xs); }
32
- .avatar--lg { width: 48px; height: 48px; font-size: var(--density-font-size-md); }
33
- .avatar--xl { width: 80px; height: 80px; font-size: var(--density-font-size-lg); }
34
- .avatar img {
31
+ .icen-avatar--xs { width: 20px; height: 20px; font-size: var(--icen-density-font-size-2xs); }
32
+ .icen-avatar--sm { width: 28px; height: 28px; font-size: var(--icen-density-font-size-2xs); }
33
+ .icen-avatar--lg { width: 48px; height: 48px; font-size: var(--icen-density-font-size-md); }
34
+ .icen-avatar--xl { width: 80px; height: 80px; font-size: var(--icen-density-font-size-lg); }
35
+ .icen-avatar img {
35
36
  width: 100%;
36
37
  height: 100%;
37
38
  object-fit: cover;
38
39
  }
39
40
 
40
41
  /* 头像组:多个头像重叠 */
41
- .avatar-group {
42
+ .icen-avatar-group {
42
43
  display: inline-flex;
43
44
  align-items: center;
44
45
  }
45
- .avatar-group .avatar {
46
- border: 2px solid var(--token-bg);
47
- margin-left: -8px;
46
+ .icen-avatar-group .icen-avatar {
47
+ border: 2px solid var(--icen-token-bg);
48
+ margin-inline-start: -8px;
48
49
  }
49
- .avatar-group .avatar:first-child { margin-left: 0; }
50
+ .icen-avatar-group .icen-avatar:first-child { margin-inline-start: 0; }
50
51
 
51
- /* 在线状态点 */
52
- .avatar-status {
52
+ /* 在线状态点(与 .icen-badge 同为物理右下角契约,RTL 不镜像) */
53
+ .icen-avatar-status {
53
54
  position: absolute;
54
55
  bottom: 0;
55
- right: 0;
56
+ right: 0; /* guard:allow-physical 状态点钉在头像物理右下角(同角标契约) */
56
57
  width: 10px;
57
58
  height: 10px;
58
- border: 2px solid var(--token-bg);
59
- border-radius: var(--radius-full);
60
- background: var(--token-text-faint);
59
+ border: 2px solid var(--icen-token-bg);
60
+ border-radius: var(--icen-radius-full);
61
+ background: var(--icen-token-text-faint);
61
62
  }
62
- .avatar-status--online { background: var(--token-success); }
63
- .avatar-status--busy { background: var(--token-error); }
64
- .avatar-status--away { background: var(--token-warning); }
63
+ .icen-avatar-status--online { background: var(--icen-token-success); }
64
+ .icen-avatar-status--busy { background: var(--icen-token-error); }
65
+ .icen-avatar-status--away { background: var(--icen-token-warning); }
65
66
 
66
67
  /* 头像色彩变体(文字头像底色) */
67
- .avatar--info { background: color-mix(in srgb, var(--token-info) 15%, transparent); color: var(--token-info); }
68
- .avatar--success { background: color-mix(in srgb, var(--token-success) 15%, transparent); color: var(--token-success); }
69
- .avatar--warning { background: color-mix(in srgb, var(--token-warning) 15%, transparent); color: var(--token-warning); }
70
- .avatar--error { background: color-mix(in srgb, var(--token-error) 15%, transparent); color: var(--token-error); }
68
+ .icen-avatar--info { background: color-mix(in srgb, var(--icen-token-info) 15%, transparent); color: var(--icen-token-info); }
69
+ .icen-avatar--success { background: color-mix(in srgb, var(--icen-token-success) 15%, transparent); color: var(--icen-token-success); }
70
+ .icen-avatar--warning { background: color-mix(in srgb, var(--icen-token-warning) 15%, transparent); color: var(--icen-token-warning); }
71
+ .icen-avatar--error { background: color-mix(in srgb, var(--icen-token-error) 15%, transparent); color: var(--icen-token-error); }
71
72
 
72
73
  /* 渐变底头像 */
73
- .avatar--gradient {
74
- background: linear-gradient(135deg, var(--token-accent), var(--token-accent-deep, var(--token-accent)));
75
- color: var(--token-on-accent);
74
+ .icen-avatar--gradient {
75
+ background: linear-gradient(135deg, var(--icen-token-accent), var(--icen-token-accent-deep, var(--icen-token-accent)));
76
+ color: var(--icen-token-on-accent);
76
77
  }
77
78
 
78
79
  /* 方形头像 */
79
- .avatar--square { border-radius: var(--radius-md); }
80
+ .icen-avatar--square { border-radius: var(--icen-radius-md); }
80
81
 
81
82
  /* 头像通知环(红圈外框) */
82
- .avatar--ring {
83
- box-shadow: 0 0 0 2px var(--token-bg), 0 0 0 4px var(--token-error);
83
+ .icen-avatar--ring {
84
+ box-shadow: 0 0 0 2px var(--icen-token-bg), 0 0 0 4px var(--icen-token-error);
84
85
  }
85
86
 
86
87
  /* 头像组溢出计数 */
87
- .avatar-group-count {
88
+ .icen-avatar-group-count {
88
89
  display: inline-flex;
89
90
  align-items: center;
90
91
  justify-content: center;
91
92
  width: 28px;
92
93
  height: 28px;
93
- font-size: var(--density-font-size-2xs);
94
+ font-size: var(--icen-density-font-size-2xs);
94
95
  font-weight: 600;
95
- color: var(--token-text-muted);
96
- background: var(--token-fill-2);
97
- border: 2px solid var(--token-bg);
98
- border-radius: var(--radius-full);
99
- margin-left: -8px;
96
+ color: var(--icen-token-text-muted);
97
+ background: var(--icen-token-fill-2);
98
+ border: 2px solid var(--icen-token-bg);
99
+ border-radius: var(--icen-radius-full);
100
+ margin-inline-start: -8px;
100
101
  }
101
102
 
102
103
  /* ══════════════ media-card · 封面卡 ══════════════ */
103
- .media-card {
104
+ .icen-media-card {
104
105
  position: relative;
105
106
  overflow: hidden;
106
- border-radius: var(--radius-lg);
107
- background: var(--token-bg-soft);
107
+ border-radius: var(--icen-radius-lg);
108
+ background: var(--icen-token-bg-soft);
108
109
  transition:
109
110
  transform var(--icen-tx-slow),
110
111
  box-shadow var(--icen-tx-slow);
111
112
  }
112
- .media-card:hover {
113
- transform: translateY(-6px);
114
- box-shadow:
115
- var(--token-shadow-overlay),
116
- 0 0 20px var(--token-accent-glow);
113
+ /* hover 抬升仅可悬停设备生效(触屏关闭,AGENTS 动效守卫) */
114
+ @media (hover: hover) and (pointer: fine) {
115
+ .icen-media-card:hover {
116
+ transform: translateY(-6px);
117
+ box-shadow:
118
+ var(--icen-token-shadow-overlay),
119
+ 0 0 20px var(--icen-token-accent-glow);
120
+ }
117
121
  }
118
- .media-card-cover {
122
+ .icen-media-card-cover {
119
123
  display: block;
120
124
  width: 100%;
121
125
  aspect-ratio: 2 / 3;
122
126
  object-fit: cover;
123
127
  }
124
- .media-card-overlay {
128
+ .icen-media-card-overlay {
125
129
  position: absolute;
126
- left: 0; right: 0; bottom: 0;
127
- padding: 32px var(--density-space-sm) var(--density-space-xs);
130
+ inset-inline: 0; bottom: 0;
131
+ padding: 32px var(--icen-density-space-sm) var(--icen-density-space-xs);
128
132
  background: linear-gradient(
129
133
  to top,
130
- color-mix(in srgb, var(--token-text) 72%, transparent),
131
- color-mix(in srgb, var(--token-text) 35%, transparent) 65%,
134
+ color-mix(in srgb, var(--icen-token-text) 72%, transparent),
135
+ color-mix(in srgb, var(--icen-token-text) 35%, transparent) 65%,
132
136
  transparent
133
137
  );
134
138
  backdrop-filter: blur(10px);
135
139
  -webkit-backdrop-filter: blur(10px);
136
- color: var(--token-bg);
140
+ color: var(--icen-token-bg);
137
141
  transform: translateY(100%);
138
142
  transition: transform var(--icen-tx-normal);
139
143
  pointer-events: none;
144
+ /* 下圆角自带:backdrop-filter 在部分 Chromium 不被祖先 overflow+radius 裁切(直角戳出圆角),
145
+ 不赌浏览器行为,overlay 底部两角与卡同弧度 */
146
+ border-end-start-radius: var(--icen-radius-lg);
147
+ border-end-end-radius: var(--icen-radius-lg);
140
148
  }
141
- .media-card:hover .media-card-overlay {
149
+ .icen-media-card:hover .icen-media-card-overlay {
142
150
  transform: translateY(0);
143
151
  transition-delay: var(--media-overlay-delay, 80ms);
144
152
  }
145
- .media-card-overlay-title {
146
- font-size: var(--density-font-size-md);
153
+ .icen-media-card-overlay-title {
154
+ font-size: var(--icen-density-font-size-md);
147
155
  font-weight: 600;
148
156
  margin: 0;
149
157
  }
150
- .media-card-overlay-desc {
151
- font-size: var(--density-font-size-xs);
158
+ .icen-media-card-overlay-desc {
159
+ font-size: var(--icen-density-font-size-xs);
152
160
  margin: 2px 0 0;
153
161
  opacity: 0.8;
154
162
  }
155
163
 
156
164
  /* ══════════════ rating · 星级评分 ══════════════ */
157
- .rating {
165
+ .icen-rating {
158
166
  display: inline-flex;
159
167
  align-items: center;
160
168
  gap: 2px;
161
169
  }
162
- .rating-star {
170
+ .icen-rating-star {
163
171
  padding: 2px;
164
- border-radius: var(--radius-xs);
172
+ border-radius: var(--icen-radius-xs);
165
173
  background: none;
166
174
  border: 0;
167
175
  cursor: pointer;
@@ -171,125 +179,133 @@
171
179
  -webkit-tap-highlight-color: transparent;
172
180
  transition: transform var(--icen-tx-fast);
173
181
  }
174
- .rating-star:hover { transform: scale(1.1); }
175
- .rating-star:focus-visible {
182
+ /* 悬停放大反馈仅可悬停设备生效(触屏关闭,避免点按后 scale 粘住) */
183
+ @media (hover: hover) and (pointer: fine) {
184
+ .icen-rating-star:hover { transform: scale(1.1); }
185
+ }
186
+ .icen-rating-star:focus-visible {
176
187
  outline: none;
177
188
  box-shadow: var(--icen-ring);
178
189
  }
179
- .rating-star svg {
190
+ .icen-rating-star svg {
180
191
  width: 18px;
181
192
  height: 18px;
182
193
  display: block;
183
194
  fill: transparent;
184
- stroke: var(--token-line-strong);
195
+ stroke: var(--icen-token-line-strong);
185
196
  stroke-width: 1.6;
186
197
  transition:
187
198
  fill var(--icen-tx-fast),
188
199
  stroke var(--icen-tx-fast);
189
200
  }
190
- .rating--sm .rating-star svg { width: 14px; height: 14px; }
191
- .rating--lg .rating-star svg { width: 22px; height: 22px; }
192
- .rating-star.is-filled svg {
193
- fill: var(--token-warning);
194
- stroke: var(--token-warning);
201
+ .icen-rating--sm .icen-rating-star svg { width: 14px; height: 14px; }
202
+ .icen-rating--lg .icen-rating-star svg { width: 22px; height: 22px; }
203
+ .icen-rating-star.is-filled svg {
204
+ fill: var(--icen-token-warning);
205
+ stroke: var(--icen-token-warning);
195
206
  }
196
- .rating-star.is-half svg {
197
- fill: color-mix(in srgb, var(--token-warning) 50%, transparent);
198
- stroke: var(--token-warning);
207
+ .icen-rating-star.is-half svg {
208
+ fill: color-mix(in srgb, var(--icen-token-warning) 50%, transparent);
209
+ stroke: var(--icen-token-warning);
199
210
  }
200
- .rating-value {
201
- margin-left: var(--density-space-xs);
202
- font-size: var(--density-font-size-sm);
203
- color: var(--token-text-muted);
211
+ .icen-rating-value {
212
+ margin-inline-start: var(--icen-density-space-xs);
213
+ font-size: var(--icen-density-font-size-sm);
214
+ color: var(--icen-token-text-muted);
204
215
  font-variant-numeric: tabular-nums;
205
216
  }
206
217
 
207
218
  /* 只读模式(不可交互) */
208
- .rating--readonly .rating-star {
219
+ .icen-rating--readonly .icen-rating-star {
209
220
  cursor: default;
210
221
  }
211
- .rating--readonly .rating-star:hover {
222
+ .icen-rating--readonly .icen-rating-star:hover {
212
223
  transform: none;
213
224
  }
214
225
 
215
226
  /* 清除评分钮 */
216
- .rating-clear {
227
+ .icen-rating-clear {
217
228
  display: inline-flex;
218
229
  align-items: center;
219
230
  justify-content: center;
220
231
  width: 20px;
221
232
  height: 20px;
222
- margin-left: 4px;
233
+ margin-inline-start: 4px;
223
234
  padding: 0;
224
235
  border: 0;
225
- border-radius: var(--radius-xs);
236
+ border-radius: var(--icen-radius-xs);
226
237
  background: transparent;
227
- color: var(--token-text-faint);
238
+ color: var(--icen-token-text-faint);
228
239
  cursor: pointer;
229
240
  transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
230
241
  }
231
- .rating-clear:hover {
232
- color: var(--token-text);
233
- background: var(--token-fill-1);
242
+ .icen-rating-clear:hover {
243
+ color: var(--icen-token-text);
244
+ background: var(--icen-token-fill-1);
234
245
  }
235
- .rating-clear svg { width: 12px; height: 12px; }
246
+ .icen-rating-clear svg { width: 12px; height: 12px; }
236
247
 
237
248
  /* 评分数(评价人数) */
238
- .rating-count {
239
- margin-left: var(--density-space-xs);
240
- font-size: var(--density-font-size-xs);
241
- color: var(--token-text-faint);
249
+ .icen-rating-count {
250
+ margin-inline-start: var(--icen-density-space-xs);
251
+ font-size: var(--icen-density-font-size-xs);
252
+ color: var(--icen-token-text-faint);
242
253
  font-variant-numeric: tabular-nums;
243
254
  }
244
255
 
245
256
  /* 评分 + 文字摘要(如「4.5 · 128 条评价」) */
246
- .rating-summary {
257
+ .icen-rating-summary {
247
258
  display: inline-flex;
248
259
  align-items: center;
249
- gap: var(--density-space-xs);
250
- font-size: var(--density-font-size-sm);
251
- color: var(--token-text-muted);
260
+ gap: var(--icen-density-space-xs);
261
+ font-size: var(--icen-density-font-size-sm);
262
+ color: var(--icen-token-text-muted);
252
263
  }
253
264
 
254
265
  /* ══════════════ carousel · 轮播(behaviors/carousel 配套) ══════════════
255
266
  * DOM 契约:
256
- * <div class="carousel" data-carousel>
257
- * <div class="carousel-track"><div class="carousel-slide">…</div>×n</div>
258
- * <button class="carousel-arrow carousel-arrow--prev" aria-label="上一张">…</button>
259
- * <button class="carousel-arrow carousel-arrow--next" aria-label="下一张">…</button>
260
- * <div class="carousel-dots"></div> <!-- behavior 自动生成 .carousel-dot -->
267
+ * <div class="icen-carousel" data-icen-carousel>
268
+ * <div class="icen-carousel-track"><div class="icen-carousel-slide">…</div>×n</div>
269
+ * <button class="icen-carousel-arrow icen-carousel-arrow--prev" aria-label="上一张">…</button>
270
+ * <button class="icen-carousel-arrow icen-carousel-arrow--next" aria-label="下一张">…</button>
271
+ * <span class="icen-carousel-index" aria-hidden="true"></span> <!-- 可选:behavior 同步「i / n」 -->
272
+ * <div class="icen-carousel-dots"></div> <!-- behavior 自动生成 .icen-carousel-dot -->
261
273
  * </div>
274
+ * behavior 另生成视觉隐藏的 .icen-carousel-status(role=status 通报「第 i / n 张」),
275
+ * slide 自动带 role=group + aria-roledescription + 第 N 张标签;键盘 ←/→ 在 RTL 下镜像。
276
+ * 圆点/箭头是覆盖件:亮玻璃 + 分离环,不依赖主题 accent(accent 色幻灯上同样可辨);
277
+ * 触屏箭头 44px、圆点隐形命中区 44px。
262
278
  */
263
- .carousel {
279
+ .icen-carousel {
264
280
  position: relative;
265
281
  overflow: hidden;
266
- border-radius: var(--radius-lg);
267
- background: var(--token-control);
282
+ border-radius: var(--icen-radius-lg);
283
+ background: var(--icen-token-control);
268
284
  }
269
- .carousel-track {
285
+ .icen-carousel-track {
270
286
  display: flex;
271
287
  transition: transform var(--icen-tx-slow);
272
288
  }
273
- .carousel-slide {
289
+ .icen-carousel-slide {
274
290
  width: 100%;
275
291
  flex-shrink: 0;
276
292
  }
277
- .carousel-arrow {
293
+ .icen-carousel-arrow {
278
294
  position: absolute;
279
295
  top: 50%;
280
296
  transform: translateY(-50%);
281
297
  width: 32px;
282
298
  height: 32px;
283
- border-radius: var(--radius-full);
284
- background: color-mix(in srgb, var(--token-card) 78%, transparent);
285
- border: 1px solid var(--token-outline-soft);
286
- color: var(--token-text);
299
+ border-radius: var(--icen-radius-full);
300
+ background: color-mix(in srgb, var(--icen-token-card) 78%, transparent);
301
+ border: 1px solid var(--icen-token-outline-soft);
302
+ color: var(--icen-token-text);
287
303
  display: flex;
288
304
  align-items: center;
289
305
  justify-content: center;
290
306
  backdrop-filter: blur(4px);
291
307
  -webkit-backdrop-filter: blur(4px);
292
- box-shadow: var(--token-shadow-card);
308
+ box-shadow: var(--icen-token-shadow-card);
293
309
  cursor: pointer;
294
310
  z-index: 2;
295
311
  transition:
@@ -297,123 +313,144 @@
297
313
  transform var(--icen-tx-fast),
298
314
  opacity var(--icen-tx-fast);
299
315
  }
300
- .carousel-arrow:hover {
301
- background: var(--token-card-strong);
316
+ .icen-carousel-arrow:hover {
317
+ background: var(--icen-token-card-strong);
302
318
  }
303
- .carousel-arrow:focus-visible {
319
+ .icen-carousel-arrow:focus-visible {
304
320
  outline: none;
305
- box-shadow: var(--icen-ring), var(--token-shadow-card);
321
+ box-shadow: var(--icen-ring), var(--icen-token-shadow-card);
306
322
  }
307
- .carousel-arrow:active {
323
+ .icen-carousel-arrow:active {
308
324
  transform: translateY(-50%) scale(0.95);
309
325
  }
310
- .carousel-arrow:disabled,
311
- .carousel-arrow[aria-disabled='true'] {
326
+ .icen-carousel-arrow:disabled,
327
+ .icen-carousel-arrow[aria-disabled='true'] {
312
328
  opacity: var(--icen-disabled-opacity);
313
329
  cursor: not-allowed;
314
330
  pointer-events: none;
315
331
  }
316
- .carousel-arrow svg { width: 16px; height: 16px; }
317
- .carousel-arrow--prev { left: var(--density-space-sm); }
318
- .carousel-arrow--next { right: var(--density-space-sm); }
332
+ .icen-carousel-arrow svg { width: 16px; height: 16px; }
333
+ .icen-carousel-arrow--prev { inset-inline-start: var(--icen-density-space-sm); }
334
+ .icen-carousel-arrow--next { inset-inline-end: var(--icen-density-space-sm); }
319
335
 
320
- .carousel-dots {
336
+ .icen-carousel-dots {
321
337
  position: absolute;
322
- bottom: var(--density-space-sm);
323
- left: 50%;
338
+ bottom: var(--icen-density-space-sm);
339
+ left: 50%; /* guard:allow-physical 水平居中:left 50% + translateX(-50%) 任意方向下均为容器水平中心 */
324
340
  transform: translateX(-50%);
325
341
  display: flex;
326
342
  gap: 6px;
327
343
  z-index: 2;
328
344
  }
329
- .carousel-dot {
345
+ .icen-carousel-dot {
346
+ position: relative;
330
347
  width: 6px;
331
348
  height: 6px;
332
349
  padding: 0;
333
350
  border: 0;
334
- border-radius: var(--radius-full);
335
- background: color-mix(in srgb, var(--token-card) 70%, transparent);
351
+ border-radius: var(--icen-radius-full);
352
+ /* 覆盖任意媒质:亮玻点 + 细环防亮图隐形;激活为实心长 pill(覆盖件不吃主题 accent) */
353
+ background: color-mix(in srgb, var(--icen-token-card) 58%, transparent);
354
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--icen-token-text) 12%, transparent);
355
+ backdrop-filter: blur(4px);
356
+ -webkit-backdrop-filter: blur(4px);
336
357
  cursor: pointer;
337
358
  transition:
338
359
  width var(--icen-tx-fast),
339
360
  background-color var(--icen-tx-fast);
340
361
  }
341
- .carousel-dot:hover {
342
- background: color-mix(in srgb, var(--token-accent) 70%, transparent);
362
+ /* 触屏命中扩张:视觉 6px 不变,隐形命中区 44px(不影响布局,不参与 hover 命中样式) */
363
+ .icen-carousel-dot::after {
364
+ content: '';
365
+ position: absolute;
366
+ inset: -6px;
343
367
  }
344
- .carousel-dot:focus-visible {
368
+ .icen-carousel-dot:hover {
369
+ background: color-mix(in srgb, var(--icen-token-card) 85%, transparent);
370
+ }
371
+ .icen-carousel-dot:focus-visible {
345
372
  outline: none;
346
- box-shadow: var(--icen-ring);
373
+ box-shadow: var(--icen-ring), 0 0 0 1px color-mix(in srgb, var(--icen-token-text) 12%, transparent);
347
374
  }
348
- .carousel-dot.is-active,
349
- .carousel-dot[aria-current='true'] {
375
+ .icen-carousel-dot.is-active,
376
+ .icen-carousel-dot[aria-current='true'] {
350
377
  width: 20px;
351
- background: var(--token-accent);
378
+ background: var(--icen-token-card-strong);
379
+ box-shadow: var(--icen-token-shadow-card);
380
+ }
381
+ /* 读屏状态行(behavior 生成,视觉隐藏) */
382
+ .icen-carousel-status {
383
+ position: absolute;
384
+ inline-size: 1px;
385
+ block-size: 1px;
386
+ overflow: hidden;
387
+ clip-path: inset(50%);
388
+ white-space: nowrap;
352
389
  }
353
390
 
354
391
  /* 自动播放进度条(behavior 可选) */
355
- .carousel-progress {
392
+ .icen-carousel-progress {
356
393
  position: absolute;
357
394
  bottom: 0;
358
- left: 0;
395
+ left: 0; /* guard:allow-physical 自动播放进度由 behavior 自左向右写 width,动画语义物理 */
359
396
  height: 2px;
360
- background: var(--token-accent);
397
+ background: var(--icen-token-accent);
361
398
  transition: width var(--icen-tx-slow);
362
399
  }
363
400
 
364
401
  /* 缩略图导航条(deliberate exception:隐藏滚动条是设计意图,见文件头注释) */
365
- .carousel-thumbs {
402
+ .icen-carousel-thumbs {
366
403
  display: flex;
367
- gap: var(--density-space-xs);
368
- margin-top: var(--density-space-sm);
369
- padding: var(--density-space-xs);
404
+ gap: var(--icen-density-space-xs);
405
+ margin-top: var(--icen-density-space-sm);
406
+ padding: var(--icen-density-space-xs);
370
407
  overflow-x: auto;
371
408
  scrollbar-width: none;
372
409
  }
373
- .carousel-thumbs::-webkit-scrollbar { display: none; }
374
- .carousel-thumb {
410
+ .icen-carousel-thumbs::-webkit-scrollbar { display: none; }
411
+ .icen-carousel-thumb {
375
412
  flex-shrink: 0;
376
413
  width: 56px;
377
414
  height: 40px;
378
- border-radius: var(--radius-sm);
415
+ border-radius: var(--icen-radius-sm);
379
416
  overflow: hidden;
380
417
  border: 2px solid transparent;
381
418
  cursor: pointer;
382
419
  opacity: 0.6;
383
420
  transition: opacity var(--icen-tx-fast), border-color var(--icen-tx-fast);
384
421
  }
385
- .carousel-thumb:hover { opacity: 1; }
386
- .carousel-thumb.is-active,
387
- .carousel-thumb[aria-current='true'] {
422
+ .icen-carousel-thumb:hover { opacity: 1; }
423
+ .icen-carousel-thumb.is-active,
424
+ .icen-carousel-thumb[aria-current='true'] {
388
425
  opacity: 1;
389
- border-color: var(--token-accent);
426
+ border-color: var(--icen-token-accent);
390
427
  }
391
- .carousel-thumb img,
392
- .carousel-thumb video {
428
+ .icen-carousel-thumb img,
429
+ .icen-carousel-thumb video {
393
430
  width: 100%;
394
431
  height: 100%;
395
432
  object-fit: cover;
396
433
  }
397
434
 
398
435
  /* 轮播索引指示器(1 / 5) */
399
- .carousel-index {
436
+ .icen-carousel-index {
400
437
  position: absolute;
401
- top: var(--density-space-sm);
402
- right: var(--density-space-sm);
403
- padding: 2px var(--density-space-sm);
404
- font-size: var(--density-font-size-xs);
438
+ top: var(--icen-density-space-sm);
439
+ inset-inline-end: var(--icen-density-space-sm);
440
+ padding: 2px var(--icen-density-space-sm);
441
+ font-size: var(--icen-density-font-size-xs);
405
442
  font-variant-numeric: tabular-nums;
406
- color: var(--token-bg);
407
- background: color-mix(in srgb, var(--token-text) 60%, transparent);
408
- border-radius: var(--radius-full);
443
+ color: var(--icen-token-bg);
444
+ background: color-mix(in srgb, var(--icen-token-text) 60%, transparent);
445
+ border-radius: var(--icen-radius-full);
409
446
  backdrop-filter: blur(4px);
410
447
  -webkit-backdrop-filter: blur(4px);
411
448
  z-index: 2;
412
449
  }
413
450
 
414
451
  /* 渐入动画 */
415
- .carousel-slide {
416
- animation: carousel-slide-fade var(--icen-tx-normal) var(--ease-out);
452
+ .icen-carousel-slide {
453
+ animation: carousel-slide-fade var(--icen-tx-normal) var(--icen-ease-out);
417
454
  }
418
455
  @keyframes carousel-slide-fade {
419
456
  from { opacity: 0.6; }
@@ -421,7 +458,24 @@
421
458
  }
422
459
 
423
460
  @media (prefers-reduced-motion: reduce) {
424
- .carousel-track { transition: none; }
425
- .carousel-slide { animation: none; }
426
- .media-card, .rating-star, .carousel-arrow, .carousel-thumb { transition: none; }
461
+ .icen-carousel-track { transition: none; }
462
+ .icen-carousel-slide { animation: none; }
463
+ .icen-media-card, .icen-rating-star, .icen-carousel-arrow, .icen-carousel-thumb { transition: none; }
464
+ }
465
+
466
+ @media (pointer: coarse) {
467
+ .icen-carousel-arrow { width: 44px; height: 44px; }
468
+ .icen-carousel-dot::after { inset: -19px; } /* 6px 视觉 → 44px 命中 */
469
+ }
470
+
471
+ @media (forced-colors: active) {
472
+ .icen-carousel-dot { background: Canvas; box-shadow: none; border: 1px solid ButtonText; }
473
+ .icen-carousel-dot.is-active,
474
+ .icen-carousel-dot[aria-current='true'] { background: Highlight; border-color: Highlight; }
475
+ .icen-carousel-arrow { border: 1px solid ButtonText; }
476
+ }
477
+
478
+ /* ── RTL:方向性图标镜像(轮播左右箭头)── */
479
+ :is([dir='rtl']) .icen-carousel-arrow svg { transform: scaleX(-1); }
480
+
427
481
  }