@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,21 +1,26 @@
1
+ /** Theme = palette + dark mode + primitive. 现代、像素、中式、苏式 are independent primitives.
2
+ * data-icen-preset selects color; data-icen-style selects the primitive.
3
+ * Geometry/materials never replace the selected color theme. */
1
4
  interface ThemeState {
2
5
  preset: string;
3
6
  dark: boolean;
4
7
  style: string;
5
8
  }
6
- declare const PRESETS: readonly ["clay", "piano", "art", "vangogh", "ink", "retro"];
7
- declare const STYLES: readonly ["modern", "retro", "terminal"];
9
+ declare const PRESETS: string[];
10
+ declare const PRIMITIVES: readonly ["modern", "chinese", "soviet", "pixel"];
11
+ declare function registerPrimitive(name: string): boolean;
12
+ declare function listPrimitives(): string[];
8
13
  declare const STORAGE_KEY = "icen.ui.theme";
9
14
  /**
10
- * 注册宿主自建预设(宿主先在自家 CSS 写好 `.<name>` 与 `.<name>.dark` 完整 token 面,
11
- * 仿照 colors.css 现有 6 套)。名字须命中 /^[a-z][a-z0-9-]{1,20}$/ 且不与
15
+ * 注册宿主自建预设(宿主先在自家 CSS 写好 `.<name>` 与 `.<name>[data-icen-theme="dark"]` 完整 token 面,
16
+ * 仿照 colors.css 的既有主题)。名字须命中 /^[a-z][a-z0-9-]{1,20}$/ 且不与
12
17
  * dark / style-* 保留字冲突;注册只影响 listThemePresets() 枚举(UI 切换器用),
13
18
  * 不注册的自建预设同样可以 setTheme(校验同样放行)。返回是否接受注册。
14
19
  */
15
20
  declare function registerThemePreset(name: string): boolean;
16
21
  /** 全部可用预设名:内置 6 套 + 已注册的自建预设(UI 切换器枚举用,顺序稳定)。 */
17
22
  declare function listThemePresets(): string[];
18
- /** 默认主题:clay + 跟随系统明暗 + modern。SSR 下返回离线兜底值。 */
23
+ /** 默认主题:现代主题 + 跟随系统明暗 + 现代原语。SSR 下返回离线兜底值。 */
19
24
  declare function getDefaultTheme(): ThemeState;
20
25
  /** 读 localStorage 中的持久化主题;缺失或坏数据回退默认。 */
21
26
  declare function getTheme(): ThemeState;
@@ -23,14 +28,16 @@ declare function getTheme(): ThemeState;
23
28
  declare function applyTheme(t: ThemeState): void;
24
29
  /** 合并当前主题与 patch,应用并持久化,返回新态。patch 中的非法枚举值回退默认。 */
25
30
  declare function setTheme(patch: Partial<ThemeState>): ThemeState;
31
+ /** 当前实际生效的外观;applyTheme 或存储不可写时仍准确。getTheme 专门读取持久化偏好。 */
32
+ declare function getCurrentTheme(): ThemeState;
26
33
  /** 切换明暗,返回新态。 */
27
34
  declare function toggleDark(): ThemeState;
28
- /** 只切风格 profile(modern / retro / terminal;非法值回退 modern),返回新态。 */
29
- declare function setStyle(style: string): ThemeState;
35
+ /** 只切原语(现代 / 中式 / 苏式 / 像素;非法值回退现代),返回新态。 */
36
+ declare function setPrimitive(primitive: string): ThemeState;
30
37
  /** 页面加载早期调用:读持久化主题并应用,防闪烁。
31
38
  * 无持久化偏好时,自动跟随系统的 prefers-color-scheme 变化(实时);
32
39
  * 一旦用户显式 setTheme / toggleDark,跟随停止(持久化优先)。
33
40
  * 重复调用幂等(系统监听不会重复挂)。 */
34
41
  declare function initTheme(): ThemeState;
35
42
 
