@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,298 +1,307 @@
1
+ @layer icen.components {
1
2
  /*
2
3
  * @icen.ai/ui — Component: notification(通知栈 v2,与 behaviors/notification 配套)
3
4
  *
4
5
  * 与 toast / alert 的差异(三件正交):
5
- * - toast = 瞬时轻提示(2.6s 自动消失),右下角
6
+ * - toast = 瞬时轻提示(2.6s 自动消失),行内末端下角(LTR 右下 / RTL 镜像左下)
6
7
  * - alert = 内嵌警示条(页面流内,非浮层)
7
- * - notification = 持久通知栈(右上角),工程级:
8
+ * - notification = 持久通知栈(行内末端上角,RTL 镜像左上),工程级:
8
9
  * 进度条 / 倒计时 / 头像 / 多按钮 / 已读未读 / 优先级 / hover 暂停 / 详情链接 / 折叠堆叠
9
10
  *
10
11
  * 完整契约(由 behavior 渲染):
11
- * <div class="notification-container" role="region" aria-label="通知" data-position="top-right">
12
- * <div class="notification [notification--success|warning|error]
12
+ * <div class="icen-notification-container" role="region" aria-label="通知" data-icen-position="top-right">
13
+ * <div class="icen-notification [icen-notification--success|warning|error]
13
14
  * [.is-priority] [.is-unread] [.is-progress] [.is-clickable] [.is-paused]
14
- * [.has-avatar]" role="alert|button">
15
- * <span class="notification-icon">…svg 或 img.notification-avatar…</span>
16
- * <div class="notification-content">
17
- * <p class="notification-title">标题</p>
18
- * <p class="notification-message">正文(支持换行)</p>
19
- * <div class="notification-actions">
20
- * <button class="notification-action [--primary|--danger]">按钮</button>
15
+ * [.icen-has-avatar]" role="alert|button">
16
+ * <span class="icen-notification-icon">…svg 或 img.icen-notification-avatar…</span>
17
+ * <div class="icen-notification-content">
18
+ * <p class="icen-notification-title">标题</p>
19
+ * <p class="icen-notification-message">正文(支持换行)</p>
20
+ * <div class="icen-notification-actions">
21
+ * <button class="icen-notification-action [--primary|--danger]">按钮</button>
21
22
  * </div>
22
- * <div class="notification-link-wrap">
23
- * <a class="notification-link" href="…">查看详情</a>
23
+ * <div class="icen-notification-link-wrap">
24
+ * <a class="icen-notification-link" href="…">查看详情</a>
24
25
  * </div>
25
- * <div class="notification-progress">
26
- * <div class="notification-progress-bar" style="width:64%"></div>
27
- * <span class="notification-progress-label">64%</span>
26
+ * <div class="icen-notification-progress">
27
+ * <div class="icen-notification-progress-bar" style="width:64%"></div>
28
+ * <span class="icen-notification-progress-label">64%</span>
28
29
  * </div>
29
30
  * </div>
30
- * <button class="notification-close" aria-label="关闭">×</button>
31
- * <div class="notification-countdown">
32
- * <div class="notification-countdown-fill" style="animation-duration:5000ms"></div>
31
+ * <button class="icen-notification-close" aria-label="关闭">×</button>
32
+ * <div class="icen-notification-countdown">
33
+ * <div class="icen-notification-countdown-fill" style="animation-duration:5000ms"></div>
33
34
  * </div>
34
35
  * </div>
35
36
  * </div>
36
37
  */
37
38
 
38
- .notification-container {
39
+ .icen-notification-container {
39
40
  position: fixed;
40
- top: var(--density-space-md);
41
- right: var(--density-space-md);
42
- z-index: var(--z-toast);
41
+ top: var(--icen-density-space-md);
42
+ inset-inline-end: var(--icen-density-space-md);
43
+ z-index: var(--icen-z-toast);
43
44
  display: flex;
44
45
  flex-direction: column;
45
- gap: var(--density-space-sm);
46
- width: 360px;
47
- max-width: calc(100vw - var(--density-space-lg));
46
+ gap: var(--icen-density-space-sm);
47
+ inline-size: 360px;
48
+ max-inline-size: calc(100vw - var(--icen-density-space-lg));
48
49
  pointer-events: none;
49
50
  }
50
- .notification-container[data-position='top-left'] {
51
- right: auto;
52
- left: var(--density-space-md);
51
+ .icen-notification-container[data-icen-position='top-left'] {
52
+ right: auto; /* guard:allow-physical 物理角位置变体 top-left */
53
+ left: var(--icen-density-space-md); /* guard:allow-physical 物理角位置变体 top-left */
53
54
  }
54
- .notification-container[data-position='bottom-left'] {
55
+ .icen-notification-container[data-icen-position='bottom-left'] {
55
56
  top: auto;
56
- bottom: var(--density-space-md);
57
- right: auto;
58
- left: var(--density-space-md);
57
+ bottom: var(--icen-density-space-md);
58
+ right: auto; /* guard:allow-physical 物理角位置变体 bottom-left */
59
+ left: var(--icen-density-space-md); /* guard:allow-physical 物理角位置变体 bottom-left */
59
60
  }
60
- .notification-container[data-position='bottom-right'] {
61
+ .icen-notification-container[data-icen-position='bottom-right'] {
61
62
  top: auto;
62
- bottom: var(--density-space-md);
63
+ bottom: var(--icen-density-space-md);
63
64
  }
64
65
 
65
- .notification {
66
+ .icen-notification {
66
67
  pointer-events: auto;
67
68
  position: relative;
68
69
  display: flex;
69
70
  align-items: flex-start;
70
- gap: var(--density-space-sm);
71
- background: var(--token-card-strong);
72
- color: var(--token-text);
73
- border: 1px solid var(--token-outline-soft);
74
- border-left: 3px solid var(--token-info);
75
- border-radius: var(--radius-md);
76
- box-shadow: var(--token-shadow-overlay);
77
- padding: var(--density-space-md) var(--density-space-md) var(--density-space-md) var(--density-space-sm);
71
+ gap: var(--icen-control-gap);
72
+ background: color-mix(in srgb, var(--icen-token-surface) 96%, transparent);
73
+ backdrop-filter: blur(var(--icen-material-blur-chrome)) saturate(var(--icen-material-saturate));
74
+ -webkit-backdrop-filter: blur(var(--icen-material-blur-chrome)) saturate(var(--icen-material-saturate));
75
+ color: var(--icen-token-text);
76
+ border: 1px solid var(--icen-token-material-edge);
77
+ border-inline-start: 2px solid var(--icen-token-info);
78
+ border-radius: var(--icen-radius-lg);
79
+ box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated);
80
+ padding-block: var(--icen-density-space-md);
81
+ padding-inline: 9px 10px;
78
82
  overflow: hidden; /* 倒计时进度条贴底 */
79
- animation: icen-notif-in var(--icen-tx-normal);
83
+ animation: icen-notif-in var(--icen-duration-normal) var(--icen-ease-enter);
80
84
  }
81
- .notification.notification--success { border-left-color: var(--token-success); }
82
- .notification.notification--warning { border-left-color: var(--token-warning); }
83
- .notification.notification--error { border-left-color: var(--token-error); }
84
- /* info 为基类默认配色(基类左侧边即 --token-info),无修饰类 */
85
+ .icen-notification.icen-notification--success { border-inline-start-color: var(--icen-token-success); }
86
+ .icen-notification.icen-notification--warning { border-inline-start-color: var(--icen-token-warning); }
87
+ .icen-notification.icen-notification--error { border-inline-start-color: var(--icen-token-error); }
88
+ /* info 为基类默认配色(基类起始缘边即 --icen-token-info),无修饰类 */
85
89
 
86
- /* ── 优先级:高优先级强调(左侧加粗 + 更强阴影)── */
87
- .notification.is-priority {
88
- border-left-width: 4px;
89
- box-shadow: var(--token-shadow-overlay), 0 0 0 1px color-mix(in srgb, var(--token-accent) 24%, transparent);
90
- }
91
- .notification.is-priority.notification--success { box-shadow: var(--token-shadow-overlay), 0 0 0 1px color-mix(in srgb, var(--token-success) 28%, transparent); }
92
- .notification.is-priority.notification--warning { box-shadow: var(--token-shadow-overlay), 0 0 0 1px color-mix(in srgb, var(--token-warning) 28%, transparent); }
93
- .notification.is-priority.notification--error { box-shadow: var(--token-shadow-overlay), 0 0 0 1px color-mix(in srgb, var(--token-error) 28%, transparent); }
90
+ /* ── 优先级:高优先级强调(起始缘加粗 + 更强阴影)── */
91
+ .icen-notification.is-priority {
92
+ border-inline-start-width: 3px;
93
+ box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated), 0 0 0 1px color-mix(in srgb, var(--icen-token-accent) 24%, transparent);
94
+ }
95
+ .icen-notification.is-priority.icen-notification--success { box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated), 0 0 0 1px color-mix(in srgb, var(--icen-token-success) 28%, transparent); }
96
+ .icen-notification.is-priority.icen-notification--warning { box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated), 0 0 0 1px color-mix(in srgb, var(--icen-token-warning) 28%, transparent); }
97
+ .icen-notification.is-priority.icen-notification--error { box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated), 0 0 0 1px color-mix(in srgb, var(--icen-token-error) 28%, transparent); }
94
98
 
95
- /* ── 未读:标题左侧 4px 强调点 + 加粗 ── */
96
- .notification.is-unread .notification-title::before {
99
+ /* ── 未读:标题起始缘侧 4px 强调点(inline-block 点,margin-inline-end 与文本同向推开) + 加粗 ── */
100
+ .icen-notification.is-unread .icen-notification-title::before {
97
101
  content: '';
98
102
  display: inline-block;
99
103
  width: 6px;
100
104
  height: 6px;
101
- margin-right: 6px;
105
+ margin-inline-end: 6px;
102
106
  margin-bottom: 1px;
103
107
  vertical-align: middle;
104
- border-radius: var(--radius-full);
105
- background: var(--token-accent);
108
+ border-radius: var(--icen-radius-full);
109
+ background: var(--icen-token-accent);
106
110
  flex-shrink: 0;
107
111
  }
108
- .notification.is-unread.notification--success .notification-title::before { background: var(--token-success); }
109
- .notification.is-unread.notification--warning .notification-title::before { background: var(--token-warning); }
110
- .notification.is-unread.notification--error .notification-title::before { background: var(--token-error); }
112
+ .icen-notification.is-unread.icen-notification--success .icen-notification-title::before { background: var(--icen-token-success); }
113
+ .icen-notification.is-unread.icen-notification--warning .icen-notification-title::before { background: var(--icen-token-warning); }
114
+ .icen-notification.is-unread.icen-notification--error .icen-notification-title::before { background: var(--icen-token-error); }
111
115
 
112
116
  /* ── 可点击:整条 hover 抬升 ── */
113
- .notification.is-clickable {
117
+ .icen-notification.is-clickable {
114
118
  cursor: pointer;
115
119
  transition:
116
120
  transform var(--icen-tx-fast),
117
121
  border-color var(--icen-tx-fast),
118
122
  box-shadow var(--icen-tx-fast);
119
123
  }
120
- .notification.is-clickable:hover {
121
- transform: translateY(-1px);
122
- border-color: var(--token-accent);
124
+ /* 整条 hover 抬升仅可悬停设备生效(触屏关闭,AGENTS 动效守卫) */
125
+ @media (hover: hover) and (pointer: fine) {
126
+ .icen-notification.is-clickable:hover {
127
+ transform: none;
128
+ border-color: var(--icen-token-control-border-hover);
129
+ }
123
130
  }
124
131
 
125
132
  /* ── 图标 ── */
126
- .notification-icon {
133
+ .icen-notification-icon {
127
134
  display: inline-flex;
128
135
  align-items: center;
129
136
  justify-content: center;
130
137
  flex-shrink: 0;
131
- width: 22px;
132
- height: 22px;
138
+ width: 20px;
139
+ height: 20px;
133
140
  margin-top: 1px;
134
- border-radius: var(--radius-full);
135
- color: var(--token-text-faint);
141
+ border-radius: var(--icen-radius-full);
142
+ color: var(--icen-token-text-muted);
136
143
  }
137
- .notification-icon svg { width: 16px; height: 16px; }
138
- .notification--success .notification-icon { color: var(--token-success); }
139
- .notification--warning .notification-icon { color: var(--token-warning); }
140
- .notification--error .notification-icon { color: var(--token-error); }
144
+ .icen-notification-icon svg { width: 15px; height: 15px; }
145
+ .icen-notification--success .icen-notification-icon { color: var(--icen-token-success); }
146
+ .icen-notification--warning .icen-notification-icon { color: var(--icen-token-warning); }
147
+ .icen-notification--error .icen-notification-icon { color: var(--icen-token-error); }
141
148
 
142
149
  /* 头像(圆形图) */
143
- .notification-avatar {
150
+ .icen-notification-avatar {
144
151
  width: 28px;
145
152
  height: 28px;
146
- border-radius: var(--radius-full);
153
+ border-radius: var(--icen-radius-full);
147
154
  object-fit: cover;
148
155
  display: block;
149
156
  }
150
- .notification.has-avatar .notification-icon {
157
+ .icen-notification.icen-has-avatar .icen-notification-icon {
151
158
  width: 28px;
152
159
  height: 28px;
153
160
  margin-top: 0;
154
161
  }
155
162
 
156
163
  /* 进度通知的图标默认走品牌色 */
157
- .notification.is-progress:not(.notification--success):not(.notification--warning):not(.notification--error) .notification-icon {
158
- color: var(--token-accent);
164
+ .icen-notification.is-progress:not(.is-complete):not(.icen-notification--success):not(.icen-notification--warning):not(.icen-notification--error) .icen-notification-icon {
165
+ color: var(--icen-token-accent);
159
166
  }
160
167
 
161
168
  /* ── 内容区 ── */
162
- .notification-content {
169
+ .icen-notification-content {
163
170
  flex: 1;
164
171
  min-width: 0;
165
172
  display: flex;
166
173
  flex-direction: column;
167
174
  gap: 2px;
168
175
  }
169
- .notification-title {
176
+ .icen-notification-title {
170
177
  margin: 0;
171
- font-size: var(--density-font-size-md);
178
+ font-size: var(--icen-font-size-control);
172
179
  font-weight: 600;
173
180
  line-height: 1.4;
174
181
  overflow: hidden;
175
182
  text-overflow: ellipsis;
176
183
  }
177
- .notification.is-unread .notification-title {
184
+ .icen-notification.is-unread .icen-notification-title {
178
185
  font-weight: 700;
179
186
  }
180
- .notification-message {
187
+ .icen-notification-message {
181
188
  margin: 0;
182
- font-size: var(--density-font-size-sm);
183
- color: var(--token-text-muted);
189
+ font-size: var(--icen-density-font-size-sm);
190
+ color: var(--icen-token-text-muted);
184
191
  line-height: 1.5;
185
192
  word-break: break-word;
186
193
  }
187
194
 
188
195
  /* ── 多动作按钮 ── */
189
- .notification-actions {
196
+ .icen-notification-actions {
190
197
  display: flex;
191
198
  flex-wrap: wrap;
192
- gap: var(--density-space-xs);
193
- margin-top: var(--density-space-sm);
199
+ gap: var(--icen-density-space-xs);
200
+ margin-top: var(--icen-density-space-sm);
194
201
  }
195
- .notification-action {
202
+ .icen-notification-action {
196
203
  display: inline-flex;
197
204
  align-items: center;
198
205
  height: 24px;
199
- padding: 0 var(--density-space-sm);
200
- border: 1px solid var(--token-outline-soft);
201
- border-radius: var(--radius-sm);
202
- background: var(--token-fill-1);
203
- color: var(--token-text-muted);
206
+ padding: 0 var(--icen-density-space-sm);
207
+ border: 1px solid var(--icen-token-outline-soft);
208
+ border-radius: var(--icen-radius-sm);
209
+ background: var(--icen-token-fill-1);
210
+ /* 操作钮是功能性文字,不吃 muted 弱化(fill-1 上 4.27:1 过不了 AA) */
211
+ color: var(--icen-token-text);
204
212
  font: inherit;
205
- font-size: var(--density-font-size-xs);
213
+ font-size: var(--icen-density-font-size-xs);
206
214
  font-weight: 500;
207
215
  cursor: pointer;
208
216
  -webkit-tap-highlight-color: transparent;
209
217
  transition: background-color var(--icen-tx-fast), color var(--icen-tx-fast), border-color var(--icen-tx-fast);
210
218
  }
211
- .notification-action:hover {
212
- background: var(--token-fill-2);
213
- color: var(--token-text);
214
- border-color: var(--token-accent);
219
+ .icen-notification-action:hover {
220
+ background: var(--icen-token-fill-2);
221
+ color: var(--icen-token-text);
222
+ border-color: var(--icen-token-accent);
215
223
  }
216
- .notification-action:focus-visible {
224
+ .icen-notification-action:focus-visible {
217
225
  outline: none;
218
226
  box-shadow: var(--icen-ring);
219
227
  }
220
228
  /* primary:实底 accent */
221
- .notification-action--primary {
222
- background: var(--token-accent);
223
- color: var(--token-on-accent);
224
- border-color: var(--token-accent);
229
+ .icen-notification-action--primary {
230
+ background: var(--icen-token-accent-strong);
231
+ color: var(--icen-token-on-accent);
232
+ border-color: var(--icen-token-accent-strong);
225
233
  }
226
- .notification-action--primary:hover {
227
- background: var(--token-accent-deep, var(--token-accent));
228
- color: var(--token-on-accent);
229
- border-color: var(--token-accent-deep, var(--token-accent));
234
+ .icen-notification-action--primary:hover {
235
+ background: var(--icen-token-accent-deep, var(--icen-token-accent));
236
+ color: var(--icen-token-on-accent);
237
+ border-color: var(--icen-token-accent-deep, var(--icen-token-accent));
230
238
  }
231
239
  /* danger:实底 error */
232
- .notification-action--danger {
233
- background: var(--token-error);
234
- color: var(--token-on-accent);
235
- border-color: var(--token-error);
240
+ .icen-notification-action--danger {
241
+ background: var(--icen-token-error);
242
+ color: var(--icen-token-on-accent);
243
+ border-color: var(--icen-token-error);
236
244
  }
237
- .notification-action--danger:hover {
245
+ .icen-notification-action--danger:hover {
238
246
  filter: brightness(0.92);
239
- color: var(--token-on-accent);
240
- border-color: var(--token-error);
247
+ color: var(--icen-token-on-accent);
248
+ border-color: var(--icen-token-error);
241
249
  }
242
250
 
243
251
  /* ── 详情链接 ── */
244
- .notification-link-wrap {
245
- margin-top: var(--density-space-xs);
252
+ .icen-notification-link-wrap {
253
+ margin-top: var(--icen-density-space-xs);
246
254
  }
247
- .notification-link {
248
- font-size: var(--density-font-size-sm);
249
- color: var(--token-accent);
255
+ .icen-notification-link {
256
+ font-size: var(--icen-density-font-size-sm);
257
+ /* accent-text 与全站 a 基线(base.css)同源:裸 accent 对浅色卡片 ~3.6:1 低于 AA */
258
+ color: var(--icen-token-accent-text);
250
259
  text-decoration: none;
251
- border-bottom: 1px dashed color-mix(in srgb, var(--token-accent) 40%, transparent);
260
+ border-bottom: 1px dashed color-mix(in srgb, var(--icen-token-accent) 40%, transparent);
252
261
  transition: color var(--icen-tx-fast), border-color var(--icen-tx-fast);
253
262
  }
254
- .notification-link:hover {
255
- color: var(--token-accent-deep, var(--token-accent));
263
+ .icen-notification-link:hover {
264
+ color: var(--icen-token-accent-deep, var(--icen-token-accent));
256
265
  border-bottom-style: solid;
257
266
  }
258
- .notification-link:focus-visible {
267
+ .icen-notification-link:focus-visible {
259
268
  outline: none;
260
- border-radius: var(--radius-xs);
269
+ border-radius: var(--icen-radius-xs);
261
270
  box-shadow: var(--icen-ring);
262
271
  }
263
272
 
264
273
  /* ── 进度条 ── */
265
- .notification-progress {
274
+ .icen-notification-progress {
266
275
  display: flex;
267
276
  align-items: center;
268
- gap: var(--density-space-sm);
269
- margin-top: var(--density-space-sm);
277
+ gap: var(--icen-density-space-sm);
278
+ margin-top: var(--icen-density-space-sm);
270
279
  }
271
- .notification-progress-track {
280
+ .icen-notification-progress-track {
272
281
  flex: 1 1 auto;
273
282
  height: 4px;
274
- background: var(--token-fill-2);
275
- border-radius: var(--radius-full);
283
+ background: var(--icen-token-fill-2);
284
+ border-radius: var(--icen-radius-full);
276
285
  overflow: hidden;
277
286
  }
278
- .notification-progress-bar {
287
+ .icen-notification-progress-bar {
279
288
  height: 100%;
280
- background: var(--token-accent);
281
- border-radius: var(--radius-full);
282
- transition: width var(--icen-tx-normal) var(--ease-out);
283
- }
284
- .notification.notification--success .notification-progress-bar { background: var(--token-success); }
285
- .notification.notification--warning .notification-progress-bar { background: var(--token-warning); }
286
- .notification.notification--error .notification-progress-bar { background: var(--token-error); }
287
- .notification-progress-label {
289
+ background: var(--icen-token-accent);
290
+ border-radius: var(--icen-radius-full);
291
+ transition: width var(--icen-duration-normal) var(--icen-ease-out);
292
+ }
293
+ .icen-notification.icen-notification--success .icen-notification-progress-bar { background: var(--icen-token-success); }
294
+ .icen-notification.icen-notification--warning .icen-notification-progress-bar { background: var(--icen-token-warning); }
295
+ .icen-notification.icen-notification--error .icen-notification-progress-bar { background: var(--icen-token-error); }
296
+ .icen-notification-progress-label {
288
297
  flex: 0 0 auto;
289
- font-size: var(--density-font-size-xs);
290
- color: var(--token-text-muted);
298
+ font-size: var(--icen-density-font-size-xs);
299
+ color: var(--icen-token-text-muted);
291
300
  font-variant-numeric: tabular-nums;
292
301
  }
293
302
 
294
303
  /* ── 关闭按钮 ── */
295
- .notification-close {
304
+ .icen-notification-close {
296
305
  display: inline-flex;
297
306
  align-items: center;
298
307
  justify-content: center;
@@ -301,48 +310,47 @@
301
310
  height: 20px;
302
311
  padding: 0;
303
312
  border: 0;
304
- border-radius: var(--radius-xs);
313
+ border-radius: var(--icen-radius-xs);
305
314
  background: transparent;
306
- color: var(--token-text-faint);
315
+ color: var(--icen-token-text-faint);
307
316
  cursor: pointer;
308
317
  -webkit-tap-highlight-color: transparent;
309
318
  transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
310
319
  }
311
- .notification-close:hover {
312
- color: var(--token-text);
313
- background: var(--token-fill-1);
320
+ .icen-notification-close:hover {
321
+ color: var(--icen-token-text);
322
+ background: var(--icen-token-fill-1);
314
323
  }
315
- .notification-close:focus-visible {
324
+ .icen-notification-close:focus-visible {
316
325
  outline: none;
317
326
  box-shadow: var(--icen-ring);
318
327
  }
319
- .notification-close svg { width: 12px; height: 12px; }
328
+ .icen-notification-close svg { width: 12px; height: 12px; }
320
329
 
321
330
  /* ── 倒计时进度条(底部贴边) ── */
322
- .notification-countdown {
331
+ .icen-notification-countdown {
323
332
  position: absolute;
324
- left: 0;
325
- right: 0;
333
+ inset-inline: 0;
326
334
  bottom: 0;
327
335
  height: 2px;
328
336
  background: transparent;
329
337
  overflow: hidden;
330
338
  }
331
- .notification-countdown-fill {
339
+ .icen-notification-countdown-fill {
332
340
  height: 100%;
333
341
  width: 100%;
334
- transform-origin: left;
335
- background: var(--token-text-faint);
342
+ transform-origin: left; /* guard:allow-physical 倒计时压缩方向是动画语义(LTR 自左向右消减),RTL 下保持同一物理节奏 */
343
+ background: var(--icen-token-text-faint);
336
344
  opacity: 0.35;
337
345
  animation-name: icen-notif-countdown;
338
346
  animation-timing-function: linear;
339
347
  animation-fill-mode: forwards;
340
348
  animation-play-state: running;
341
349
  }
342
- .notification.notification--success .notification-countdown-fill { background: var(--token-success); opacity: 0.6; }
343
- .notification.notification--warning .notification-countdown-fill { background: var(--token-warning); opacity: 0.6; }
344
- .notification.notification--error .notification-countdown-fill { background: var(--token-error); opacity: 0.6; }
345
- .notification.is-paused .notification-countdown-fill {
350
+ .icen-notification.icen-notification--success .icen-notification-countdown-fill { background: var(--icen-token-success); opacity: 0.6; }
351
+ .icen-notification.icen-notification--warning .icen-notification-countdown-fill { background: var(--icen-token-warning); opacity: 0.6; }
352
+ .icen-notification.icen-notification--error .icen-notification-countdown-fill { background: var(--icen-token-error); opacity: 0.6; }
353
+ .icen-notification.is-paused .icen-notification-countdown-fill {
346
354
  animation-play-state: paused;
347
355
  }
348
356
  @keyframes icen-notif-countdown {
@@ -351,12 +359,12 @@
351
359
  }
352
360
 
353
361
  /* ── 暂停态(hover 时) ── */
354
- .notification.is-paused {
355
- box-shadow: var(--token-shadow-overlay), 0 0 0 1px color-mix(in srgb, var(--token-accent) 14%, transparent);
362
+ .icen-notification.is-paused {
363
+ box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated), 0 0 0 1px color-mix(in srgb, var(--icen-token-accent) 14%, transparent);
356
364
  }
357
365
 
358
366
  /* ── 退场动画 ── */
359
- .notification.is-leaving {
367
+ .icen-notification.is-leaving {
360
368
  opacity: 0;
361
369
  transform: translateX(20px);
362
370
  transition:
@@ -370,17 +378,79 @@
370
378
  }
371
379
 
372
380
  @media (max-width: 480px) {
373
- .notification-container {
374
- width: auto;
375
- left: var(--density-space-sm);
376
- right: var(--density-space-sm);
381
+ .icen-notification-container {
382
+ inline-size: auto;
383
+ inset-inline: var(--icen-density-space-sm);
384
+ }
385
+ .icen-notification {
386
+ padding-block: var(--icen-density-space-sm);
387
+ padding-inline: 10px var(--icen-density-space-sm);
377
388
  }
378
- .notification { padding: var(--density-space-sm) var(--density-space-sm) var(--density-space-sm) 10px; }
379
389
  }
380
390
 
381
391
  @media (prefers-reduced-motion: reduce) {
382
- .notification { animation: none; }
383
- .notification.is-leaving { transform: none; }
384
- .notification-countdown-fill { animation: none; transform-origin: left; }
385
- .notification-progress-bar { transition: none; }
392
+ .icen-notification { animation: none; }
393
+ .icen-notification.is-leaving { transform: none; }
394
+ .icen-notification-countdown-fill { animation: none; transform-origin: left; /* guard:allow-physical 倒计时压缩方向是动画语义(LTR 自左向右消减),RTL 下保持同一物理节奏 */ }
395
+ .icen-notification-progress-bar { transition: none; }
396
+ }
397
+
398
+ /* Quiet close shares the same fixed action slot as other interface controls. */
399
+ .icen-notification-close.icen-icon-action { inline-size: var(--icen-density-input-height-sm); block-size: var(--icen-density-input-height-sm); }
400
+ .icen-notification-close.icen-icon-action > svg { inline-size: 14px; block-size: 14px; }
401
+ .icen-notification-close:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 1px; }
402
+ @media (pointer: coarse) { .icen-notification-close.icen-icon-action { min-inline-size: 44px; min-block-size: 44px; } }
403
+
404
+ .icen-notification-action { min-block-size: var(--icen-density-input-height-sm); block-size: auto; }
405
+ @media (pointer: coarse) { .icen-notification-action { min-inline-size: 44px; min-block-size: 44px; } }
406
+
407
+ .icen-notification-busy-symbol { animation: icen-spin calc(var(--icen-duration-normal) * 4) linear infinite; }
408
+ .icen-notification.is-complete:not(.icen-notification--warning):not(.icen-notification--error) .icen-notification-icon { color: var(--icen-token-success); }
409
+ @media (prefers-reduced-motion: reduce) { .icen-notification-busy-symbol { animation: none; } }
410
+
411
+ .icen-notification.is-complete:not(.icen-notification--warning):not(.icen-notification--error) { border-inline-start-color: var(--icen-token-success); }
412
+ .icen-notification.is-complete:not(.icen-notification--warning):not(.icen-notification--error) .icen-notification-progress-bar { background: var(--icen-token-success); }
413
+
414
+ /* The card body is clickable, while its title is a real keyboard action.
415
+ Sibling action/close buttons never live inside a synthetic parent button. */
416
+ .icen-notification-open { display: block; inline-size: 100%; padding: 0; border: 0; border-radius: var(--icen-radius-xs); background: transparent; color: inherit; font: inherit; line-height: inherit; text-align: start; cursor: pointer; }
417
+ .icen-notification-open:hover { color: var(--icen-token-accent); }
418
+ .icen-notification-open:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: -2px; }
419
+ :root[data-icen-style="pixel"] .icen-notification-busy-symbol { animation-timing-function: steps(8,end); }
420
+
421
+ /* Disclosure is a quiet, permanent summary action. Hidden cards leave both the
422
+ layout and tab sequence; each keeps its own callbacks, progress and identity. */
423
+ .icen-notification[hidden] { display: none !important; } /* guard:allow-important native hidden must win the flex card layout */
424
+ .icen-notification.is-group-revealing { animation: icen-pop-in var(--icen-tx-fast); }
425
+ .icen-notification-group-toggle {
426
+ display: inline-flex;
427
+ align-items: center;
428
+ justify-content: space-between;
429
+ align-self: stretch;
430
+ gap: var(--icen-density-space-sm);
431
+ min-block-size: var(--icen-density-input-height-sm);
432
+ margin-block-start: var(--icen-density-space-sm);
433
+ padding-block: var(--icen-density-space-xs);
434
+ padding-inline: var(--icen-density-space-sm);
435
+ border: 1px solid var(--icen-token-outline-soft);
436
+ border-radius: var(--icen-radius-sm);
437
+ background: var(--icen-token-fill-1);
438
+ /* 功能性文字不吃 muted 弱化(fill-1 上 4.27:1 过不了 AA;hover 态本来就是正文色) */
439
+ color: var(--icen-token-text);
440
+ font: inherit;
441
+ font-size: var(--icen-density-font-size-xs);
442
+ text-align: start;
443
+ cursor: pointer;
444
+ transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
445
+ }
446
+ .icen-notification-group-toggle > svg { inline-size: 16px; block-size: 16px; flex: 0 0 16px; transition: transform var(--icen-tx-fast); }
447
+ .icen-notification-group-toggle[aria-expanded="true"] > svg { transform: rotate(180deg); }
448
+ .icen-notification-group-toggle[aria-disabled="true"] { cursor: default; }
449
+ .icen-notification-group-toggle:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 2px; }
450
+ @media (hover: hover) and (pointer: fine) { .icen-notification-group-toggle:not([aria-disabled="true"]):hover { color: var(--icen-token-text); background: var(--icen-token-fill-2); } }
451
+ @media (pointer: coarse) { .icen-notification-group-toggle { min-block-size: 44px; } }
452
+ @media (prefers-reduced-motion: reduce) { .icen-notification-group-toggle, .icen-notification-group-toggle > svg { transition: none; } .icen-notification.is-group-revealing { animation: none; } }
453
+ :root[data-icen-style="pixel"] .icen-notification.is-group-revealing { animation-timing-function: steps(2,end); }
454
+
455
+
386
456
  }
@@ -0,0 +1,2 @@
1
+ // kit: notification 类型面(构建产物,勿手改)
2
+ export * from '../behaviors/notification.mjs';