@icen.ai/ui 0.9.0 → 0.11.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 (431) hide show
  1. package/AGENTS.md +82 -254
  2. package/LICENSE +21 -0
  3. package/README.md +60 -96
  4. package/dist/base.css +258 -188
  5. package/dist/behaviors/accordion.mjs +8 -8
  6. package/dist/behaviors/ai-branch.d.mts +1 -1
  7. package/dist/behaviors/ai-branch.mjs +1011 -94
  8. package/dist/behaviors/ai-chat.d.mts +9 -9
  9. package/dist/behaviors/ai-chat.mjs +1122 -169
  10. package/dist/behaviors/ai-composer.d.mts +47 -15
  11. package/dist/behaviors/ai-composer.mjs +2018 -534
  12. package/dist/behaviors/ai-core.d.mts +1 -1
  13. package/dist/behaviors/ai-core.mjs +1017 -107
  14. package/dist/behaviors/ai-diff.mjs +1020 -127
  15. package/dist/behaviors/ai-feedback.d.mts +1 -1
  16. package/dist/behaviors/ai-feedback.mjs +1036 -126
  17. package/dist/behaviors/ai-panel.d.mts +10 -10
  18. package/dist/behaviors/ai-panel.mjs +1285 -266
  19. package/dist/behaviors/ai-provider.d.mts +1 -1
  20. package/dist/behaviors/ai-provider.mjs +1004 -101
  21. package/dist/behaviors/ai-threads.d.mts +1 -1
  22. package/dist/behaviors/ai-threads.mjs +1069 -154
  23. package/dist/behaviors/ai-tool.d.mts +3 -3
  24. package/dist/behaviors/ai-tool.mjs +2087 -413
  25. package/dist/behaviors/ai-tools.d.mts +89 -16
  26. package/dist/behaviors/ai-tools.mjs +5365 -380
  27. package/dist/behaviors/autocomplete.d.mts +53 -0
  28. package/dist/behaviors/autocomplete.mjs +1601 -0
  29. package/dist/behaviors/back-top.d.mts +1 -1
  30. package/dist/behaviors/back-top.mjs +952 -14
  31. package/dist/behaviors/carousel.d.mts +1 -1
  32. package/dist/behaviors/carousel.mjs +914 -12
  33. package/dist/behaviors/cascader.d.mts +48 -0
  34. package/dist/behaviors/cascader.mjs +1867 -0
  35. package/dist/behaviors/charts.d.mts +72 -8
  36. package/dist/behaviors/charts.mjs +1953 -272
  37. package/dist/behaviors/code-block.d.mts +36 -0
  38. package/dist/behaviors/code-block.mjs +1619 -0
  39. package/dist/behaviors/command-palette.d.mts +9 -6
  40. package/dist/behaviors/command-palette.mjs +164 -62
  41. package/dist/behaviors/context-menu.d.mts +10 -9
  42. package/dist/behaviors/context-menu.mjs +1113 -44
  43. package/dist/behaviors/controls.d.mts +21 -21
  44. package/dist/behaviors/controls.mjs +1024 -134
  45. package/dist/behaviors/copy.d.mts +21 -2
  46. package/dist/behaviors/copy.mjs +1207 -42
  47. package/dist/behaviors/datatable.d.mts +55 -5
  48. package/dist/behaviors/datatable.mjs +2033 -212
  49. package/dist/behaviors/date-picker.d.mts +0 -1
  50. package/dist/behaviors/date-picker.mjs +1341 -293
  51. package/dist/behaviors/design.d.mts +54 -0
  52. package/dist/behaviors/design.mjs +109 -0
  53. package/dist/behaviors/dropdown.d.mts +5 -6
  54. package/dist/behaviors/dropdown.mjs +262 -110
  55. package/dist/behaviors/events.d.mts +127 -10
  56. package/dist/behaviors/events.mjs +58 -3
  57. package/dist/behaviors/feedback.d.mts +30 -0
  58. package/dist/behaviors/feedback.mjs +296 -0
  59. package/dist/behaviors/focus.d.mts +8 -0
  60. package/dist/behaviors/focus.mjs +24 -0
  61. package/dist/behaviors/form-validate.d.mts +111 -0
  62. package/dist/behaviors/form-validate.mjs +1746 -0
  63. package/dist/behaviors/i18n.d.mts +790 -0
  64. package/dist/behaviors/i18n.mjs +1713 -0
  65. package/dist/behaviors/icons.d.mts +93 -0
  66. package/dist/behaviors/icons.mjs +113 -0
  67. package/dist/behaviors/input.d.mts +9 -1
  68. package/dist/behaviors/input.mjs +1059 -60
  69. package/dist/behaviors/kb-access.d.mts +3 -3
  70. package/dist/behaviors/kb-access.mjs +2135 -239
  71. package/dist/behaviors/kb-acl.d.mts +8 -8
  72. package/dist/behaviors/kb-acl.mjs +1120 -179
  73. package/dist/behaviors/kb-answer.d.mts +2 -2
  74. package/dist/behaviors/kb-answer.mjs +2120 -435
  75. package/dist/behaviors/kb-audit.d.mts +3 -3
  76. package/dist/behaviors/kb-audit.mjs +1077 -154
  77. package/dist/behaviors/kb-canvas.d.mts +3 -3
  78. package/dist/behaviors/kb-canvas.mjs +1101 -177
  79. package/dist/behaviors/kb-chain.d.mts +2 -2
  80. package/dist/behaviors/kb-chain.mjs +1023 -100
  81. package/dist/behaviors/kb-checkpoint.d.mts +3 -3
  82. package/dist/behaviors/kb-checkpoint.mjs +1320 -169
  83. package/dist/behaviors/kb-chunks.d.mts +2 -2
  84. package/dist/behaviors/kb-chunks.mjs +1153 -213
  85. package/dist/behaviors/kb-citation.d.mts +3 -3
  86. package/dist/behaviors/kb-citation.mjs +1221 -185
  87. package/dist/behaviors/kb-clarify.d.mts +2 -2
  88. package/dist/behaviors/kb-clarify.mjs +1059 -130
  89. package/dist/behaviors/kb-conflict.d.mts +2 -2
  90. package/dist/behaviors/kb-conflict.mjs +1042 -119
  91. package/dist/behaviors/kb-connector.d.mts +2 -2
  92. package/dist/behaviors/kb-connector.mjs +1105 -176
  93. package/dist/behaviors/kb-core.d.mts +7 -2
  94. package/dist/behaviors/kb-core.mjs +1078 -162
  95. package/dist/behaviors/kb-eval.d.mts +2 -2
  96. package/dist/behaviors/kb-eval.mjs +1977 -144
  97. package/dist/behaviors/kb-explain.d.mts +3 -3
  98. package/dist/behaviors/kb-explain.mjs +1037 -104
  99. package/dist/behaviors/kb-filter.d.mts +2 -2
  100. package/dist/behaviors/kb-filter.mjs +2014 -178
  101. package/dist/behaviors/kb-gap.d.mts +3 -3
  102. package/dist/behaviors/kb-gap.mjs +1044 -121
  103. package/dist/behaviors/kb-hittest.d.mts +3 -3
  104. package/dist/behaviors/kb-hittest.mjs +1095 -151
  105. package/dist/behaviors/kb-metadata.mjs +1058 -130
  106. package/dist/behaviors/kb-passage.d.mts +4 -4
  107. package/dist/behaviors/kb-passage.mjs +1102 -161
  108. package/dist/behaviors/kb-pipeline.d.mts +4 -4
  109. package/dist/behaviors/kb-pipeline.mjs +1083 -162
  110. package/dist/behaviors/kb-qa.mjs +1089 -160
  111. package/dist/behaviors/kb-rerank.d.mts +2 -2
  112. package/dist/behaviors/kb-rerank.mjs +1048 -114
  113. package/dist/behaviors/kb-retrieval.d.mts +2 -2
  114. package/dist/behaviors/kb-retrieval.mjs +2079 -226
  115. package/dist/behaviors/kb-review.d.mts +2 -2
  116. package/dist/behaviors/kb-review.mjs +1996 -159
  117. package/dist/behaviors/kb-sandbox.d.mts +3 -3
  118. package/dist/behaviors/kb-sandbox.mjs +1033 -105
  119. package/dist/behaviors/kb-segment.d.mts +2 -2
  120. package/dist/behaviors/kb-segment.mjs +1112 -179
  121. package/dist/behaviors/kb-select.d.mts +24 -0
  122. package/dist/behaviors/kb-select.mjs +1995 -0
  123. package/dist/behaviors/kb-sources.d.mts +3 -3
  124. package/dist/behaviors/kb-sources.mjs +1085 -170
  125. package/dist/behaviors/kb-sql.d.mts +3 -3
  126. package/dist/behaviors/kb-sql.mjs +1144 -226
  127. package/dist/behaviors/kb-trace.d.mts +3 -3
  128. package/dist/behaviors/kb-trace.mjs +1051 -131
  129. package/dist/behaviors/kb-visibility.d.mts +2 -2
  130. package/dist/behaviors/kb-visibility.mjs +1087 -158
  131. package/dist/behaviors/kb-who-can.d.mts +2 -2
  132. package/dist/behaviors/kb-who-can.mjs +1980 -137
  133. package/dist/behaviors/mentions.d.mts +93 -0
  134. package/dist/behaviors/mentions.mjs +2153 -0
  135. package/dist/behaviors/modal.d.mts +4 -3
  136. package/dist/behaviors/modal.mjs +1056 -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 +1629 -268
  141. package/dist/behaviors/panel.d.mts +4 -0
  142. package/dist/behaviors/panel.mjs +995 -0
  143. package/dist/behaviors/popover.d.mts +28 -5
  144. package/dist/behaviors/popover.mjs +225 -24
  145. package/dist/behaviors/scroll-area.d.mts +17 -0
  146. package/dist/behaviors/scroll-area.mjs +59 -0
  147. package/dist/behaviors/select.d.mts +5 -2
  148. package/dist/behaviors/select.mjs +1416 -117
  149. package/dist/behaviors/sidebar.d.mts +1 -1
  150. package/dist/behaviors/sidebar.mjs +13 -13
  151. package/dist/behaviors/slider.d.mts +1 -1
  152. package/dist/behaviors/slider.mjs +12 -12
  153. package/dist/behaviors/split-pane.d.mts +1 -1
  154. package/dist/behaviors/split-pane.mjs +9 -7
  155. package/dist/behaviors/suggestions.d.mts +27 -0
  156. package/dist/behaviors/suggestions.mjs +1090 -0
  157. package/dist/behaviors/svg-parse.d.mts +14 -0
  158. package/dist/behaviors/svg-parse.mjs +37 -0
  159. package/dist/behaviors/tabs.d.mts +2 -2
  160. package/dist/behaviors/tabs.mjs +35 -25
  161. package/dist/behaviors/tag-input.d.mts +23 -5
  162. package/dist/behaviors/tag-input.mjs +1360 -104
  163. package/dist/behaviors/theme-switcher.d.mts +24 -0
  164. package/dist/behaviors/theme-switcher.mjs +1996 -0
  165. package/dist/behaviors/theme.d.mts +15 -8
  166. package/dist/behaviors/theme.mjs +406 -30
  167. package/dist/behaviors/toast.d.mts +24 -25
  168. package/dist/behaviors/toast.mjs +1267 -88
  169. package/dist/behaviors/tooltip.d.mts +4 -0
  170. package/dist/behaviors/tooltip.mjs +378 -0
  171. package/dist/behaviors/tree-select.d.mts +69 -0
  172. package/dist/behaviors/tree-select.mjs +1921 -0
  173. package/dist/behaviors/tree.d.mts +1 -1
  174. package/dist/behaviors/tree.mjs +18 -18
  175. package/dist/behaviors/upload.d.mts +3 -2
  176. package/dist/behaviors/upload.mjs +1077 -66
  177. package/dist/behaviors/url-safety.d.mts +8 -0
  178. package/dist/behaviors/url-safety.mjs +11 -0
  179. package/dist/cli.mjs +5 -6
  180. package/dist/components/accordion.d.mts +2 -0
  181. package/dist/components/ai-branch.d.mts +2 -0
  182. package/dist/components/ai-chat.css +682 -582
  183. package/dist/components/ai-chat.d.mts +2 -0
  184. package/dist/components/ai-composer.d.mts +2 -0
  185. package/dist/components/ai-context.d.mts +2 -0
  186. package/dist/components/ai-context.mjs +1 -0
  187. package/dist/components/ai-diff.css +153 -132
  188. package/dist/components/ai-diff.d.mts +2 -0
  189. package/dist/components/ai-feedback.d.mts +2 -0
  190. package/dist/components/ai-files.d.mts +2 -0
  191. package/dist/components/ai-message.d.mts +2 -0
  192. package/dist/components/ai-panel.css +353 -343
  193. package/dist/components/ai-reasoning.d.mts +2 -0
  194. package/dist/components/ai-subagent.d.mts +2 -0
  195. package/dist/components/ai-subagent.mjs +1 -0
  196. package/dist/components/ai-threads.d.mts +2 -0
  197. package/dist/components/ai-todo.d.mts +2 -0
  198. package/dist/components/ai-todo.mjs +1 -0
  199. package/dist/components/ai-tool-call.d.mts +2 -0
  200. package/dist/components/ai-tool-call.mjs +1 -0
  201. package/dist/components/ai-tool.css +397 -242
  202. package/dist/components/ai-usage.d.mts +2 -0
  203. package/dist/components/alert.d.mts +2 -0
  204. package/dist/components/autocomplete.css +61 -0
  205. package/dist/components/autocomplete.d.mts +2 -0
  206. package/dist/components/autocomplete.mjs +3 -0
  207. package/dist/components/avatar.d.mts +2 -0
  208. package/dist/components/back-top.css +74 -40
  209. package/dist/components/back-top.d.mts +2 -0
  210. package/dist/components/badge.css +44 -41
  211. package/dist/components/badge.d.mts +2 -0
  212. package/dist/components/breadcrumb.css +85 -46
  213. package/dist/components/breadcrumb.d.mts +2 -0
  214. package/dist/components/btn.css +105 -94
  215. package/dist/components/btn.d.mts +2 -0
  216. package/dist/components/card.css +124 -113
  217. package/dist/components/card.d.mts +2 -0
  218. package/dist/components/carousel.d.mts +2 -0
  219. package/dist/components/cascader.css +332 -0
  220. package/dist/components/cascader.d.mts +2 -0
  221. package/dist/components/cascader.mjs +3 -0
  222. package/dist/components/chart-area.css +54 -2
  223. package/dist/components/chart-area.d.mts +2 -0
  224. package/dist/components/chart-bar.css +147 -38
  225. package/dist/components/chart-bar.d.mts +2 -0
  226. package/dist/components/chart-calendar.d.mts +2 -0
  227. package/dist/components/chart-gauge.css +36 -13
  228. package/dist/components/chart-gauge.d.mts +2 -0
  229. package/dist/components/chart-graph.css +35 -20
  230. package/dist/components/chart-graph.d.mts +2 -0
  231. package/dist/components/chart-heatmap.css +67 -39
  232. package/dist/components/chart-heatmap.d.mts +2 -0
  233. package/dist/components/chart-line.css +62 -3
  234. package/dist/components/chart-line.d.mts +2 -0
  235. package/dist/components/chart-map.d.mts +2 -0
  236. package/dist/components/chart-pie.css +38 -6
  237. package/dist/components/chart-pie.d.mts +2 -0
  238. package/dist/components/chart-radar.css +57 -5
  239. package/dist/components/chart-radar.d.mts +2 -0
  240. package/dist/components/chart-scatter.css +47 -7
  241. package/dist/components/chart-scatter.d.mts +2 -0
  242. package/dist/components/chart-sparkline.css +25 -2
  243. package/dist/components/chart-sparkline.d.mts +2 -0
  244. package/dist/components/chart-stack.css +27 -13
  245. package/dist/components/chart-stack.d.mts +2 -0
  246. package/dist/components/charts.css +220 -84
  247. package/dist/components/charts.d.mts +2 -0
  248. package/dist/components/code-block.css +420 -0
  249. package/dist/components/code-block.d.mts +2 -0
  250. package/dist/components/code-block.mjs +4 -0
  251. package/dist/components/command-palette.css +150 -122
  252. package/dist/components/command-palette.d.mts +2 -0
  253. package/dist/components/content.css +274 -263
  254. package/dist/components/context-menu.d.mts +2 -0
  255. package/dist/components/copy.css +73 -45
  256. package/dist/components/copy.d.mts +2 -0
  257. package/dist/components/datatable.css +457 -202
  258. package/dist/components/datatable.d.mts +2 -0
  259. package/dist/components/date-picker.css +136 -105
  260. package/dist/components/date-picker.d.mts +2 -0
  261. package/dist/components/desc.d.mts +2 -0
  262. package/dist/components/dropdown.d.mts +2 -0
  263. package/dist/components/empty.css +72 -69
  264. package/dist/components/empty.d.mts +2 -0
  265. package/dist/components/feedback.css +211 -191
  266. package/dist/components/form-validate.css +134 -0
  267. package/dist/components/form-validate.d.mts +2 -0
  268. package/dist/components/form-validate.mjs +3 -0
  269. package/dist/components/form.css +157 -131
  270. package/dist/components/form.d.mts +2 -0
  271. package/dist/components/icon.css +113 -0
  272. package/dist/components/icon.d.mts +2 -0
  273. package/dist/components/icon.mjs +3 -0
  274. package/dist/components/input.css +163 -108
  275. package/dist/components/input.d.mts +2 -0
  276. package/dist/components/kb-access.d.mts +2 -0
  277. package/dist/components/kb-acl.d.mts +2 -0
  278. package/dist/components/kb-agent.css +300 -206
  279. package/dist/components/kb-answer.d.mts +2 -0
  280. package/dist/components/kb-audit.d.mts +2 -0
  281. package/dist/components/kb-canvas.d.mts +2 -0
  282. package/dist/components/kb-chain.d.mts +2 -0
  283. package/dist/components/kb-checkpoint.d.mts +2 -0
  284. package/dist/components/kb-chunks.d.mts +2 -0
  285. package/dist/components/kb-citation.d.mts +2 -0
  286. package/dist/components/kb-clarify.d.mts +2 -0
  287. package/dist/components/kb-conflict.d.mts +2 -0
  288. package/dist/components/kb-connector.d.mts +2 -0
  289. package/dist/components/kb-data.css +431 -315
  290. package/dist/components/kb-eval.d.mts +2 -0
  291. package/dist/components/kb-explain.d.mts +2 -0
  292. package/dist/components/kb-filter.d.mts +2 -0
  293. package/dist/components/kb-gap.d.mts +2 -0
  294. package/dist/components/kb-ground.css +333 -229
  295. package/dist/components/kb-hittest.d.mts +2 -0
  296. package/dist/components/kb-ingest.css +613 -434
  297. package/dist/components/kb-metadata.d.mts +2 -0
  298. package/dist/components/kb-ops.css +422 -302
  299. package/dist/components/kb-passage.d.mts +2 -0
  300. package/dist/components/kb-perm.css +374 -314
  301. package/dist/components/kb-pipeline.d.mts +2 -0
  302. package/dist/components/kb-qa.d.mts +2 -0
  303. package/dist/components/kb-rerank.d.mts +2 -0
  304. package/dist/components/kb-retrieval.d.mts +2 -0
  305. package/dist/components/kb-review.d.mts +2 -0
  306. package/dist/components/kb-sandbox.d.mts +2 -0
  307. package/dist/components/kb-search.css +653 -459
  308. package/dist/components/kb-segment.d.mts +2 -0
  309. package/dist/components/kb-sources.d.mts +2 -0
  310. package/dist/components/kb-sql.d.mts +2 -0
  311. package/dist/components/kb-trace.d.mts +2 -0
  312. package/dist/components/kb-visibility.d.mts +2 -0
  313. package/dist/components/kb-who-can.d.mts +2 -0
  314. package/dist/components/kb.css +170 -135
  315. package/dist/components/kb.d.mts +2 -0
  316. package/dist/components/kbd.d.mts +2 -0
  317. package/dist/components/layout.css +86 -83
  318. package/dist/components/layout.d.mts +2 -0
  319. package/dist/components/list.d.mts +2 -0
  320. package/dist/components/material-chinese.css +83 -0
  321. package/dist/components/material-soviet.css +86 -0
  322. package/dist/components/material.css +318 -0
  323. package/dist/components/media-card.d.mts +2 -0
  324. package/dist/components/media.css +225 -176
  325. package/dist/components/mentions.css +190 -0
  326. package/dist/components/mentions.d.mts +2 -0
  327. package/dist/components/mentions.mjs +3 -0
  328. package/dist/components/menu.css +121 -109
  329. package/dist/components/modal.css +116 -118
  330. package/dist/components/modal.d.mts +2 -0
  331. package/dist/components/nav.css +136 -129
  332. package/dist/components/nav.d.mts +2 -0
  333. package/dist/components/notification.css +247 -177
  334. package/dist/components/notification.d.mts +2 -0
  335. package/dist/components/pagination.css +62 -57
  336. package/dist/components/pagination.d.mts +2 -0
  337. package/dist/components/panel.css +70 -68
  338. package/dist/components/panel.d.mts +2 -0
  339. package/dist/components/panel.mjs +1 -0
  340. package/dist/components/pill.css +83 -72
  341. package/dist/components/pill.d.mts +2 -0
  342. package/dist/components/popover.css +80 -57
  343. package/dist/components/popover.d.mts +2 -0
  344. package/dist/components/progress.d.mts +2 -0
  345. package/dist/components/rating.d.mts +2 -0
  346. package/dist/components/result.d.mts +2 -0
  347. package/dist/components/scroll-area.css +29 -54
  348. package/dist/components/scroll-area.d.mts +2 -0
  349. package/dist/components/scroll-area.mjs +1 -0
  350. package/dist/components/segmented.css +167 -146
  351. package/dist/components/segmented.d.mts +2 -0
  352. package/dist/components/select.css +250 -191
  353. package/dist/components/select.d.mts +2 -0
  354. package/dist/components/sidebar.css +157 -143
  355. package/dist/components/sidebar.d.mts +2 -0
  356. package/dist/components/skeleton.d.mts +2 -0
  357. package/dist/components/slider.css +135 -128
  358. package/dist/components/slider.d.mts +2 -0
  359. package/dist/components/spinner.d.mts +2 -0
  360. package/dist/components/split-pane.css +120 -108
  361. package/dist/components/split-pane.d.mts +2 -0
  362. package/dist/components/stat.css +116 -109
  363. package/dist/components/stat.d.mts +2 -0
  364. package/dist/components/steps.css +114 -108
  365. package/dist/components/steps.d.mts +2 -0
  366. package/dist/components/switch.css +192 -149
  367. package/dist/components/switch.d.mts +2 -0
  368. package/dist/components/table.css +158 -112
  369. package/dist/components/table.d.mts +2 -0
  370. package/dist/components/tabs.css +143 -116
  371. package/dist/components/tabs.d.mts +2 -0
  372. package/dist/components/tag-input.css +52 -133
  373. package/dist/components/tag-input.d.mts +2 -0
  374. package/dist/components/tag.css +90 -72
  375. package/dist/components/tag.d.mts +2 -0
  376. package/dist/components/theme-switcher.css +105 -0
  377. package/dist/components/theme-switcher.d.mts +2 -0
  378. package/dist/components/theme-switcher.mjs +3 -0
  379. package/dist/components/timeline.d.mts +2 -0
  380. package/dist/components/toast.css +115 -97
  381. package/dist/components/toast.d.mts +2 -0
  382. package/dist/components/toolbar.css +47 -43
  383. package/dist/components/toolbar.d.mts +2 -0
  384. package/dist/components/tooltip.css +103 -43
  385. package/dist/components/tooltip.d.mts +2 -0
  386. package/dist/components/tooltip.mjs +1 -0
  387. package/dist/components/tree-select.css +439 -0
  388. package/dist/components/tree-select.d.mts +2 -0
  389. package/dist/components/tree-select.mjs +3 -0
  390. package/dist/components/tree.d.mts +2 -0
  391. package/dist/components/upload.css +138 -97
  392. package/dist/components/upload.d.mts +2 -0
  393. package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
  394. package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
  395. package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
  396. package/dist/fonts/OFL.txt +96 -0
  397. package/dist/fonts/README.md +14 -0
  398. package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
  399. package/dist/index.d.mts +85 -70
  400. package/dist/index.mjs +17330 -5773
  401. package/dist/react.d.mts +91 -0
  402. package/dist/react.mjs +8307 -0
  403. package/dist/registry.json +918 -70
  404. package/dist/tokens/chinese.css +44 -0
  405. package/dist/tokens/colors.css +371 -1222
  406. package/dist/tokens/design.css +209 -0
  407. package/dist/tokens/dtcg.json +15926 -0
  408. package/dist/tokens/figma.variables.json +10779 -0
  409. package/dist/tokens/icon-masks.css +78 -0
  410. package/dist/tokens/pixel.css +53 -0
  411. package/dist/tokens/scrollbars.css +40 -0
  412. package/dist/tokens/soviet.css +44 -0
  413. package/dist/tokens/style-profiles.css +36 -547
  414. package/dist/tokens/themes.json +308 -0
  415. package/dist/tokens/tokens-studio.json +11648 -0
  416. package/dist/tokens/typography.css +21 -18
  417. package/dist/tokens.css +1783 -1806
  418. package/dist/ui.css +14796 -10750
  419. package/dist/vue.d.mts +344 -0
  420. package/dist/vue.mjs +7876 -0
  421. package/docs/spec/ai-input-experience.md +75 -0
  422. package/docs/spec/ai-native.md +238 -147
  423. package/docs/spec/design-philosophy.md +189 -0
  424. package/docs/spec/design-primitives.md +196 -0
  425. package/docs/spec/kb-family.md +147 -115
  426. package/docs/spec/scrollbars.md +46 -0
  427. package/package.json +56 -8
  428. package/dist/retro-effects.css +0 -255
  429. package/dist/tokens/retro-effects.css +0 -255
  430. package/docs/research/2026-10-03-ai-kb-components.md +0 -392
  431. package/docs/research/2026-10-03-kb-permissions.md +0 -992