36
- export { PRESETS, STORAGE_KEY, STYLES, type ThemeState, applyTheme, getDefaultTheme, getTheme, initTheme, listThemePresets, registerThemePreset, setStyle, setTheme, toggleDark };
43
+ export { PRESETS, PRIMITIVES, STORAGE_KEY, type ThemeState, applyTheme, getCurrentTheme, getDefaultTheme, getTheme, initTheme, listPrimitives, listThemePresets, registerPrimitive, registerThemePreset, setPrimitive, setTheme, toggleDark };
@@ -1,3 +1,313 @@
1
+ // src/tokens/themes.json
2
+ var themes_default = [
3
+ {
4
+ id: "modern",
5
+ name: "\u73B0\u4EE3",
6
+ label: "\u73B0\u4EE3",
7
+ summary: "\u74F7\u767D\u4E0E\u51B7\u84DD\uFF0C\u8BA9\u5185\u5BB9\u6E05\u695A\uFF0C\u8BA9\u64CD\u4F5C\u8F7B\u76C8\u3002",
8
+ material: "\u6E05\u900F\u74F7\u9762 \xB7 \u51B7\u8C03\u67D4\u5149",
9
+ light: {
10
+ bg: "#f5f6f8",
11
+ surface: "#ffffff",
12
+ raised: "#edf0f5",
13
+ ink: "#202124",
14
+ muted: "#606773",
15
+ faint: "#626c79",
16
+ accent: "#087bf5",
17
+ accentStrong: "#0062cc",
18
+ accentText: "#0059b8",
19
+ onAccent: "#ffffff",
20
+ cold: "#58758f",
21
+ success: "#247347",
22
+ warning: "#846000",
23
+ error: "#b02d36",
24
+ info: "#336c91",
25
+ shadowColor: "#182337",
26
+ glassOpacity: 84,
27
+ shadowStrength: 10,
28
+ edgeStrength: 11,
29
+ highlightStrength: 76
30
+ },
31
+ dark: {
32
+ bg: "#15171b",
33
+ surface: "#22272f",
34
+ raised: "#2c333e",
35
+ ink: "#f1f4f9",
36
+ muted: "#b1bbca",
37
+ faint: "#9faabd",
38
+ accent: "#8cbdff",
39
+ accentStrong: "#91bfff",
40
+ accentText: "#9dc6ff",
41
+ onAccent: "#10223c",
42
+ cold: "#9bb4cb",
43
+ success: "#8bd3a6",
44
+ warning: "#e4c373",
45
+ error: "#f2a1a5",
46
+ info: "#97c8e8",
47
+ shadowColor: "#000000",
48
+ glassOpacity: 90,
49
+ shadowStrength: 27,
50
+ edgeStrength: 13,
51
+ highlightStrength: 8
52
+ }
53
+ },
54
+ {
55
+ id: "dongyun",
56
+ name: "\u4E1C\u97F5",
57
+ label: "dongyun \u4E1C\u97F5",
58
+ summary: "\u7EE2\u767D\u7559\u51FA\u547C\u5438\uFF0C\u9752\u74F7\u4E0E\u6C89\u58A8\u76F8\u6620\uFF0C\u6E29\u6DA6\u800C\u6709\u5206\u5BF8\u3002",
59
+ material: "\u7EE2\u672C\u4E0E\u9752\u74F7 \xB7 \u6E29\u6DA6\u7EC6\u5149",
60
+ light: {
61
+ bg: "#f4f1e9",
62
+ surface: "#fffdf7",
63
+ raised: "#e9e6db",
64
+ ink: "#293a34",
65
+ muted: "#60695c",
66
+ faint: "#626957",
67
+ accent: "#477668",
68
+ accentStrong: "#305c4e",
69
+ accentText: "#315748",
70
+ onAccent: "#fffdf7",
71
+ cold: "#85724d",
72
+ success: "#3b6544",
73
+ warning: "#795517",
74
+ error: "#a33e37",
75
+ info: "#426477",
76
+ shadowColor: "#343c2e",
77
+ glassOpacity: 97,
78
+ shadowStrength: 7,
79
+ edgeStrength: 14,
80
+ highlightStrength: 40
81
+ },
82
+ dark: {
83
+ bg: "#181e1b",
84
+ surface: "#242e28",
85
+ raised: "#334037",
86
+ ink: "#f0eee0",
87
+ muted: "#bfc8b6",
88
+ faint: "#b2bea9",
89
+ accent: "#a0c5ac",
90
+ accentStrong: "#b0d0b6",
91
+ accentText: "#bdd9c1",
92
+ onAccent: "#24382b",
93
+ cold: "#d0bd8d",
94
+ success: "#accd9e",
95
+ warning: "#e1c68d",
96
+ error: "#edada2",
97
+ info: "#accbda",
98
+ shadowColor: "#080e0a",
99
+ glassOpacity: 98,
100
+ shadowStrength: 25,
101
+ edgeStrength: 17,
102
+ highlightStrength: 5
103
+ }
104
+ },
105
+ {
106
+ id: "jugou",
107
+ name: "\u5DE8\u6784",
108
+ label: "jugou \u5DE8\u6784",
109
+ summary: "\u77F3\u7070\u767D\u3001\u94C1\u7070\u4E0E\u6DF1\u6731\u7EA2\uFF0C\u4EE5\u6E05\u695A\u7684\u7ED3\u6784\u6258\u4F4F\u6709\u5206\u91CF\u7684\u5185\u5BB9\u3002",
110
+ material: "\u6DF7\u51DD\u571F\u4E0E\u642A\u74F7 \xB7 \u5B9E\u4F53\u627F\u91CD",
111
+ light: {
112
+ bg: "#edece6",
113
+ surface: "#faf9f3",
114
+ raised: "#e1e0d8",
115
+ ink: "#252723",
116
+ muted: "#5e625b",
117
+ faint: "#62645b",
118
+ accent: "#b53c2d",
119
+ accentStrong: "#9e3025",
120
+ accentText: "#912e24",
121
+ onAccent: "#fffaf0",
122
+ cold: "#596d75",
123
+ success: "#3d6141",
124
+ warning: "#765413",
125
+ error: "#9a3138",
126
+ info: "#3c6078",
127
+ shadowColor: "#242821",
128
+ glassOpacity: 100,
129
+ shadowStrength: 16,
130
+ edgeStrength: 24,
131
+ highlightStrength: 20
132
+ },
133
+ dark: {
134
+ bg: "#1b1d1c",
135
+ surface: "#2a2e2c",
136
+ raised: "#393e3b",
137
+ ink: "#f4f0e3",
138
+ muted: "#c3c6ba",
139
+ faint: "#b8bdae",
140
+ accent: "#ed9d86",
141
+ accentStrong: "#f1ac92",
142
+ accentText: "#f6bba3",
143
+ onAccent: "#3c211b",
144
+ cold: "#b1c5ce",
145
+ success: "#aecb9f",
146
+ warning: "#e6c88b",
147
+ error: "#f0b1ad",
148
+ info: "#accbdc",
149
+ shadowColor: "#090d0b",
150
+ glassOpacity: 100,
151
+ shadowStrength: 38,
152
+ edgeStrength: 25,
153
+ highlightStrength: 4
154
+ }
155
+ },
156
+ {
157
+ id: "piano",
158
+ name: "\u94A2\u7434",
159
+ label: "piano \u94A2\u7434",
160
+ summary: "\u8C61\u7259\u767D\u4E0E\u4E4C\u6728\u9ED1\u4FDD\u6301\u4E3B\u6B21\uFF0C\u91D1\u68D5\u53EA\u843D\u5728\u5173\u952E\u52A8\u4F5C\u3002",
161
+ material: "\u8C61\u7259\u7434\u952E \xB7 \u4E4C\u6728\u4E0E\u6F06\u9762\u5FAE\u5149",
162
+ light: {
163
+ bg: "#f5f3ed",
164
+ surface: "#fffefb",
165
+ raised: "#ece8df",
166
+ ink: "#252522",
167
+ muted: "#69685f",
168
+ faint: "#6a675c",
169
+ accent: "#94713f",
170
+ accentStrong: "#765424",
171
+ accentText: "#72501f",
172
+ onAccent: "#fffefb",
173
+ cold: "#657386",
174
+ success: "#3d6e4b",
175
+ warning: "#805d17",
176
+ error: "#a53d39",
177
+ info: "#456984",
178
+ shadowColor: "#24231e",
179
+ glassOpacity: 89,
180
+ shadowStrength: 12,
181
+ edgeStrength: 14,
182
+ highlightStrength: 90
183
+ },
184
+ dark: {
185
+ bg: "#131416",
186
+ surface: "#222427",
187
+ raised: "#303338",
188
+ ink: "#f4f1e8",
189
+ muted: "#b8b5aa",
190
+ faint: "#aaa89e",
191
+ accent: "#d2b278",
192
+ accentStrong: "#d8ba85",
193
+ accentText: "#e3c48c",
194
+ onAccent: "#292215",
195
+ cold: "#a5b3c6",
196
+ success: "#a4cfb0",
197
+ warning: "#e2c57f",
198
+ error: "#e9aaa7",
199
+ info: "#a5c5e3",
200
+ shadowColor: "#000000",
201
+ glassOpacity: 93,
202
+ shadowStrength: 33,
203
+ edgeStrength: 17,
204
+ highlightStrength: 11
205
+ }
206
+ },
207
+ {
208
+ id: "monet",
209
+ name: "\u83AB\u5948",
210
+ label: "monet \u83AB\u5948",
211
+ summary: "\u6C34\u9762\u84DD\u7EFF\u53E0\u51FA\u67D4\u5149\uFF0C\u7D2B\u8C03\u542B\u84C4\uFF0C\u5B89\u9759\u800C\u4E0D\u5BE1\u6DE1\u3002",
212
+ material: "\u7761\u83B2\u6C34\u9762 \xB7 \u84DD\u7EFF\u67D4\u5149\u4E0E\u542B\u84C4\u7D2B\u8C03",
213
+ light: {
214
+ bg: "#f4f7f4",
215
+ surface: "#fcfdfb",
216
+ raised: "#e8eeea",
217
+ ink: "#20332e",
218
+ muted: "#5b6f65",
219
+ faint: "#5b6e64",
220
+ accent: "#2b675c",
221
+ accentStrong: "#245c50",
222
+ accentText: "#24574c",
223
+ onAccent: "#ffffff",
224
+ cold: "#667c8a",
225
+ success: "#307449",
226
+ warning: "#805f1b",
227
+ error: "#a43d42",
228
+ info: "#3d6a82",
229
+ shadowColor: "#23372f",
230
+ glassOpacity: 93,
231
+ shadowStrength: 8,
232
+ edgeStrength: 12,
233
+ highlightStrength: 52
234
+ },
235
+ dark: {
236
+ bg: "#121d1a",
237
+ surface: "#1d2d27",
238
+ raised: "#2c3d34",
239
+ ink: "#e6f0e7",
240
+ muted: "#a7c0b1",
241
+ faint: "#9cb1a4",
242
+ accent: "#93c9ad",
243
+ accentStrong: "#a0d2b7",
244
+ accentText: "#a5d8bd",
245
+ onAccent: "#173328",
246
+ cold: "#a1baca",
247
+ success: "#91d2a2",
248
+ warning: "#dac487",
249
+ error: "#e8a7ad",
250
+ info: "#9bc4da",
251
+ shadowColor: "#06100b",
252
+ glassOpacity: 95,
253
+ shadowStrength: 27,
254
+ edgeStrength: 14,
255
+ highlightStrength: 6
256
+ }
257
+ },
258
+ {
259
+ id: "vangogh",
260
+ name: "\u68B5\u9AD8",
261
+ label: "vangogh \u68B5\u9AD8",
262
+ summary: "\u65E5\u95F4\u662F\u9EA6\u7530\u91CC\u7684\u94B4\u84DD\uFF0C\u5165\u591C\u662F\u6DF1\u84DD\u4E0A\u7684\u661F\u5149\u91D1\u3002",
263
+ material: "\u4E9A\u9EBB\u753B\u5E03 \xB7 \u94B4\u84DD\u4E0E\u9EA6\u7A57\u91D1",
264
+ light: {
265
+ bg: "#f8f3e4",
266
+ surface: "#fffdf3",
267
+ raised: "#efe5c9",
268
+ ink: "#253650",
269
+ muted: "#5c6580",
270
+ faint: "#5e667b",
271
+ accent: "#275ea0",
272
+ accentStrong: "#224e83",
273
+ accentText: "#234c7b",
274
+ onAccent: "#fffdf3",
275
+ cold: "#a0711e",
276
+ success: "#416b3a",
277
+ warning: "#855a15",
278
+ error: "#a83c31",
279
+ info: "#356b85",
280
+ shadowColor: "#463d27",
281
+ glassOpacity: 92,
282
+ shadowStrength: 11,
283
+ edgeStrength: 13,
284
+ highlightStrength: 62
285
+ },
286
+ dark: {
287
+ bg: "#111e32",
288
+ surface: "#1c2d46",
289
+ raised: "#2a3f5b",
290
+ ink: "#f8efcf",
291
+ muted: "#c2c4b5",
292
+ faint: "#afb7bd",
293
+ accent: "#e5be54",
294
+ accentStrong: "#ebc568",
295
+ accentText: "#efd181",
296
+ onAccent: "#2b2617",
297
+ cold: "#88a5d6",
298
+ success: "#b3d29b",
299
+ warning: "#f0cd7b",
300
+ error: "#efaaa0",
301
+ info: "#a1c9e8",
302
+ shadowColor: "#050b15",
303
+ glassOpacity: 93,
304
+ shadowStrength: 30,
305
+ edgeStrength: 16,
306
+ highlightStrength: 7
307
+ }
308
+ }
309
+ ];
310
+
1
311
  // src/behaviors/events.ts
2
312
  function emitIcen(source, type, detail) {
3
313
  return source.dispatchEvent(
@@ -5,14 +315,44 @@ function emitIcen(source, type, detail) {
5
315
  );
6
316
  }
7
317
 
318
+ // src/behaviors/design.ts
319
+ var appearanceFrame;
320
+ function prepareDesignChange() {
321
+ if (typeof document === "undefined" || typeof window.requestAnimationFrame !== "function") return;
322
+ const root = document.documentElement;
323
+ root.setAttribute("data-icen-design-changing", "");
324
+ void root.offsetWidth;
325
+ if (appearanceFrame !== void 0) window.cancelAnimationFrame(appearanceFrame);
326
+ appearanceFrame = window.requestAnimationFrame(() => {
327
+ appearanceFrame = window.requestAnimationFrame(() => {
328
+ void root.offsetWidth;
329
+ root.removeAttribute("data-icen-design-changing");
330
+ appearanceFrame = void 0;
331
+ });
332
+ });
333
+ }
334
+
8
335
  // src/behaviors/theme.ts
9
- var PRESETS = ["clay", "piano", "art", "vangogh", "ink", "retro"];
10
- var STYLES = ["modern", "retro", "terminal"];
336
+ var PRESETS = themes_default.map((theme) => theme.id);
337
+ var PRIMITIVES = ["modern", "chinese", "soviet", "pixel"];
338
+ var customPrimitives = /* @__PURE__ */ new Set();
339
+ function registerPrimitive(name) {
340
+ if (!/^[a-z][a-z0-9-]{1,20}$/.test(name)) return false;
341
+ if (PRIMITIVES.includes(name)) return true;
342
+ customPrimitives.add(name);
343
+ return true;
344
+ }
345
+ function listPrimitives() {
346
+ return [...PRIMITIVES, ...customPrimitives];
347
+ }
348
+ function normalizePrimitive(name) {
349
+ return typeof name === "string" && listPrimitives().includes(name) ? name : "modern";
350
+ }
11
351
  var STORAGE_KEY = "icen.ui.theme";
12
352
  var PRESET_NAME_RE = /^[a-z][a-z0-9-]{1,20}$/;
13
- var RESERVED_PRESET_NAMES = /* @__PURE__ */ new Set(["dark", ...STYLES.map((s) => `style-${s}`)]);
353
+ var RESERVED_PRESET_NAMES = /* @__PURE__ */ new Set(["dark"]);
14
354
  var customPresets = /* @__PURE__ */ new Set();
15
- var FALLBACK = { preset: "clay", dark: false, style: "modern" };
355
+ var FALLBACK = { preset: "modern", dark: false, style: "modern" };
16
356
  function isBrowser() {
17
357
  return typeof document !== "undefined";
18
358
  }
@@ -25,14 +365,14 @@ function registerThemePreset(name) {
25
365
  return true;
26
366
  }
27
367
  function listThemePresets() {
28
- return [...PRESETS, ...customPresets];
368
+ return [.../* @__PURE__ */ new Set([...PRESETS, ...customPresets])];
29
369
  }
30
370
  function getDefaultTheme() {
31
371
  if (!isBrowser() || typeof window.matchMedia !== "function") {
32
372
  return { ...FALLBACK };
33
373
  }
34
374
  return {
35
- preset: "clay",
375
+ preset: "modern",
36
376
  dark: window.matchMedia("(prefers-color-scheme: dark)").matches,
37
377
  style: "modern"
38
378
  };
@@ -41,7 +381,7 @@ function isThemeState(v) {
41
381
  if (typeof v !== "object" || v === null) return false;
42
382
  const t = v;
43
383
  return typeof t.preset === "string" && /* 持久化路径与 setTheme 同一开放白名单:自建预设跨刷新存活 */
44
- isValidPreset(t.preset) && typeof t.dark === "boolean" && typeof t.style === "string" && STYLES.includes(t.style);
384
+ isValidPreset(t.preset) && typeof t.dark === "boolean" && typeof t.style === "string";
45
385
  }
46
386
  function getTheme() {
47
387
  if (!isBrowser()) return getDefaultTheme();
@@ -50,7 +390,14 @@ function getTheme() {
50
390
  if (!raw) return getDefaultTheme();
51
391
  const parsed = JSON.parse(raw);
52
392
  if (!isThemeState(parsed)) return getDefaultTheme();
53
- return { preset: parsed.preset, dark: parsed.dark, style: parsed.style };
393
+ const normalized = { preset: parsed.preset, dark: parsed.dark, style: normalizePrimitive(parsed.style) };
394
+ if (normalized.style !== parsed.style || normalized.preset !== parsed.preset) {
395
+ try {
396
+ window.localStorage.setItem(STORAGE_KEY, JSON.stringify(normalized));
397
+ } catch {
398
+ }
399
+ }
400
+ return normalized;
54
401
  } catch {
55
402
  return getDefaultTheme();
56
403
  }
@@ -58,17 +405,14 @@ function getTheme() {
58
405
  var lastApplied = null;
59
406
  function apply(t) {
60
407
  if (!isBrowser()) return;
61
- const cls = document.documentElement.classList;
62
- if (lastApplied && !PRESETS.includes(lastApplied.preset)) {
63
- cls.remove(lastApplied.preset);
64
- }
65
- for (const p of PRESETS) cls.remove(p);
66
- for (const s of STYLES) cls.remove(`style-${s}`);
67
- cls.remove("dark");
68
- cls.add(t.preset);
69
- if (t.dark) cls.add("dark");
70
- cls.add(`style-${t.style}`);
71
- const changed = lastApplied !== null && (lastApplied.preset !== t.preset || lastApplied.dark !== t.dark || lastApplied.style !== t.style);
408
+ prepareDesignChange();
409
+ const root = document.documentElement;
410
+ const hadAppearance = root.hasAttribute("data-icen-style");
411
+ root.setAttribute("data-icen-preset", t.preset);
412
+ if (t.dark) root.setAttribute("data-icen-theme", "dark");
413
+ else root.removeAttribute("data-icen-theme");
414
+ root.setAttribute("data-icen-style", t.style);
415
+ const changed = hadAppearance && lastApplied !== null && (lastApplied.preset !== t.preset || lastApplied.dark !== t.dark || lastApplied.style !== t.style);
72
416
  lastApplied = { ...t };
73
417
  if (changed) {
74
418
  emitIcen(document.documentElement, "icen:theme-change", {
@@ -79,34 +423,63 @@ function apply(t) {
79
423
  }
80
424
  }
81
425
  function applyTheme(t) {
82
- apply(t);
426
+ apply({ ...t, style: normalizePrimitive(t.style) });
83
427
  }
84
428
  function setTheme(patch) {
85
- const merged = { ...getTheme(), ...patch };
429
+ const merged = { ...getCurrentTheme(), ...patch };
86
430
  const next = {
87
431
  preset: isValidPreset(merged.preset) ? merged.preset : FALLBACK.preset,
88
432
  dark: merged.dark === true,
89
- style: STYLES.includes(merged.style) ? merged.style : FALLBACK.style
433
+ style: normalizePrimitive(merged.style)
90
434
  };
91
- apply(next);
92
435
  if (isBrowser()) {
93
436
  try {
94
437
  window.localStorage.setItem(STORAGE_KEY, JSON.stringify(next));
95
438
  } catch {
96
439
  }
97
440
  }
441
+ apply(next);
98
442
  return next;
99
443
  }
444
+ function getCurrentTheme() {
445
+ if (!isBrowser()) return getDefaultTheme();
446
+ const root = document.documentElement;
447
+ const preset = root.getAttribute("data-icen-preset");
448
+ const style = root.getAttribute("data-icen-style");
449
+ if (!preset || !style) return getTheme();
450
+ return { preset, style: normalizePrimitive(style), dark: root.getAttribute("data-icen-theme") === "dark" };
451
+ }
100
452
  function toggleDark() {
101
- return setTheme({ dark: !getTheme().dark });
453
+ return setTheme({ dark: !getCurrentTheme().dark });
102
454
  }
103
- function setStyle(style) {
104
- return setTheme({ style });
455
+ function setPrimitive(primitive) {
456
+ return setTheme({ style: primitive });
105
457
  }
106
458
  var systemListenerAttached = false;
459
+ var storageListenerAttached = false;
107
460
  function initTheme() {
108
- const t = getTheme();
109
- applyTheme(t);
461
+ let t = getTheme();
462
+ if (isBrowser()) {
463
+ const root = document.documentElement;
464
+ if (!hasPersistedPreference() && root.hasAttribute("data-icen-preset") && root.hasAttribute("data-icen-style")) {
465
+ t = {
466
+ preset: root.getAttribute("data-icen-preset") ?? t.preset,
467
+ dark: root.getAttribute("data-icen-theme") === "dark",
468
+ style: root.getAttribute("data-icen-style") ?? t.style
469
+ };
470
+ lastApplied = { ...t };
471
+ } else {
472
+ applyTheme(t);
473
+ }
474
+ } else {
475
+ applyTheme(t);
476
+ }
477
+ if (isBrowser() && !storageListenerAttached) {
478
+ storageListenerAttached = true;
479
+ window.addEventListener("storage", (event) => {
480
+ if (event.key === STORAGE_KEY || event.key === null) applyTheme(getTheme());
481
+ });
482
+ }
110
483
  if (isBrowser() && typeof window.matchMedia === "function" && !systemListenerAttached && !hasPersistedPreference()) {
111
484
  systemListenerAttached = true;
112
485
  let lastDark = t.dark;
@@ -138,15 +511,18 @@ function hasPersistedPreference() {
138
511
  }
139
512
  export {
140
513
  PRESETS,
514
+ PRIMITIVES,
141
515
  STORAGE_KEY,
142
- STYLES,
143
516
  applyTheme,
517
+ getCurrentTheme,
144
518
  getDefaultTheme,
145
519
  getTheme,
146
520
  initTheme,
521
+ listPrimitives,
147
522
  listThemePresets,
523
+ registerPrimitive,
148
524
  registerThemePreset,
149
- setStyle,
525
+ setPrimitive,
150
526
  setTheme,
151
527
  toggleDark
152
528
  };
@@ -1,45 +1,44 @@
1
- type ToastKind = 'ok' | 'err' | 'warn' | 'info' | 'success' | 'error';
1
+ import { FeedbackAction } from './feedback.mjs';
2
+ import { IconName } from './icons.mjs';
3
+
4
+ type ToastKind = 'warn' | 'info' | 'success' | 'error';
2
5
  interface ToastOptions {
3
- /** 保留时长(毫秒),默认 2600;带 action 时默认 6000 */
6
+ /** 保留时长(毫秒),默认 2600;action 默认 6000;0 常驻。焦点/hover/后台/忙碌时暂停。 */
4
7
  ms?: number;
5
8
  /** 配合 action:可撤销 / 重试 / 查看等 */
6
9
  actionLabel?: string;
7
- /** action 触发回调;返回 false 阻止 toast 关闭 */
8
- onAction?: () => void | Promise<void> | boolean;
9
- /** 内联 SVG 字符串图标(消毒后渲染为 .toast-icon);非 <svg> 开头或解析失败静默忽略 */
10
+ /** 等待同步/异步操作;false 保持打开,reject 保留重试反馈。关闭会 abort 传入的 signal。 */
11
+ onAction?: FeedbackAction;
12
+ /** Inline retry feedback on thrown/rejected actions; defaults to localized text. */
13
+ actionError?: string;
14
+ /** 内联 SVG 字符串图标(消毒后渲染为 .icen-toast-icon);非 <svg> 开头或解析失败静默忽略 */
10
15
  icon?: string;
11
- /** 显示右上角关闭按钮(.toast-close,点击即关闭本条),默认 false */
16
+ iconName?: IconName;
17
+ /** 显示右上角关闭按钮(.icen-toast-close,点击即关闭本条),默认 false */
12
18
  closable?: boolean;
13
- /** 显示底部超时进度条(.toast-progress,动画时长 = 本条保留时长),默认 false */
19
+ /** 显示底部超时进度条(.icen-toast-progress,动画时长 = 本条保留时长),默认 false */
14
20
  progress?: boolean;
15
21
  }
16
22
  /** 单条 toast 句柄:dismiss() 立即关闭本条(幂等,可重复调用)。 */
17
23
  interface ToastHandle {
18
24
  dismiss(): void;
25
+ pause(): void;
26
+ resume(): void;
19
27
  }
20
28
  interface ToastConfig {
21
29
  /** 同屏最大堆叠,默认 5;超出从最早的开始移除 */
22
30
  maxStack?: number;
23
31
  }
32
+ type ToastTiming = number | ToastOptions;
24
33
  interface ToastFn {
25
- (message: string, kind?: ToastKind, ms?: number): ToastHandle;
26
- /** success 语义(.toast--success),规范词表入口 */
27
- success(message: string, ms?: number): ToastHandle;
28
- /**
29
- * success 语义(.toast--success)。
30
- * @deprecated 词表统一:改用 toast.success(),本别名下个大版本删除。
31
- */
32
- ok(message: string, ms?: number): ToastHandle;
33
- /** error 语义(.toast--error),规范词表入口 */
34
- error(message: string, ms?: number): ToastHandle;
35
- /**
36
- * error 语义(.toast--error)。
37
- * @deprecated 词表统一:改用 toast.error(),本别名下个大版本删除。
38
- */
39
- err(message: string, ms?: number): ToastHandle;
40
- warn(message: string, ms?: number): ToastHandle;
41
- info(message: string, ms?: number): ToastHandle;
42
- action(message: string, actionLabel: string, onAction: () => void, ms?: number): ToastHandle;
34
+ (message: string, kind?: ToastKind, ms?: ToastTiming): ToastHandle;
35
+ /** success 语义(.icen-toast--success) */
36
+ success(message: string, ms?: ToastTiming): ToastHandle;
37
+ /** error 语义(.icen-toast--error) */
38
+ error(message: string, ms?: ToastTiming): ToastHandle;
39
+ warn(message: string, ms?: ToastTiming): ToastHandle;
40
+ info(message: string, ms?: ToastTiming): ToastHandle;
41
+ action(message: string, actionLabel: string, onAction: FeedbackAction, ms?: ToastTiming): ToastHandle;
43
42
  dismiss(): void;
44
43
  config(opts: ToastConfig): void;
45
44
  }