@@ -1,3 +1,4 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: media(媒体族)
3
4
  *
@@ -5,163 +6,167 @@
5
6
  * 规格源自 opengal data/display.tsx 的 Avatar、data/cartridge-card.tsx 的 hover overlay、
6
7
  * data/exhibit.tsx 的 Carousel 与 Rating。
7
8
  *
8
- * 例外声明(deliberate exception):carousel-thumbs 隐藏滚动条是有意设计
9
- * (缩略图条视觉纯净,滚动仍可用)。违反「组件不写滚动条样式」纪律仅此处,
10
- * 先例参照 scroll-area.css 的尺寸变体。
9
+ * 滚动条沿用全局策略,缩略图容器可使用 data-icen-scrollbars 局部定制。
11
10
  */
12
11
 
13
12
  /* ══════════════ avatar · 头像 ══════════════ */
14
- .avatar {
13
+ .icen-avatar {
15
14
  position: relative;
16
15
  display: inline-flex;
17
16
  align-items: center;
18
17
  justify-content: center;
19
18
  overflow: hidden;
20
- border-radius: var(--radius-full);
21
- background: var(--token-accent-subtle);
22
- color: var(--token-accent);
19
+ border-radius: var(--icen-radius-full);
20
+ /* 首字母是文字:承文本须用 accent-text 档(accent 亮档只做图形,契约见 design.css) */
21
+ background: var(--icen-token-accent-subtle);
22
+ color: var(--icen-token-accent-text);
23
23
  font-weight: 600;
24
24
  width: 36px;
25
25
  height: 36px;
26
- font-size: var(--density-font-size-sm);
26
+ font-size: var(--icen-density-font-size-sm);
27
27
  flex-shrink: 0;
28
28
  user-select: none;
29
29
  }
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 {
30
+ .icen-avatar--xs { width: 20px; height: 20px; font-size: var(--icen-density-font-size-2xs); }
31
+ .icen-avatar--sm { width: 28px; height: 28px; font-size: var(--icen-density-font-size-2xs); }
32
+ .icen-avatar--lg { width: 48px; height: 48px; font-size: var(--icen-density-font-size-md); }
33
+ .icen-avatar--xl { width: 80px; height: 80px; font-size: var(--icen-density-font-size-lg); }
34
+ .icen-avatar img {
35
35
  width: 100%;
36
36
  height: 100%;
37
37
  object-fit: cover;
38
38
  }
39
39
 
40
40
  /* 头像组:多个头像重叠 */
41
- .avatar-group {
41
+ .icen-avatar-group {
42
42
  display: inline-flex;
43
43
  align-items: center;
44
44
  }
45
- .avatar-group .avatar {
46
- border: 2px solid var(--token-bg);
47
- margin-left: -8px;
45
+ .icen-avatar-group .icen-avatar {
46
+ border: 2px solid var(--icen-token-bg);
47
+ margin-inline-start: -8px;
48
48
  }
49
- .avatar-group .avatar:first-child { margin-left: 0; }
49
+ .icen-avatar-group .icen-avatar:first-child { margin-inline-start: 0; }
50
50
 
51
- /* 在线状态点 */
52
- .avatar-status {
51
+ /* 在线状态点(与 .icen-badge 同为物理右下角契约,RTL 不镜像) */
52
+ .icen-avatar-status {
53
53
  position: absolute;
54
54
  bottom: 0;
55
- right: 0;
55
+ right: 0; /* guard:allow-physical 状态点钉在头像物理右下角(同角标契约) */
56
56
  width: 10px;
57
57
  height: 10px;
58
- border: 2px solid var(--token-bg);
59
- border-radius: var(--radius-full);
60
- background: var(--token-text-faint);
58
+ border: 2px solid var(--icen-token-bg);
59
+ border-radius: var(--icen-radius-full);
60
+ background: var(--icen-token-text-faint);
61
61
  }
62
- .avatar-status--online { background: var(--token-success); }
63
- .avatar-status--busy { background: var(--token-error); }
64
- .avatar-status--away { background: var(--token-warning); }
62
+ .icen-avatar-status--online { background: var(--icen-token-success); }
63
+ .icen-avatar-status--busy { background: var(--icen-token-error); }
64
+ .icen-avatar-status--away { background: var(--icen-token-warning); }
65
65
 
66
66
  /* 头像色彩变体(文字头像底色) */
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); }
67
+ .icen-avatar--info { background: color-mix(in srgb, var(--icen-token-info) 15%, transparent); color: var(--icen-token-info); }
68
+ .icen-avatar--success { background: color-mix(in srgb, var(--icen-token-success) 15%, transparent); color: var(--icen-token-success); }
69
+ .icen-avatar--warning { background: color-mix(in srgb, var(--icen-token-warning) 15%, transparent); color: var(--icen-token-warning); }
70
+ .icen-avatar--error { background: color-mix(in srgb, var(--icen-token-error) 15%, transparent); color: var(--icen-token-error); }
71
71
 
72
72
  /* 渐变底头像 */
73
- .avatar--gradient {
74
- background: linear-gradient(135deg, var(--token-accent), var(--token-accent-deep, var(--token-accent)));
75
- color: var(--token-on-accent);
73
+ .icen-avatar--gradient {
74
+ background: linear-gradient(135deg, var(--icen-token-accent), var(--icen-token-accent-deep, var(--icen-token-accent)));
75
+ color: var(--icen-token-on-accent);
76
76
  }
77
77
 
78
78
  /* 方形头像 */
79
- .avatar--square { border-radius: var(--radius-md); }
79
+ .icen-avatar--square { border-radius: var(--icen-radius-md); }
80
80
 
81
81
  /* 头像通知环(红圈外框) */
82
- .avatar--ring {
83
- box-shadow: 0 0 0 2px var(--token-bg), 0 0 0 4px var(--token-error);
82
+ .icen-avatar--ring {
83
+ box-shadow: 0 0 0 2px var(--icen-token-bg), 0 0 0 4px var(--icen-token-error);
84
84
  }
85
85
 
86
86
  /* 头像组溢出计数 */
87
- .avatar-group-count {
87
+ .icen-avatar-group-count {
88
88
  display: inline-flex;
89
89
  align-items: center;
90
90
  justify-content: center;
91
91
  width: 28px;
92
92
  height: 28px;
93
- font-size: var(--density-font-size-2xs);
93
+ font-size: var(--icen-density-font-size-2xs);
94
94
  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;
95
+ color: var(--icen-token-text-muted);
96
+ background: var(--icen-token-fill-2);
97
+ border: 2px solid var(--icen-token-bg);
98
+ border-radius: var(--icen-radius-full);
99
+ margin-inline-start: -8px;
100
100
  }
101
101
 
102
102
  /* ══════════════ media-card · 封面卡 ══════════════ */
103
- .media-card {
103
+ .icen-media-card {
104
104
  position: relative;
105
105
  overflow: hidden;
106
- border-radius: var(--radius-lg);
107
- background: var(--token-bg-soft);
106
+ border-radius: var(--icen-control-radius-lg);
107
+ background: var(--icen-token-surface-raised);
108
108
  transition:
109
109
  transform var(--icen-tx-slow),
110
110
  box-shadow var(--icen-tx-slow);
111
111
  }
112
- .media-card:hover {
113
- transform: translateY(-6px);
114
- box-shadow:
115
- var(--token-shadow-overlay),
116
- 0 0 20px var(--token-accent-glow);
112
+ /* hover 只给接触影,不做位移(媒体内容本身已经在动) */
113
+ @media (hover: hover) and (pointer: fine) {
114
+ .icen-media-card:hover {
115
+ transform: none;
116
+ box-shadow: var(--icen-token-shadow-card);
117
+ }
117
118
  }
118
- .media-card-cover {
119
+ .icen-media-card-cover {
119
120
  display: block;
120
121
  width: 100%;
121
122
  aspect-ratio: 2 / 3;
122
123
  object-fit: cover;
123
124
  }
124
- .media-card-overlay {
125
+ .icen-media-card-overlay {
125
126
  position: absolute;
126
- left: 0; right: 0; bottom: 0;
127
- padding: 32px var(--density-space-sm) var(--density-space-xs);
127
+ inset-inline: 0; bottom: 0;
128
+ padding: 32px var(--icen-density-space-sm) var(--icen-density-space-xs);
128
129
  background: linear-gradient(
129
130
  to top,
130
- color-mix(in srgb, var(--token-text) 72%, transparent),
131
- color-mix(in srgb, var(--token-text) 35%, transparent) 65%,
131
+ color-mix(in srgb, var(--icen-token-text) 72%, transparent),
132
+ color-mix(in srgb, var(--icen-token-text) 35%, transparent) 65%,
132
133
  transparent
133
134
  );
134
135
  backdrop-filter: blur(10px);
135
136
  -webkit-backdrop-filter: blur(10px);
136
- color: var(--token-bg);
137
+ color: var(--icen-token-bg);
137
138
  transform: translateY(100%);
138
139
  transition: transform var(--icen-tx-normal);
139
140
  pointer-events: none;
141
+ /* 下圆角自带:backdrop-filter 在部分 Chromium 不被祖先 overflow+radius 裁切(直角戳出圆角),
142
+ 不赌浏览器行为,overlay 底部两角与卡同弧度 */
143
+ border-end-start-radius: var(--icen-control-radius-lg);
144
+ border-end-end-radius: var(--icen-control-radius-lg);
140
145
  }
141
- .media-card:hover .media-card-overlay {
146
+ .icen-media-card:hover .icen-media-card-overlay {
142
147
  transform: translateY(0);
143
148
  transition-delay: var(--media-overlay-delay, 80ms);
144
149
  }
145
- .media-card-overlay-title {
146
- font-size: var(--density-font-size-md);
150
+ .icen-media-card-overlay-title {
151
+ font-size: var(--icen-font-size-control);
147
152
  font-weight: 600;
148
153
  margin: 0;
149
154
  }
150
- .media-card-overlay-desc {
151
- font-size: var(--density-font-size-xs);
155
+ .icen-media-card-overlay-desc {
156
+ font-size: var(--icen-density-font-size-xs);
152
157
  margin: 2px 0 0;
153
158
  opacity: 0.8;
154
159
  }
155
160
 
156
161
  /* ══════════════ rating · 星级评分 ══════════════ */
157
- .rating {
162
+ .icen-rating {
158
163
  display: inline-flex;
159
164
  align-items: center;
160
165
  gap: 2px;
161
166
  }
162
- .rating-star {
167
+ .icen-rating-star {
163
168
  padding: 2px;
164
- border-radius: var(--radius-xs);
169
+ border-radius: var(--icen-radius-xs);
165
170
  background: none;
166
171
  border: 0;
167
172
  cursor: pointer;
@@ -171,125 +176,133 @@
171
176
  -webkit-tap-highlight-color: transparent;
172
177
  transition: transform var(--icen-tx-fast);
173
178
  }
174
- .rating-star:hover { transform: scale(1.1); }
175
- .rating-star:focus-visible {
179
+ /* 悬停放大反馈仅可悬停设备生效(触屏关闭,避免点按后 scale 粘住) */
180
+ @media (hover: hover) and (pointer: fine) {
181
+ .icen-rating-star:hover { transform: scale(1.1); }
182
+ }
183
+ .icen-rating-star:focus-visible {
176
184
  outline: none;
177
185
  box-shadow: var(--icen-ring);
178
186
  }
179
- .rating-star svg {
187
+ .icen-rating-star svg {
180
188
  width: 18px;
181
189
  height: 18px;
182
190
  display: block;
183
191
  fill: transparent;
184
- stroke: var(--token-line-strong);
192
+ stroke: var(--icen-token-line-strong);
185
193
  stroke-width: 1.6;
186
194
  transition:
187
195
  fill var(--icen-tx-fast),
188
196
  stroke var(--icen-tx-fast);
189
197
  }
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);
198
+ .icen-rating--sm .icen-rating-star svg { width: 14px; height: 14px; }
199
+ .icen-rating--lg .icen-rating-star svg { width: 22px; height: 22px; }
200
+ .icen-rating-star.is-filled svg {
201
+ fill: var(--icen-token-warning);
202
+ stroke: var(--icen-token-warning);
195
203
  }
196
- .rating-star.is-half svg {
197
- fill: color-mix(in srgb, var(--token-warning) 50%, transparent);
198
- stroke: var(--token-warning);
204
+ .icen-rating-star.is-half svg {
205
+ fill: color-mix(in srgb, var(--icen-token-warning) 50%, transparent);
206
+ stroke: var(--icen-token-warning);
199
207
  }
200
- .rating-value {
201
- margin-left: var(--density-space-xs);
202
- font-size: var(--density-font-size-sm);
203
- color: var(--token-text-muted);
208
+ .icen-rating-value {
209
+ margin-inline-start: var(--icen-density-space-xs);
210
+ font-size: var(--icen-density-font-size-sm);
211
+ color: var(--icen-token-text-muted);
204
212
  font-variant-numeric: tabular-nums;
205
213
  }
206
214
 
207
215
  /* 只读模式(不可交互) */
208
- .rating--readonly .rating-star {
216
+ .icen-rating--readonly .icen-rating-star {
209
217
  cursor: default;
210
218
  }
211
- .rating--readonly .rating-star:hover {
219
+ .icen-rating--readonly .icen-rating-star:hover {
212
220
  transform: none;
213
221
  }
214
222
 
215
223
  /* 清除评分钮 */
216
- .rating-clear {
224
+ .icen-rating-clear {
217
225
  display: inline-flex;
218
226
  align-items: center;
219
227
  justify-content: center;
220
228
  width: 20px;
221
229
  height: 20px;
222
- margin-left: 4px;
230
+ margin-inline-start: 4px;
223
231
  padding: 0;
224
232
  border: 0;
225
- border-radius: var(--radius-xs);
233
+ border-radius: var(--icen-radius-xs);
226
234
  background: transparent;
227
- color: var(--token-text-faint);
235
+ color: var(--icen-token-text-faint);
228
236
  cursor: pointer;
229
237
  transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
230
238
  }
231
- .rating-clear:hover {
232
- color: var(--token-text);
233
- background: var(--token-fill-1);
239
+ .icen-rating-clear:hover {
240
+ color: var(--icen-token-text);
241
+ background: var(--icen-token-fill-1);
234
242
  }
235
- .rating-clear svg { width: 12px; height: 12px; }
243
+ .icen-rating-clear svg { width: 12px; height: 12px; }
236
244
 
237
245
  /* 评分数(评价人数) */
238
- .rating-count {
239
- margin-left: var(--density-space-xs);
240
- font-size: var(--density-font-size-xs);
241
- color: var(--token-text-faint);
246
+ .icen-rating-count {
247
+ margin-inline-start: var(--icen-density-space-xs);
248
+ font-size: var(--icen-density-font-size-xs);
249
+ color: var(--icen-token-text-faint);
242
250
  font-variant-numeric: tabular-nums;
243
251
  }
244
252
 
245
253
  /* 评分 + 文字摘要(如「4.5 · 128 条评价」) */
246
- .rating-summary {
254
+ .icen-rating-summary {
247
255
  display: inline-flex;
248
256
  align-items: center;
249
- gap: var(--density-space-xs);
250
- font-size: var(--density-font-size-sm);
251
- color: var(--token-text-muted);
257
+ gap: var(--icen-density-space-xs);
258
+ font-size: var(--icen-density-font-size-sm);
259
+ color: var(--icen-token-text-muted);
252
260
  }
253
261
 
254
262
  /* ══════════════ carousel · 轮播(behaviors/carousel 配套) ══════════════
255
263
  * 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 -->
264
+ * <div class="icen-carousel" data-icen-carousel>
265
+ * <div class="icen-carousel-track"><div class="icen-carousel-slide">…</div>×n</div>
266
+ * <button class="icen-carousel-arrow icen-carousel-arrow--prev" aria-label="上一张">…</button>
267
+ * <button class="icen-carousel-arrow icen-carousel-arrow--next" aria-label="下一张">…</button>
268
+ * <span class="icen-carousel-index" aria-hidden="true"></span> <!-- 可选:behavior 同步「i / n」 -->
269
+ * <div class="icen-carousel-dots"></div> <!-- behavior 自动生成 .icen-carousel-dot -->
261
270
  * </div>
271
+ * behavior 另生成视觉隐藏的 .icen-carousel-status(role=status 通报「第 i / n 张」),
272
+ * slide 自动带 role=group + aria-roledescription + 第 N 张标签;键盘 ←/→ 在 RTL 下镜像。
273
+ * 圆点/箭头是覆盖件:亮玻璃 + 分离环,不依赖主题 accent(accent 色幻灯上同样可辨);
274
+ * 触屏箭头 44px、圆点隐形命中区 44px。
262
275
  */
263
- .carousel {
276
+ .icen-carousel {
264
277
  position: relative;
265
278
  overflow: hidden;
266
- border-radius: var(--radius-lg);
267
- background: var(--token-control);
279
+ border-radius: var(--icen-control-radius-lg);
280
+ background: var(--icen-token-control);
268
281
  }
269
- .carousel-track {
282
+ .icen-carousel-track {
270
283
  display: flex;
271
284
  transition: transform var(--icen-tx-slow);
272
285
  }
273
- .carousel-slide {
286
+ .icen-carousel-slide {
274
287
  width: 100%;
275
288
  flex-shrink: 0;
276
289
  }
277
- .carousel-arrow {
290
+ .icen-carousel-arrow {
278
291
  position: absolute;
279
292
  top: 50%;
280
293
  transform: translateY(-50%);
281
- width: 32px;
282
- 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);
294
+ width: 28px;
295
+ height: 28px;
296
+ border-radius: var(--icen-radius-full);
297
+ background: color-mix(in srgb, var(--icen-token-surface) 88%, transparent);
298
+ border: 1px solid var(--icen-token-material-edge);
299
+ color: var(--icen-token-text);
287
300
  display: flex;
288
301
  align-items: center;
289
302
  justify-content: center;
290
- backdrop-filter: blur(4px);
291
- -webkit-backdrop-filter: blur(4px);
292
- box-shadow: var(--token-shadow-card);
303
+ backdrop-filter: blur(12px) saturate(1.3);
304
+ -webkit-backdrop-filter: blur(12px) saturate(1.3);
305
+ box-shadow: var(--icen-token-shadow-card);
293
306
  cursor: pointer;
294
307
  z-index: 2;
295
308
  transition:
@@ -297,123 +310,142 @@
297
310
  transform var(--icen-tx-fast),
298
311
  opacity var(--icen-tx-fast);
299
312
  }
300
- .carousel-arrow:hover {
301
- background: var(--token-card-strong);
313
+ .icen-carousel-arrow:hover {
314
+ background: var(--icen-token-surface);
302
315
  }
303
- .carousel-arrow:focus-visible {
316
+ .icen-carousel-arrow:focus-visible {
304
317
  outline: none;
305
- box-shadow: var(--icen-ring), var(--token-shadow-card);
318
+ box-shadow: var(--icen-ring), var(--icen-token-shadow-card);
306
319
  }
307
- .carousel-arrow:active {
308
- transform: translateY(-50%) scale(0.95);
320
+ .icen-carousel-arrow:active {
321
+ transform: translateY(-50%) scale(0.96);
309
322
  }
310
- .carousel-arrow:disabled,
311
- .carousel-arrow[aria-disabled='true'] {
323
+ .icen-carousel-arrow:disabled,
324
+ .icen-carousel-arrow[aria-disabled='true'] {
312
325
  opacity: var(--icen-disabled-opacity);
313
326
  cursor: not-allowed;
314
327
  pointer-events: none;
315
328
  }
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); }
329
+ .icen-carousel-arrow svg { width: 16px; height: 16px; }
330
+ .icen-carousel-arrow--prev { inset-inline-start: var(--icen-density-space-sm); }
331
+ .icen-carousel-arrow--next { inset-inline-end: var(--icen-density-space-sm); }
319
332
 
320
- .carousel-dots {
333
+ .icen-carousel-dots {
321
334
  position: absolute;
322
- bottom: var(--density-space-sm);
323
- left: 50%;
335
+ bottom: var(--icen-density-space-sm);
336
+ left: 50%; /* guard:allow-physical 水平居中:left 50% + translateX(-50%) 任意方向下均为容器水平中心 */
324
337
  transform: translateX(-50%);
325
338
  display: flex;
326
339
  gap: 6px;
327
340
  z-index: 2;
328
341
  }
329
- .carousel-dot {
342
+ .icen-carousel-dot {
343
+ position: relative;
330
344
  width: 6px;
331
345
  height: 6px;
332
346
  padding: 0;
333
347
  border: 0;
334
- border-radius: var(--radius-full);
335
- background: color-mix(in srgb, var(--token-card) 70%, transparent);
348
+ border-radius: var(--icen-radius-full);
349
+ /* 覆盖任意媒质:亮玻点 + 细环防亮图隐形;激活为实心长 pill(覆盖件不吃主题 accent) */
350
+ background: color-mix(in srgb, var(--icen-token-card) 58%, transparent);
351
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--icen-token-text) 12%, transparent);
352
+ backdrop-filter: blur(4px);
353
+ -webkit-backdrop-filter: blur(4px);
336
354
  cursor: pointer;
337
355
  transition:
338
356
  width var(--icen-tx-fast),
339
357
  background-color var(--icen-tx-fast);
340
358
  }
341
- .carousel-dot:hover {
342
- background: color-mix(in srgb, var(--token-accent) 70%, transparent);
359
+ /* 触屏命中扩张:视觉 6px 不变,隐形命中区 44px(不影响布局,不参与 hover 命中样式) */
360
+ .icen-carousel-dot::after {
361
+ content: '';
362
+ position: absolute;
363
+ inset: -6px;
343
364
  }
344
- .carousel-dot:focus-visible {
365
+ .icen-carousel-dot:hover {
366
+ background: color-mix(in srgb, var(--icen-token-card) 85%, transparent);
367
+ }
368
+ .icen-carousel-dot:focus-visible {
345
369
  outline: none;
346
- box-shadow: var(--icen-ring);
370
+ box-shadow: var(--icen-ring), 0 0 0 1px color-mix(in srgb, var(--icen-token-text) 12%, transparent);
347
371
  }
348
- .carousel-dot.is-active,
349
- .carousel-dot[aria-current='true'] {
372
+ .icen-carousel-dot.is-active,
373
+ .icen-carousel-dot[aria-current='true'] {
350
374
  width: 20px;
351
- background: var(--token-accent);
375
+ background: var(--icen-token-card-strong);
376
+ box-shadow: var(--icen-token-shadow-card);
377
+ }
378
+ /* 读屏状态行(behavior 生成,视觉隐藏) */
379
+ .icen-carousel-status {
380
+ position: absolute;
381
+ inline-size: 1px;
382
+ block-size: 1px;
383
+ overflow: hidden;
384
+ clip-path: inset(50%);
385
+ white-space: nowrap;
352
386
  }
353
387
 
354
388
  /* 自动播放进度条(behavior 可选) */
355
- .carousel-progress {
389
+ .icen-carousel-progress {
356
390
  position: absolute;
357
391
  bottom: 0;
358
- left: 0;
392
+ left: 0; /* guard:allow-physical 自动播放进度由 behavior 自左向右写 width,动画语义物理 */
359
393
  height: 2px;
360
- background: var(--token-accent);
394
+ background: var(--icen-token-accent);
361
395
  transition: width var(--icen-tx-slow);
362
396
  }
363
397
 
364
- /* 缩略图导航条(deliberate exception:隐藏滚动条是设计意图,见文件头注释) */
365
- .carousel-thumbs {
398
+ /* Thumbnail navigation shares the global scrollbar policy. */
399
+ .icen-carousel-thumbs {
366
400
  display: flex;
367
- gap: var(--density-space-xs);
368
- margin-top: var(--density-space-sm);
369
- padding: var(--density-space-xs);
401
+ gap: var(--icen-density-space-xs);
402
+ margin-top: var(--icen-density-space-sm);
403
+ padding: var(--icen-density-space-xs);
370
404
  overflow-x: auto;
371
- scrollbar-width: none;
372
405
  }
373
- .carousel-thumbs::-webkit-scrollbar { display: none; }
374
- .carousel-thumb {
406
+ .icen-carousel-thumb {
375
407
  flex-shrink: 0;
376
408
  width: 56px;
377
409
  height: 40px;
378
- border-radius: var(--radius-sm);
410
+ border-radius: var(--icen-radius-sm);
379
411
  overflow: hidden;
380
412
  border: 2px solid transparent;
381
413
  cursor: pointer;
382
414
  opacity: 0.6;
383
415
  transition: opacity var(--icen-tx-fast), border-color var(--icen-tx-fast);
384
416
  }
385
- .carousel-thumb:hover { opacity: 1; }
386
- .carousel-thumb.is-active,
387
- .carousel-thumb[aria-current='true'] {
417
+ .icen-carousel-thumb:hover { opacity: 1; }
418
+ .icen-carousel-thumb.is-active,
419
+ .icen-carousel-thumb[aria-current='true'] {
388
420
  opacity: 1;
389
- border-color: var(--token-accent);
421
+ border-color: var(--icen-token-accent);
390
422
  }
391
- .carousel-thumb img,
392
- .carousel-thumb video {
423
+ .icen-carousel-thumb img,
424
+ .icen-carousel-thumb video {
393
425
  width: 100%;
394
426
  height: 100%;
395
427
  object-fit: cover;
396
428
  }
397
429
 
398
430
  /* 轮播索引指示器(1 / 5) */
399
- .carousel-index {
431
+ .icen-carousel-index {
400
432
  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);
433
+ top: var(--icen-density-space-sm);
434
+ inset-inline-end: var(--icen-density-space-sm);
435
+ padding: 2px var(--icen-density-space-sm);
436
+ font-size: var(--icen-density-font-size-xs);
405
437
  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);
438
+ color: var(--icen-token-bg);
439
+ background: color-mix(in srgb, var(--icen-token-text) 60%, transparent);
440
+ border-radius: var(--icen-radius-full);
409
441
  backdrop-filter: blur(4px);
410
442
  -webkit-backdrop-filter: blur(4px);
411
443
  z-index: 2;
412
444
  }
413
445
 
414
446
  /* 渐入动画 */
415
- .carousel-slide {
416
- animation: carousel-slide-fade var(--icen-tx-normal) var(--ease-out);
447
+ .icen-carousel-slide {
448
+ animation: carousel-slide-fade var(--icen-duration-normal) var(--icen-ease-out);
417
449
  }
418
450
  @keyframes carousel-slide-fade {
419
451
  from { opacity: 0.6; }
@@ -421,7 +453,24 @@
421
453
  }
422
454
 
423
455
  @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; }
456
+ .icen-carousel-track { transition: none; }
457
+ .icen-carousel-slide { animation: none; }
458
+ .icen-media-card, .icen-rating-star, .icen-carousel-arrow, .icen-carousel-thumb { transition: none; }
459
+ }
460
+
461
+ @media (pointer: coarse) {
462
+ .icen-carousel-arrow { width: 44px; height: 44px; }
463
+ .icen-carousel-dot::after { inset: -19px; } /* 6px 视觉 → 44px 命中 */
464
+ }
465
+
466
+ @media (forced-colors: active) {
467
+ .icen-carousel-dot { background: Canvas; box-shadow: none; border: 1px solid ButtonText; }
468
+ .icen-carousel-dot.is-active,
469
+ .icen-carousel-dot[aria-current='true'] { background: Highlight; border-color: Highlight; }
470
+ .icen-carousel-arrow { border: 1px solid ButtonText; }
471
+ }
472
+
473
+ /* ── RTL:方向性图标镜像(轮播左右箭头)── */
474
+ :is([dir='rtl']) .icen-carousel-arrow svg { transform: scaleX(-1); }
475
+
427
476
  }