@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,1249 +1,398 @@
1
- /*
2
- * Icen Design System — 色彩 Tokens
3
- *
4
- * 6 预设 × 2 模式 = 12 套完整配色
5
- * clay(默认)/ piano / art / vangogh / ink / retro
6
- *
7
- * 每套包含:
8
- * 12 base + 2 glow + 6 derived + 6 semantic + 4 fill + 2 shadow + 3 outline
9
- * + depth 层级(canvas/sidebar/panel/card/control)+ scrollbar + bridge 别名
10
- *
11
- * 用法: import "./colors.css"; —— 挂在 <html> 的 preset 类决定 base 取值,
12
- * .dark 类切换明暗,二者正交组合。
13
- */
14
-
15
- /* ══════════════════════════════════════════════════════════════
16
- CLAY — 温暖纸感 · 陶土橙 + 牛皮纸白
17
- Warm Paper · Clay-Dust Orange × Parchment Cream
18
- ══════════════════════════════════════════════════════════════ */
19
-
20
- :root {
21
- /* ── 12 Base Tokens ── */
22
- --token-bg: #faf9f5;
23
- --token-bg-soft: #f5f3ec;
24
- --token-surface: #ffffff;
25
- --token-surface-strong: #f5f3ec;
26
- --token-line-soft: rgba(43, 41, 38, 0.12);
27
- --token-line: rgba(43, 41, 38, 0.22);
28
- --token-line-strong: rgba(43, 41, 38, 0.38);
29
- --token-text: #1f1e1c;
30
- --token-text-muted: #5e5d58;
31
- --token-text-faint: #9d9b93;
32
- --token-accent: #d97757;
33
- --token-accent-cold: #7a9cb0;
34
- --token-accent-deep: #c6613f;
35
-
36
- /* ── Glow (background radial accents) ── */
37
- --token-glow: rgba(217,119,87,.12);
38
- --token-glow-cold: rgba(122,156,176,.06);
39
-
40
- /* ── Derived ── */
41
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 92%, var(--token-accent) 8%);
42
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 14%, transparent);
43
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 10%, transparent);
44
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
45
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
46
- --token-on-accent: #ffffff;
47
-
48
- /* ── Shadow ── */
49
- --token-shadow-elevated: 0 12px 32px rgba(31, 30, 29, 0.05);
50
- --token-shadow-overlay: 0 18px 44px rgba(31, 30, 29, 0.08);
51
-
52
- /* ── Semantic ── */
53
- --token-success: #3d8a5a;
54
- --token-success-muted: color-mix(in srgb, var(--token-success) 12%, transparent);
55
- --token-warning: #b8860b;
56
- --token-warning-muted: rgba(184,134,11,.12);
57
- --token-error: #c0392b;
58
- --token-error-muted: color-mix(in srgb, var(--token-error) 12%, transparent);
59
- --token-info: #6a8ea0;
60
- --token-info-muted: rgba(106,142,160,.12);
61
-
62
- /* ── Fill Scale (overlay textures) ── */
63
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
64
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
65
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
66
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
67
-
68
- /* ── Surface Glass ── */
69
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 88%, transparent);
70
-
71
- /* ═══════════════════════════════════════════
72
- BRIDGE — legacy component token names
73
- ═══════════════════════════════════════════ */
74
-
75
- /* ── 主色 ── */
76
- --accent-clay: var(--token-accent);
77
- --accent-clay-dark: #c6613f;
78
- --accent-clay-light: #e8a087;
79
- --accent-cold: var(--token-accent-cold);
80
-
81
- /* ── 背景 ── */
82
- --bg-primary: var(--token-bg);
83
- --bg-secondary: var(--token-bg-soft);
84
- --bg-tertiary: var(--token-surface);
85
- --bg-card: #fffdfa;
86
- --bg-card-muted: #f7f0e4;
87
- --bg-panel: var(--token-surface-strong);
88
- --bg-hover: var(--token-surface-hover);
89
-
90
- /* ── 文字 ── */
91
- --text-primary: var(--token-text);
92
- --text-secondary: #383834;
93
- --text-tertiary: var(--token-text-muted);
94
- --text-muted: #87867f;
95
- --text-subtle: var(--token-text-faint);
96
-
97
- /* ── 边框 ── */
98
- --border-subtle: var(--token-line-soft);
99
- --border-default: var(--token-line);
100
- --border-strong: var(--token-line-strong);
101
-
102
- /* ── 阴影 ── */
103
- --shadow-sm: var(--token-shadow-elevated);
104
- --shadow-md: var(--token-shadow-overlay);
105
-
106
- /* ── 语义色 ── */
107
- --color-success: var(--token-success);
108
- --color-success-bg: var(--token-success-muted);
109
- --color-warning: var(--token-warning);
110
- --color-warning-bg: var(--token-warning-muted);
111
- --color-error: var(--token-error);
112
- --color-error-bg: var(--token-error-muted);
113
- --color-info: var(--token-info);
114
- --color-info-bg: var(--token-info-muted);
115
- --color-pending: #87867f;
116
- --color-pending-bg: #f9f9f8;
117
-
118
- /* ── 装饰色 ── */
119
- --accent-clay-bg: color-mix(in srgb, var(--token-accent) 8%, transparent);
120
- --accent-clay-bg-strong: var(--token-accent-subtle);
121
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
1
+ @layer icen.tokens {
2
+ /* GENERATED from themes.json by bun run colors. Edit the catalogue, never this file.
3
+ * 6 complete themes × light/dark; 现代 is the default. Primitives are separate. */
4
+
5
+ /* 现代 · 清透瓷面 · 冷调柔光 · light */
6
+ :root, [data-icen-preset="modern"] {
7
+ --icen-design-canvas: #f5f6f8;
8
+ --icen-design-surface: #ffffff;
9
+ --icen-design-raised: #edf0f5;
10
+ --icen-design-ink: #202124;
11
+ --icen-design-muted: #606773;
12
+ --icen-design-faint: #626c79;
13
+ --icen-design-accent: #087bf5;
14
+ --icen-design-accent-strong: #0062cc;
15
+ --icen-design-accent-text: #0059b8;
16
+ --icen-design-on-accent: #ffffff;
17
+ --icen-design-cold: #58758f;
18
+ --icen-design-success: #247347;
19
+ --icen-design-warning: #846000;
20
+ --icen-design-error: #b02d36;
21
+ --icen-design-info: #336c91;
22
+ --icen-design-shadow-color: #182337;
23
+ --icen-design-glass-opacity: 84%;
24
+ --icen-design-shadow-strength: 10%;
25
+ --icen-design-edge-strength: 11%;
26
+ --icen-design-highlight-strength: 76%;
27
+ color-scheme: light;
122
28
  }
123
29
 
124
- /* ── CLAY DARK ── */
125
- .dark {
126
- /* ── 12 Base Tokens ── */
127
- --token-bg: #171410;
128
- --token-bg-soft: #211d19;
129
- --token-surface: #2a2520;
130
- --token-surface-strong: #302b25;
131
- --token-line-soft: #3b352f;
132
- --token-line: #4c433b;
133
- --token-line-strong: #5e5349;
134
- --token-text: #f5f4f0;
135
- --token-text-muted: #a8a6a0;
136
- --token-text-faint: #6a6863;
137
- --token-accent: #e08a68;
138
- --token-accent-cold: #7aa0b8;
139
-
140
- /* ── Glow ── */
141
- --token-glow: rgba(224,138,104,.10);
142
- --token-glow-cold: rgba(122,160,184,.05);
143
-
144
- /* ── Derived ── */
145
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 90%, var(--token-accent) 10%);
146
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
147
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
148
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
149
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
150
- --token-on-accent: #ffffff;
151
-
152
- /* ── Shadow ── */
153
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.18), 0 4px 12px rgba(0,0,0,.16);
154
- --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.22), 0 8px 24px rgba(0,0,0,.26);
155
-
156
- /* ── Semantic ── */
157
- --token-success: #8fbfaa;
158
- --token-success-muted: rgba(143,191,170,.15);
159
- --token-warning: #d4a520;
160
- --token-warning-muted: rgba(212,165,32,.15);
161
- --token-error: #d46a45;
162
- --token-error-muted: rgba(212,106,69,.15);
163
- --token-info: #6a9ab8;
164
- --token-info-muted: rgba(106,154,184,.15);
165
-
166
- /* ── Fill ── */
167
- --token-fill-1: color-mix(in srgb, var(--token-text) 5%, transparent);
168
- --token-fill-2: color-mix(in srgb, var(--token-text) 10%, transparent);
169
- --token-fill-3: color-mix(in srgb, var(--token-text) 16%, transparent);
170
- --token-fill-4: color-mix(in srgb, var(--token-text) 24%, transparent);
171
-
172
- /* ── Surface Glass ── */
173
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
174
-
175
- /* ── BRIDGE ── */
176
- --accent-clay: var(--token-accent);
177
- --accent-clay-dark: #d47a57;
178
- --accent-clay-light: #eba38a;
179
- --accent-cold: var(--token-accent-cold);
180
- --bg-primary: var(--token-bg);
181
- --bg-secondary: var(--token-bg-soft);
182
- --bg-tertiary: var(--token-surface);
183
- --bg-card: #221f1b;
184
- --bg-card-muted: #26221d;
185
- --bg-panel: var(--token-surface-strong);
186
- --bg-hover: var(--token-surface-hover);
187
- --text-primary: var(--token-text);
188
- --text-secondary: #d4d3ce;
189
- --text-tertiary: var(--token-text-muted);
190
- --text-muted: #7a7872;
191
- --text-subtle: var(--token-text-faint);
192
- --border-subtle: var(--token-line-soft);
193
- --border-default: var(--token-line);
194
- --border-strong: var(--token-line-strong);
195
- --shadow-sm: var(--token-shadow-elevated);
196
- --shadow-md: var(--token-shadow-overlay);
197
- --color-success: var(--token-success);
198
- --color-success-bg: var(--token-success-muted);
199
- --color-warning: var(--token-warning);
200
- --color-warning-bg: var(--token-warning-muted);
201
- --color-error: var(--token-error);
202
- --color-error-bg: var(--token-error-muted);
203
- --color-info: var(--token-info);
204
- --color-info-bg: var(--token-info-muted);
205
- --color-pending: #7a7872;
206
- --color-pending-bg: #222120;
207
- --accent-clay-bg: color-mix(in srgb, var(--token-accent) 8%, transparent);
208
- --accent-clay-bg-strong: var(--token-accent-subtle);
209
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
30
+ /* 现代 · 清透瓷面 · 冷调柔光 · dark */
31
+ [data-icen-theme="dark"], [data-icen-preset="modern"][data-icen-theme="dark"] {
32
+ --icen-design-canvas: #15171b;
33
+ --icen-design-surface: #22272f;
34
+ --icen-design-raised: #2c333e;
35
+ --icen-design-ink: #f1f4f9;
36
+ --icen-design-muted: #b1bbca;
37
+ --icen-design-faint: #9faabd;
38
+ --icen-design-accent: #8cbdff;
39
+ --icen-design-accent-strong: #91bfff;
40
+ --icen-design-accent-text: #9dc6ff;
41
+ --icen-design-on-accent: #10223c;
42
+ --icen-design-cold: #9bb4cb;
43
+ --icen-design-success: #8bd3a6;
44
+ --icen-design-warning: #e4c373;
45
+ --icen-design-error: #f2a1a5;
46
+ --icen-design-info: #97c8e8;
47
+ --icen-design-shadow-color: #000000;
48
+ --icen-design-glass-opacity: 90%;
49
+ --icen-design-shadow-strength: 27%;
50
+ --icen-design-edge-strength: 13%;
51
+ --icen-design-highlight-strength: 8%;
52
+ color-scheme: dark;
210
53
  }
211
54
 
212
- /* ══════════════════════════════════════════════════════════════
213
- PIANO — 象牙琴键 · 乌木黑键 · 大漆光泽
214
- Piano Keys · Ivory × Ebony Lacquer · Brass Nameplate
215
- ══════════════════════════════════════════════════════════════ */
216
-
217
- .piano {
218
- /* ── 12 Base Tokens ── */
219
- --token-bg: #f1eee6;
220
- --token-bg-soft: #e5dfd2;
221
- --token-surface: #faf8f2;
222
- --token-surface-strong: #eee8db;
223
- --token-line-soft: #d2cab9;
224
- --token-line: #b8ad9a;
225
- --token-line-strong: #8f8578;
226
- --token-text: #11100e;
227
- --token-text-muted: #4e4b45;
228
- --token-text-faint: #8b857b;
229
- --token-accent: #b89145;
230
- --token-accent-cold: #566370;
231
-
232
- /* ── Glow ── */
233
- --token-glow: rgba(184,145,69,.12);
234
- --token-glow-cold: rgba(22,24,26,.05);
235
-
236
- /* ── Derived ── */
237
- --token-surface-hover: color-mix(in srgb, var(--token-surface-strong) 88%, var(--token-accent) 12%);
238
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 14%, transparent);
239
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 10%, transparent);
240
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
241
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
242
- --token-on-accent: #12100b;
243
-
244
- /* ── Shadow · 漆面冷反光 ── */
245
- --token-shadow-elevated: 0 1px 2px rgba(17,16,14,.06), 0 7px 20px rgba(17,16,14,.08);
246
- --token-shadow-overlay: 0 2px 5px rgba(17,16,14,.10), 0 16px 42px rgba(17,16,14,.16);
247
-
248
- /* ── Semantic ── */
249
- --token-success: #5a9e7a;
250
- --token-success-muted: rgba(90,158,122,.10);
251
- --token-warning: #b89145;
252
- --token-warning-muted: rgba(184,145,69,.12);
253
- --token-error: #a84a42;
254
- --token-error-muted: rgba(168,74,66,.10);
255
- --token-info: #5a7488;
256
- --token-info-muted: rgba(90,116,136,.10);
257
-
258
- /* ── Fill ── */
259
- --token-fill-1: color-mix(in srgb, var(--token-text) 3%, transparent);
260
- --token-fill-2: color-mix(in srgb, var(--token-text) 6%, transparent);
261
- --token-fill-3: color-mix(in srgb, var(--token-text) 10%, transparent);
262
- --token-fill-4: color-mix(in srgb, var(--token-text) 16%, transparent);
263
-
264
- /* ── Surface Glass ── */
265
- --token-surface-glass: color-mix(in srgb, var(--token-surface) 86%, transparent);
266
-
267
- /* ── BRIDGE ── */
268
- --accent-clay: var(--token-accent);
269
- --accent-clay-dark: #967333;
270
- --accent-clay-light: #d2b36f;
271
- --accent-cold: var(--token-accent-cold);
272
- --bg-primary: var(--token-bg);
273
- --bg-secondary: var(--token-bg-soft);
274
- --bg-tertiary: var(--token-surface);
275
- --bg-card: var(--token-surface);
276
- --bg-card-muted: var(--token-bg-soft);
277
- --bg-panel: var(--token-surface-strong);
278
- --bg-hover: var(--token-surface-hover);
279
- --text-primary: var(--token-text);
280
- --text-secondary: #2e2b27;
281
- --text-tertiary: var(--token-text-muted);
282
- --text-muted: #8b857b;
283
- --text-subtle: var(--token-text-faint);
284
- --border-subtle: var(--token-line-soft);
285
- --border-default: var(--token-line);
286
- --border-strong: var(--token-line-strong);
287
- --shadow-sm: var(--token-shadow-elevated);
288
- --shadow-md: var(--token-shadow-overlay);
289
- --color-success: var(--token-success);
290
- --color-success-bg: var(--token-success-muted);
291
- --color-warning: var(--token-warning);
292
- --color-warning-bg: var(--token-warning-muted);
293
- --color-error: var(--token-error);
294
- --color-error-bg: var(--token-error-muted);
295
- --color-info: var(--token-info);
296
- --color-info-bg: var(--token-info-muted);
297
- --color-pending: #8b857b;
298
- --color-pending-bg: var(--token-bg-soft);
299
- --accent-clay-bg: var(--token-accent-subtle);
300
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 20%, transparent);
301
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
55
+ /* 东韵 · 绢本与青瓷 · 温润细光 · light */
56
+ [data-icen-preset="dongyun"] {
57
+ --icen-design-canvas: #f4f1e9;
58
+ --icen-design-surface: #fffdf7;
59
+ --icen-design-raised: #e9e6db;
60
+ --icen-design-ink: #293a34;
61
+ --icen-design-muted: #60695c;
62
+ --icen-design-faint: #626957;
63
+ --icen-design-accent: #477668;
64
+ --icen-design-accent-strong: #305c4e;
65
+ --icen-design-accent-text: #315748;
66
+ --icen-design-on-accent: #fffdf7;
67
+ --icen-design-cold: #85724d;
68
+ --icen-design-success: #3b6544;
69
+ --icen-design-warning: #795517;
70
+ --icen-design-error: #a33e37;
71
+ --icen-design-info: #426477;
72
+ --icen-design-shadow-color: #343c2e;
73
+ --icen-design-glass-opacity: 97%;
74
+ --icen-design-shadow-strength: 7%;
75
+ --icen-design-edge-strength: 14%;
76
+ --icen-design-highlight-strength: 40%;
77
+ color-scheme: light;
302
78
  }
303
79
 
304
- /* ── PIANO DARK ── */
305
- .piano.dark {
306
- /* ── 12 Base Tokens ── */
307
- --token-bg: #090909;
308
- --token-bg-soft: #11100f;
309
- --token-surface: #1a1917;
310
- --token-surface-strong: #24221f;
311
- --token-line-soft: #2f2c27;
312
- --token-line: #463f34;
313
- --token-line-strong: #685b45;
314
- --token-text: #f6f1e7;
315
- --token-text-muted: #b7afa2;
316
- --token-text-faint: #736b60;
317
- --token-accent: #d6b567;
318
- --token-accent-cold: #7c8a94;
319
-
320
- /* ── Glow ── */
321
- --token-glow: rgba(214,181,103,.14);
322
- --token-glow-cold: rgba(210,220,225,.04);
323
-
324
- /* ── Derived ── */
325
- --token-surface-hover: color-mix(in srgb, var(--token-surface-strong) 88%, var(--token-accent) 12%);
326
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
327
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
328
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
329
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 95%, transparent);
330
- --token-on-accent: #0a0a0a;
331
-
332
- /* ── Shadow ── */
333
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.28), 0 10px 26px rgba(0,0,0,.34);
334
- --token-shadow-overlay: 0 2px 5px rgba(0,0,0,.34), 0 18px 46px rgba(0,0,0,.46);
335
-
336
- /* ── Semantic ── */
337
- --token-success: #7ac09a;
338
- --token-success-muted: rgba(122,192,154,.12);
339
- --token-warning: #d6b567;
340
- --token-warning-muted: rgba(214,181,103,.13);
341
- --token-error: #d07668;
342
- --token-error-muted: rgba(208,118,104,.12);
343
- --token-info: #7293aa;
344
- --token-info-muted: rgba(114,147,170,.12);
345
-
346
- /* ── Fill ── */
347
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
348
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
349
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
350
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
351
-
352
- /* ── Surface Glass ── */
353
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
354
-
355
- /* ── BRIDGE ── */
356
- --accent-clay: var(--token-accent);
357
- --accent-clay-dark: #b8954b;
358
- --accent-clay-light: #e7cf8b;
359
- --accent-cold: var(--token-accent-cold);
360
- --bg-primary: var(--token-bg);
361
- --bg-secondary: var(--token-bg-soft);
362
- --bg-tertiary: var(--token-surface);
363
- --bg-card: var(--token-bg-soft);
364
- --bg-card-muted: var(--token-surface);
365
- --bg-panel: var(--token-surface-strong);
366
- --bg-hover: var(--token-surface-hover);
367
- --text-primary: var(--token-text);
368
- --text-secondary: #d8d0c2;
369
- --text-tertiary: var(--token-text-muted);
370
- --text-muted: var(--token-text-faint);
371
- --text-subtle: var(--token-text-faint);
372
- --border-subtle: var(--token-line-soft);
373
- --border-default: var(--token-line);
374
- --border-strong: var(--token-line-strong);
375
- --shadow-sm: var(--token-shadow-elevated);
376
- --shadow-md: var(--token-shadow-overlay);
377
- --color-success: var(--token-success);
378
- --color-success-bg: var(--token-success-muted);
379
- --color-warning: var(--token-warning);
380
- --color-warning-bg: var(--token-warning-muted);
381
- --color-error: var(--token-error);
382
- --color-error-bg: var(--token-error-muted);
383
- --color-info: var(--token-info);
384
- --color-info-bg: var(--token-info-muted);
385
- --color-pending: var(--token-text-faint);
386
- --color-pending-bg: var(--token-bg-soft);
387
- --accent-clay-bg: var(--token-accent-subtle);
388
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 16%, transparent);
389
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
80
+ /* 东韵 · 绢本与青瓷 · 温润细光 · dark */
81
+ [data-icen-preset="dongyun"][data-icen-theme="dark"] {
82
+ --icen-design-canvas: #181e1b;
83
+ --icen-design-surface: #242e28;
84
+ --icen-design-raised: #334037;
85
+ --icen-design-ink: #f0eee0;
86
+ --icen-design-muted: #bfc8b6;
87
+ --icen-design-faint: #b2bea9;
88
+ --icen-design-accent: #a0c5ac;
89
+ --icen-design-accent-strong: #b0d0b6;
90
+ --icen-design-accent-text: #bdd9c1;
91
+ --icen-design-on-accent: #24382b;
92
+ --icen-design-cold: #d0bd8d;
93
+ --icen-design-success: #accd9e;
94
+ --icen-design-warning: #e1c68d;
95
+ --icen-design-error: #edada2;
96
+ --icen-design-info: #accbda;
97
+ --icen-design-shadow-color: #080e0a;
98
+ --icen-design-glass-opacity: 98%;
99
+ --icen-design-shadow-strength: 25%;
100
+ --icen-design-edge-strength: 17%;
101
+ --icen-design-highlight-strength: 5%;
102
+ color-scheme: dark;
390
103
  }
391
104
 
392
- /* ══════════════════════════════════════════════════════════════
393
- ART — 莫奈 · 日出印象 + 睡莲
394
- Monet · Impression, Sunrise × Water Lilies
395
- ══════════════════════════════════════════════════════════════ */
396
-
397
- /* ── ART LIGHT · 日出印象 (Claude Monet, 1872) ── */
398
- .art {
399
- /* 勒阿弗尔晨雾 · 日出橙红 · 港湾青灰 */
400
- --token-bg: #dce8e3;
401
- --token-bg-soft: #ccdcd6;
402
- --token-surface: #edf3ee;
403
- --token-surface-strong: #d8e6df;
404
- --token-line-soft: #b7c9c1;
405
- --token-line: #96aaa2;
406
- --token-line-strong: #718980;
407
- --token-text: #172226;
408
- --token-text-muted: #445553;
409
- --token-text-faint: #768985;
410
- --token-accent: #d66f4f;
411
- --token-accent-cold: #4f8f90;
412
-
413
- /* ── Glow · 雾霭橙光 ── */
414
- --token-glow: rgba(214,111,79,.12);
415
- --token-glow-cold: rgba(79,143,144,.07);
416
-
417
- /* ── Derived ── */
418
- --token-surface-hover: color-mix(in srgb, var(--token-surface-strong) 88%, var(--token-accent) 12%);
419
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
420
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
421
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
422
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
423
- --token-on-accent: #ffffff;
424
-
425
- --token-shadow-elevated: 0 1px 2px rgba(23,34,38,.05), 0 6px 18px rgba(23,34,38,.08);
426
- --token-shadow-overlay: 0 2px 5px rgba(23,34,38,.08), 0 12px 32px rgba(23,34,38,.12);
427
-
428
- --token-success: #5a8c6e;
429
- --token-success-muted: rgba(90,140,110,.10);
430
- --token-warning: #b67933;
431
- --token-warning-muted: rgba(182,121,51,.11);
432
- --token-error: #b95e52;
433
- --token-error-muted: rgba(185,94,82,.11);
434
- --token-info: #568aa0;
435
- --token-info-muted: rgba(86,138,160,.11);
436
-
437
- --token-fill-1: color-mix(in srgb, var(--token-text) 3%, transparent);
438
- --token-fill-2: color-mix(in srgb, var(--token-text) 6%, transparent);
439
- --token-fill-3: color-mix(in srgb, var(--token-text) 10%, transparent);
440
- --token-fill-4: color-mix(in srgb, var(--token-text) 16%, transparent);
441
-
442
- --token-surface-glass: color-mix(in srgb, var(--token-bg) 84%, transparent);
443
-
444
- /* ── BRIDGE ── */
445
- --accent-clay: var(--token-accent);
446
- --accent-clay-dark: #b95a3c;
447
- --accent-clay-light: #e69a82;
448
- --accent-cold: var(--token-accent-cold);
449
- --bg-primary: var(--token-bg);
450
- --bg-secondary: var(--token-bg-soft);
451
- --bg-tertiary: var(--token-surface);
452
- --bg-card: var(--token-surface);
453
- --bg-card-muted: var(--token-bg-soft);
454
- --bg-panel: var(--token-surface-strong);
455
- --bg-hover: var(--token-surface-hover);
456
- --text-primary: var(--token-text);
457
- --text-secondary: var(--token-text-muted);
458
- --text-tertiary: #556864;
459
- --text-muted: var(--token-text-faint);
460
- --text-subtle: var(--token-line-strong);
461
- --border-subtle: var(--token-line-soft);
462
- --border-default: var(--token-line);
463
- --border-strong: var(--token-line-strong);
464
- --shadow-sm: var(--token-shadow-elevated);
465
- --shadow-md: var(--token-shadow-overlay);
466
- --color-success: var(--token-success);
467
- --color-success-bg: var(--token-success-muted);
468
- --color-warning: var(--token-warning);
469
- --color-warning-bg: var(--token-warning-muted);
470
- --color-error: var(--token-error);
471
- --color-error-bg: var(--token-error-muted);
472
- --color-info: var(--token-info);
473
- --color-info-bg: var(--token-info-muted);
474
- --color-pending: var(--token-text-faint);
475
- --color-pending-bg: var(--token-fill-1);
476
- --accent-clay-bg: var(--token-accent-subtle);
477
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
478
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 20%, transparent);
105
+ /* 巨构 · 混凝土与搪瓷 · 实体承重 · light */
106
+ [data-icen-preset="jugou"] {
107
+ --icen-design-canvas: #edece6;
108
+ --icen-design-surface: #faf9f3;
109
+ --icen-design-raised: #e1e0d8;
110
+ --icen-design-ink: #252723;
111
+ --icen-design-muted: #5e625b;
112
+ --icen-design-faint: #62645b;
113
+ --icen-design-accent: #b53c2d;
114
+ --icen-design-accent-strong: #9e3025;
115
+ --icen-design-accent-text: #912e24;
116
+ --icen-design-on-accent: #fffaf0;
117
+ --icen-design-cold: #596d75;
118
+ --icen-design-success: #3d6141;
119
+ --icen-design-warning: #765413;
120
+ --icen-design-error: #9a3138;
121
+ --icen-design-info: #3c6078;
122
+ --icen-design-shadow-color: #242821;
123
+ --icen-design-glass-opacity: 100%;
124
+ --icen-design-shadow-strength: 16%;
125
+ --icen-design-edge-strength: 24%;
126
+ --icen-design-highlight-strength: 20%;
127
+ color-scheme: light;
479
128
  }
480
129
 
481
- /* ── ART DARK · 莫奈睡莲 (Water Lilies) ── */
482
- .art.dark {
483
- /* 睡莲池水 · 暮色蓝绿 · 莲粉紫影 */
484
- --token-bg: #172521;
485
- --token-bg-soft: #1d312c;
486
- --token-surface: #263d37;
487
- --token-surface-strong: #304a42;
488
- --token-line-soft: #35554c;
489
- --token-line: #4c7167;
490
- --token-line-strong: #659082;
491
- --token-text: #edf1e8;
492
- --token-text-muted: #c1cabd;
493
- --token-text-faint: #7f9188;
494
- --token-accent: #d59ab1;
495
- --token-accent-cold: #78aaa2;
496
-
497
- /* ── Glow · 池面粉紫和水光 ── */
498
- --token-glow: rgba(213,154,177,.10);
499
- --token-glow-cold: rgba(120,170,162,.10);
500
-
501
- /* ── Derived ── */
502
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 86%, var(--token-accent-cold) 14%);
503
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
504
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
505
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
506
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
507
- /* 睡莲粉 accent 上的文字色:深绿灰(白字在 #d59ab1 上对比度不达标) */
508
- --token-on-accent: #26302b;
509
-
510
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.18), 0 8px 22px rgba(0,0,0,.24);
511
- --token-shadow-overlay: 0 2px 5px rgba(0,0,0,.24), 0 14px 36px rgba(0,0,0,.32);
512
-
513
- --token-success: #5ab88a;
514
- --token-success-muted: rgba(90,184,138,.12);
515
- --token-warning: #c5aa68;
516
- --token-warning-muted: rgba(197,170,104,.12);
517
- --token-error: #d1847e;
518
- --token-error-muted: rgba(209,132,126,.12);
519
- --token-info: #78aaa2;
520
- --token-info-muted: rgba(120,170,162,.12);
521
-
522
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
523
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
524
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
525
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
526
-
527
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
528
-
529
- /* ── BRIDGE ── */
530
- --accent-clay: var(--token-accent);
531
- --accent-clay-dark: #bc7f9a;
532
- --accent-clay-light: #e4b7ca;
533
- --accent-cold: var(--token-accent-cold);
534
- --bg-primary: var(--token-bg);
535
- --bg-secondary: var(--token-bg-soft);
536
- --bg-tertiary: var(--token-surface);
537
- --bg-card: var(--token-bg-soft);
538
- --bg-card-muted: var(--token-surface);
539
- --bg-panel: var(--token-surface-strong);
540
- --bg-hover: var(--token-surface-hover);
541
- --text-primary: var(--token-text);
542
- --text-secondary: var(--token-text-muted);
543
- --text-tertiary: #a5b1aa;
544
- --text-muted: var(--token-text-faint);
545
- --text-subtle: var(--token-line-strong);
546
- --border-subtle: var(--token-line-soft);
547
- --border-default: var(--token-line);
548
- --border-strong: var(--token-line-strong);
549
- --shadow-sm: var(--token-shadow-elevated);
550
- --shadow-md: var(--token-shadow-overlay);
551
- --color-success: var(--token-success);
552
- --color-success-bg: var(--token-success-muted);
553
- --color-warning: var(--token-warning);
554
- --color-warning-bg: var(--token-warning-muted);
555
- --color-error: var(--token-error);
556
- --color-error-bg: var(--token-error-muted);
557
- --color-info: var(--token-info);
558
- --color-info-bg: var(--token-info-muted);
559
- --color-pending: var(--token-text-faint);
560
- --color-pending-bg: var(--token-fill-1);
561
- --accent-clay-bg: var(--token-accent-subtle);
562
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
563
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
130
+ /* 巨构 · 混凝土与搪瓷 · 实体承重 · dark */
131
+ [data-icen-preset="jugou"][data-icen-theme="dark"] {
132
+ --icen-design-canvas: #1b1d1c;
133
+ --icen-design-surface: #2a2e2c;
134
+ --icen-design-raised: #393e3b;
135
+ --icen-design-ink: #f4f0e3;
136
+ --icen-design-muted: #c3c6ba;
137
+ --icen-design-faint: #b8bdae;
138
+ --icen-design-accent: #ed9d86;
139
+ --icen-design-accent-strong: #f1ac92;
140
+ --icen-design-accent-text: #f6bba3;
141
+ --icen-design-on-accent: #3c211b;
142
+ --icen-design-cold: #b1c5ce;
143
+ --icen-design-success: #aecb9f;
144
+ --icen-design-warning: #e6c88b;
145
+ --icen-design-error: #f0b1ad;
146
+ --icen-design-info: #accbdc;
147
+ --icen-design-shadow-color: #090d0b;
148
+ --icen-design-glass-opacity: 100%;
149
+ --icen-design-shadow-strength: 38%;
150
+ --icen-design-edge-strength: 25%;
151
+ --icen-design-highlight-strength: 4%;
152
+ color-scheme: dark;
564
153
  }
565
154
 
566
- /* ══════════════════════════════════════════════════════════════
567
- VANGOGH — 麦田鸦群 + 星空
568
- Van Gogh · Wheatfield × Starry Night
569
- ══════════════════════════════════════════════════════════════ */
570
-
571
- /* ── VANGOGH LIGHT · 麦田鸦群 ── */
572
- .vangogh {
573
- /* 干麦秆画布 · 麦浪金 · 普鲁士蓝阴影 */
574
- --token-bg: #e8ddb2;
575
- --token-bg-soft: #d5c58f;
576
- --token-surface: #f2e8bd;
577
- --token-surface-strong: #decb85;
578
- --token-line-soft: #c0ad6e;
579
- --token-line: #9f8b53;
580
- --token-line-strong: #70623f;
581
- --token-text: #1f241b;
582
- --token-text-muted: #4a5138;
583
- --token-text-faint: #767b57;
584
- --token-accent: #1f527c;
585
- --token-accent-cold: #476f45;
586
-
587
- --token-glow: rgba(31,82,124,.09);
588
- --token-glow-cold: rgba(71,111,69,.07);
589
-
590
- --token-surface-hover: color-mix(in srgb, var(--token-surface-strong) 90%, var(--token-accent) 10%);
591
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 10%, transparent);
592
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 7%, transparent);
593
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
594
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
595
- --token-on-accent: #fff3c5;
596
-
597
- --token-shadow-elevated: 0 1px 2px rgba(31,36,27,.06), 0 7px 20px rgba(31,36,27,.10);
598
- --token-shadow-overlay: 0 2px 5px rgba(31,36,27,.09), 0 16px 40px rgba(31,36,27,.15);
599
-
600
- --token-success: #3f7d50;
601
- --token-success-muted: rgba(63,125,80,.12);
602
- --token-warning: #a97824;
603
- --token-warning-muted: rgba(169,120,36,.12);
604
- --token-error: #9c513a;
605
- --token-error-muted: rgba(156,81,58,.11);
606
- --token-info: #2d638e;
607
- --token-info-muted: rgba(45,99,142,.11);
608
-
609
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
610
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
611
- --token-fill-3: color-mix(in srgb, var(--token-text) 13%, transparent);
612
- --token-fill-4: color-mix(in srgb, var(--token-text) 20%, transparent);
613
-
614
- --token-surface-glass: color-mix(in srgb, var(--token-surface) 82%, transparent);
615
-
616
- /* ── BRIDGE ── */
617
- --accent-clay: var(--token-accent);
618
- --accent-clay-dark: #173f64;
619
- --accent-clay-light: #5b82a6;
620
- --accent-cold: var(--token-accent-cold);
621
- --bg-primary: var(--token-bg);
622
- --bg-secondary: var(--token-bg-soft);
623
- --bg-tertiary: var(--token-surface);
624
- --bg-card: var(--token-surface);
625
- --bg-card-muted: var(--token-bg-soft);
626
- --bg-panel: var(--token-surface-strong);
627
- --bg-hover: var(--token-surface-hover);
628
- --text-primary: var(--token-text);
629
- --text-secondary: var(--token-text-muted);
630
- --text-tertiary: #606847;
631
- --text-muted: var(--token-text-faint);
632
- --text-subtle: var(--token-line-strong);
633
- --border-subtle: var(--token-line-soft);
634
- --border-default: var(--token-line);
635
- --border-strong: var(--token-line-strong);
636
- --shadow-sm: var(--token-shadow-elevated);
637
- --shadow-md: var(--token-shadow-overlay);
638
- --color-success: var(--token-success);
639
- --color-success-bg: var(--token-success-muted);
640
- --color-warning: var(--token-warning);
641
- --color-warning-bg: var(--token-warning-muted);
642
- --color-error: var(--token-error);
643
- --color-error-bg: var(--token-error-muted);
644
- --color-info: var(--token-info);
645
- --color-info-bg: var(--token-info-muted);
646
- --color-pending: var(--token-text-faint);
647
- --color-pending-bg: var(--token-fill-1);
648
- --accent-clay-bg: var(--token-accent-subtle);
649
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 16%, transparent);
650
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
155
+ /* 钢琴 · 象牙琴键 · 乌木与漆面微光 · light */
156
+ [data-icen-preset="piano"] {
157
+ --icen-design-canvas: #f5f3ed;
158
+ --icen-design-surface: #fffefb;
159
+ --icen-design-raised: #ece8df;
160
+ --icen-design-ink: #252522;
161
+ --icen-design-muted: #69685f;
162
+ --icen-design-faint: #6a675c;
163
+ --icen-design-accent: #94713f;
164
+ --icen-design-accent-strong: #765424;
165
+ --icen-design-accent-text: #72501f;
166
+ --icen-design-on-accent: #fffefb;
167
+ --icen-design-cold: #657386;
168
+ --icen-design-success: #3d6e4b;
169
+ --icen-design-warning: #805d17;
170
+ --icen-design-error: #a53d39;
171
+ --icen-design-info: #456984;
172
+ --icen-design-shadow-color: #24231e;
173
+ --icen-design-glass-opacity: 89%;
174
+ --icen-design-shadow-strength: 12%;
175
+ --icen-design-edge-strength: 14%;
176
+ --icen-design-highlight-strength: 90%;
177
+ color-scheme: light;
651
178
  }
652
179
 
653
- /* ── VANGOGH DARK · 星空 ── */
654
- .vangogh.dark {
655
- /* 钴蓝夜空 · 漩涡青蓝 · 星点暖黄 */
656
- --token-bg: #0f1b2e;
657
- --token-bg-soft: #142440;
658
- --token-surface: #1a3050;
659
- --token-surface-strong: #223a60;
660
- --token-line-soft: #1c3455;
661
- --token-line: #2a4a75;
662
- --token-line-strong: #3a5a8a;
663
- --token-text: #f0ece0;
664
- --token-text-muted: #c0bcb0;
665
- --token-text-faint: #77728b;
666
- --token-accent: #e8c840;
667
- --token-accent-cold: #4a98b8;
668
-
669
- --token-glow: rgba(232,200,64,.12);
670
- --token-glow-cold: rgba(74,152,184,.08);
671
-
672
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 88%, var(--token-accent) 12%);
673
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 10%, transparent);
674
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 6%, transparent);
675
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
676
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
677
- --token-on-accent: #101824;
678
-
679
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.14), 0 4px 12px rgba(0,0,0,.20);
680
- --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.18), 0 8px 24px rgba(0,0,0,.28);
681
-
682
- --token-success: #5ab88a;
683
- --token-success-muted: rgba(90,184,138,.12);
684
- --token-warning: #d4a028;
685
- --token-warning-muted: rgba(212,160,40,.12);
686
- --token-error: #d06060;
687
- --token-error-muted: rgba(208,96,96,.12);
688
- --token-info: #6090c0;
689
- --token-info-muted: rgba(96,144,192,.12);
690
-
691
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
692
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
693
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
694
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
695
-
696
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
697
-
698
- /* ── BRIDGE ── */
699
- --accent-clay: var(--token-accent);
700
- --accent-clay-dark: #c8a830;
701
- --accent-clay-light: #f0e070;
702
- --accent-cold: var(--token-accent-cold);
703
- --bg-primary: var(--token-bg);
704
- --bg-secondary: var(--token-bg-soft);
705
- --bg-tertiary: var(--token-surface);
706
- --bg-card: var(--token-bg-soft);
707
- --bg-card-muted: var(--token-surface);
708
- --bg-panel: var(--token-surface-strong);
709
- --bg-hover: var(--token-surface-hover);
710
- --text-primary: var(--token-text);
711
- --text-secondary: var(--token-text-muted);
712
- --text-tertiary: #a0a098;
713
- --text-muted: var(--token-text-faint);
714
- --text-subtle: var(--token-line-strong);
715
- --border-subtle: var(--token-line-soft);
716
- --border-default: var(--token-line);
717
- --border-strong: var(--token-line-strong);
718
- --shadow-sm: var(--token-shadow-elevated);
719
- --shadow-md: var(--token-shadow-overlay);
720
- --color-success: var(--token-success);
721
- --color-success-bg: var(--token-success-muted);
722
- --color-warning: var(--token-warning);
723
- --color-warning-bg: var(--token-warning-muted);
724
- --color-error: var(--token-error);
725
- --color-error-bg: var(--token-error-muted);
726
- --color-info: var(--token-info);
727
- --color-info-bg: var(--token-info-muted);
728
- --color-pending: var(--token-text-faint);
729
- --color-pending-bg: var(--token-fill-1);
730
- --accent-clay-bg: var(--token-accent-subtle);
731
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
732
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
180
+ /* 钢琴 · 象牙琴键 · 乌木与漆面微光 · dark */
181
+ [data-icen-preset="piano"][data-icen-theme="dark"] {
182
+ --icen-design-canvas: #131416;
183
+ --icen-design-surface: #222427;
184
+ --icen-design-raised: #303338;
185
+ --icen-design-ink: #f4f1e8;
186
+ --icen-design-muted: #b8b5aa;
187
+ --icen-design-faint: #aaa89e;
188
+ --icen-design-accent: #d2b278;
189
+ --icen-design-accent-strong: #d8ba85;
190
+ --icen-design-accent-text: #e3c48c;
191
+ --icen-design-on-accent: #292215;
192
+ --icen-design-cold: #a5b3c6;
193
+ --icen-design-success: #a4cfb0;
194
+ --icen-design-warning: #e2c57f;
195
+ --icen-design-error: #e9aaa7;
196
+ --icen-design-info: #a5c5e3;
197
+ --icen-design-shadow-color: #000000;
198
+ --icen-design-glass-opacity: 93%;
199
+ --icen-design-shadow-strength: 33%;
200
+ --icen-design-edge-strength: 17%;
201
+ --icen-design-highlight-strength: 11%;
202
+ color-scheme: dark;
733
203
  }
734
204
 
735
- /* ══════════════════════════════════════════════════════════════
736
- INK — 水墨纸砚 · 松烟翠
737
- Sumi Ink · Rice Paper × Pine-Soot Green
738
- ══════════════════════════════════════════════════════════════ */
739
-
740
- /* ── INK LIGHT · 宣纸水墨 ── */
741
- .ink {
742
- /* 宣纸白底 · 墨灰 · 松烟绿 accent */
743
- --token-bg: #F5F2ED;
744
- --token-bg-soft: #EDE9E2;
745
- --token-surface: #E8E4DC;
746
- --token-surface-strong: #E0DBD2;
747
- --token-line-soft: #D4CFC6;
748
- --token-line: #B8B2A8;
749
- --token-line-strong: #969088;
750
- --token-text: #1A1816;
751
- --token-text-muted: #5C5854;
752
- --token-text-faint: #969088;
753
- --token-accent: #5B7A5E;
754
- --token-accent-cold: #6B7E8A;
755
-
756
- --token-glow: rgba(91,122,94,.08);
757
- --token-glow-cold: rgba(107,126,138,.04);
758
-
759
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 94%, var(--token-accent) 6%);
760
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 10%, transparent);
761
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 6%, transparent);
762
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
763
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
764
- --token-on-accent: #ffffff;
765
-
766
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.04), 0 4px 14px rgba(0,0,0,.06);
767
- --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.06), 0 10px 28px rgba(0,0,0,.08);
768
-
769
- --token-success: #5A8E6A;
770
- --token-success-muted: rgba(90,142,106,.10);
771
- --token-warning: #9A7A3A;
772
- --token-warning-muted: rgba(154,122,58,.10);
773
- --token-error: #A05048;
774
- --token-error-muted: rgba(160,80,72,.10);
775
- --token-info: #5A7890;
776
- --token-info-muted: rgba(90,120,144,.10);
777
-
778
- --token-fill-1: color-mix(in srgb, var(--token-text) 3%, transparent);
779
- --token-fill-2: color-mix(in srgb, var(--token-text) 6%, transparent);
780
- --token-fill-3: color-mix(in srgb, var(--token-text) 10%, transparent);
781
- --token-fill-4: color-mix(in srgb, var(--token-text) 16%, transparent);
782
-
783
- --token-surface-glass: color-mix(in srgb, var(--token-bg) 86%, transparent);
784
-
785
- /* ── BRIDGE ── */
786
- --accent-clay: var(--token-accent);
787
- --accent-clay-dark: #4A6A4E;
788
- --accent-clay-light: #8AA88E;
789
- --accent-cold: var(--token-accent-cold);
790
- --bg-primary: var(--token-bg);
791
- --bg-secondary: var(--token-bg-soft);
792
- --bg-tertiary: var(--token-surface);
793
- --bg-card: #FCFAF7;
794
- --bg-card-muted: var(--token-bg-soft);
795
- --bg-panel: var(--token-surface-strong);
796
- --bg-hover: var(--token-surface-hover);
797
- --text-primary: var(--token-text);
798
- --text-secondary: var(--token-text-muted);
799
- --text-tertiary: #7A7672;
800
- --text-muted: var(--token-text-faint);
801
- --text-subtle: var(--token-line-strong);
802
- --border-subtle: var(--token-line-soft);
803
- --border-default: var(--token-line);
804
- --border-strong: var(--token-line-strong);
805
- --shadow-sm: var(--token-shadow-elevated);
806
- --shadow-md: var(--token-shadow-overlay);
807
- --color-success: var(--token-success);
808
- --color-success-bg: var(--token-success-muted);
809
- --color-warning: var(--token-warning);
810
- --color-warning-bg: var(--token-warning-muted);
811
- --color-error: var(--token-error);
812
- --color-error-bg: var(--token-error-muted);
813
- --color-info: var(--token-info);
814
- --color-info-bg: var(--token-info-muted);
815
- --color-pending: var(--token-text-faint);
816
- --color-pending-bg: var(--token-fill-1);
817
- --accent-clay-bg: var(--token-accent-subtle);
818
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
819
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 20%, transparent);
205
+ /* 莫奈 · 睡莲水面 · 蓝绿柔光与含蓄紫调 · light */
206
+ [data-icen-preset="monet"] {
207
+ --icen-design-canvas: #f4f7f4;
208
+ --icen-design-surface: #fcfdfb;
209
+ --icen-design-raised: #e8eeea;
210
+ --icen-design-ink: #20332e;
211
+ --icen-design-muted: #5b6f65;
212
+ --icen-design-faint: #5b6e64;
213
+ --icen-design-accent: #2b675c;
214
+ --icen-design-accent-strong: #245c50;
215
+ --icen-design-accent-text: #24574c;
216
+ --icen-design-on-accent: #ffffff;
217
+ --icen-design-cold: #667c8a;
218
+ --icen-design-success: #307449;
219
+ --icen-design-warning: #805f1b;
220
+ --icen-design-error: #a43d42;
221
+ --icen-design-info: #3d6a82;
222
+ --icen-design-shadow-color: #23372f;
223
+ --icen-design-glass-opacity: 93%;
224
+ --icen-design-shadow-strength: 8%;
225
+ --icen-design-edge-strength: 12%;
226
+ --icen-design-highlight-strength: 52%;
227
+ color-scheme: light;
820
228
  }
821
229
 
822
- /* ── INK DARK · 夜墨松烟 ── */
823
- .ink.dark {
824
- /* 墨色夜空 · 松烟暗绿 · 冷灰星点 */
825
- --token-bg: #131815;
826
- --token-bg-soft: #1A201D;
827
- --token-surface: #212824;
828
- --token-surface-strong: #28302B;
829
- --token-line-soft: #2A322D;
830
- --token-line: #3A423D;
831
- --token-line-strong: #4A524D;
832
- --token-text: #F0EEE8;
833
- --token-text-muted: #B0AEAA;
834
- --token-text-faint: #74726e;
835
- --token-accent: #7AA87E;
836
- --token-accent-cold: #6A8EA0;
837
-
838
- --token-glow: rgba(122,168,126,.10);
839
- --token-glow-cold: rgba(106,142,160,.05);
840
-
841
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 90%, var(--token-accent) 10%);
842
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 10%, transparent);
843
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 6%, transparent);
844
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
845
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
846
- /* 松烟绿 accent 上的文字色:深墨(白字在 #7AA87E 上对比度不达标) */
847
- --token-on-accent: #1a2018;
848
-
849
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.2), 0 4px 14px rgba(0,0,0,.22);
850
- --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.28), 0 10px 30px rgba(0,0,0,.34);
851
-
852
- --token-success: #6AB080;
853
- --token-success-muted: rgba(106,176,128,.12);
854
- --token-warning: #B89A45;
855
- --token-warning-muted: rgba(184,154,69,.12);
856
- --token-error: #C06860;
857
- --token-error-muted: rgba(192,104,96,.12);
858
- --token-info: #6A98B8;
859
- --token-info-muted: rgba(106,152,184,.12);
860
-
861
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
862
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
863
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
864
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
865
-
866
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
867
-
868
- /* ── BRIDGE ── */
869
- --accent-clay: var(--token-accent);
870
- --accent-clay-dark: #5A8A62;
871
- --accent-clay-light: #A0CAA4;
872
- --accent-cold: var(--token-accent-cold);
873
- --bg-primary: var(--token-bg);
874
- --bg-secondary: var(--token-bg-soft);
875
- --bg-tertiary: var(--token-surface);
876
- --bg-card: var(--token-bg-soft);
877
- --bg-card-muted: var(--token-surface);
878
- --bg-panel: var(--token-surface-strong);
879
- --bg-hover: var(--token-surface-hover);
880
- --text-primary: var(--token-text);
881
- --text-secondary: var(--token-text-muted);
882
- --text-tertiary: #989692;
883
- --text-muted: var(--token-text-faint);
884
- --text-subtle: var(--token-line-strong);
885
- --border-subtle: var(--token-line-soft);
886
- --border-default: var(--token-line);
887
- --border-strong: var(--token-line-strong);
888
- --shadow-sm: var(--token-shadow-elevated);
889
- --shadow-md: var(--token-shadow-overlay);
890
- --color-success: var(--token-success);
891
- --color-success-bg: var(--token-success-muted);
892
- --color-warning: var(--token-warning);
893
- --color-warning-bg: var(--token-warning-muted);
894
- --color-error: var(--token-error);
895
- --color-error-bg: var(--token-error-muted);
896
- --color-info: var(--token-info);
897
- --color-info-bg: var(--token-info-muted);
898
- --color-pending: var(--token-text-faint);
899
- --color-pending-bg: var(--token-fill-1);
900
- --accent-clay-bg: var(--token-accent-subtle);
901
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
902
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
230
+ /* 莫奈 · 睡莲水面 · 蓝绿柔光与含蓄紫调 · dark */
231
+ [data-icen-preset="monet"][data-icen-theme="dark"] {
232
+ --icen-design-canvas: #121d1a;
233
+ --icen-design-surface: #1d2d27;
234
+ --icen-design-raised: #2c3d34;
235
+ --icen-design-ink: #e6f0e7;
236
+ --icen-design-muted: #a7c0b1;
237
+ --icen-design-faint: #9cb1a4;
238
+ --icen-design-accent: #93c9ad;
239
+ --icen-design-accent-strong: #a0d2b7;
240
+ --icen-design-accent-text: #a5d8bd;
241
+ --icen-design-on-accent: #173328;
242
+ --icen-design-cold: #a1baca;
243
+ --icen-design-success: #91d2a2;
244
+ --icen-design-warning: #dac487;
245
+ --icen-design-error: #e8a7ad;
246
+ --icen-design-info: #9bc4da;
247
+ --icen-design-shadow-color: #06100b;
248
+ --icen-design-glass-opacity: 95%;
249
+ --icen-design-shadow-strength: 27%;
250
+ --icen-design-edge-strength: 14%;
251
+ --icen-design-highlight-strength: 6%;
252
+ color-scheme: dark;
903
253
  }
904
254
 
905
- /* ══════════════════════════════════════════════════════════════
906
- RETRO — 8-bit · 红白机 · 像素风
907
- NES · Famicom · Pixel Art · CRT Glow
908
- ══════════════════════════════════════════════════════════════ */
909
-
910
- /* ── RETRO LIGHT · 经典像素 ── */
911
- .retro {
912
- /* 像素风配色:纯白底 + 经典红 + 深蓝 */
913
- --token-bg: #f0f0e8;
914
- --token-bg-soft: #e0e0d0;
915
- --token-surface: #e8e8dc;
916
- --token-surface-strong: #dcdcc8;
917
- --token-line-soft: #c0c0a8;
918
- --token-line: #a0a088;
919
- --token-line-strong: #808068;
920
- --token-text: #1a1a1a;
921
- --token-text-muted: #4a4a3a;
922
- --token-text-faint: #7a7a6a;
923
- --token-accent: #d03030;
924
- --token-accent-cold: #3030a0;
925
-
926
- /* ── Glow ── */
927
- --token-glow: rgba(208,48,48,.10);
928
- --token-glow-cold: rgba(48,48,160,.08);
929
-
930
- /* ── Derived ── */
931
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 90%, var(--token-accent) 10%);
932
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
933
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
934
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
935
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
936
- --token-on-accent: #ffffff;
937
-
938
- /* ── Shadow · 硬像素投影 ── */
939
- --token-shadow-elevated: 2px 2px 0 rgba(26,26,26,.25);
940
- --token-shadow-overlay: 3px 3px 0 rgba(26,26,26,.35);
941
-
942
- /* ── Semantic ── */
943
- --token-success: #30a030;
944
- --token-success-muted: rgba(48,160,48,.14);
945
- --token-warning: #c8a020;
946
- --token-warning-muted: rgba(200,160,32,.14);
947
- --token-error: #d03030;
948
- --token-error-muted: rgba(208,48,48,.14);
949
- --token-info: #3030a0;
950
- --token-info-muted: rgba(48,48,160,.14);
951
-
952
- /* ── Fill ── */
953
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
954
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
955
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
956
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
957
-
958
- /* ── Glass ── */
959
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 88%, transparent);
960
-
961
- /* ── BRIDGE ── */
962
- --accent-clay: var(--token-accent);
963
- --accent-clay-dark: #a02020;
964
- --accent-clay-light: #e06060;
965
- --accent-cold: var(--token-accent-cold);
966
- --bg-primary: var(--token-bg);
967
- --bg-secondary: var(--token-bg-soft);
968
- --bg-tertiary: var(--token-surface);
969
- --bg-card: var(--token-surface);
970
- --bg-card-muted: var(--token-bg-soft);
971
- --bg-panel: var(--token-surface-strong);
972
- --bg-hover: var(--token-surface-hover);
973
- --text-primary: var(--token-text);
974
- --text-secondary: var(--token-text-muted);
975
- --text-tertiary: #5a5a4a;
976
- --text-muted: var(--token-text-faint);
977
- --text-subtle: var(--token-line-strong);
978
- --border-subtle: var(--token-line-soft);
979
- --border-default: var(--token-line);
980
- --border-strong: var(--token-line-strong);
981
- --shadow-sm: var(--token-shadow-elevated);
982
- --shadow-md: var(--token-shadow-overlay);
983
- --color-success: var(--token-success);
984
- --color-success-bg: var(--token-success-muted);
985
- --color-warning: var(--token-warning);
986
- --color-warning-bg: var(--token-warning-muted);
987
- --color-error: var(--token-error);
988
- --color-error-bg: var(--token-error-muted);
989
- --color-info: var(--token-info);
990
- --color-info-bg: var(--token-info-muted);
991
- --color-pending: var(--token-text-faint);
992
- --color-pending-bg: var(--token-fill-1);
993
- --accent-clay-bg: var(--token-accent-subtle);
994
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 20%, transparent);
995
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
255
+ /* 梵高 · 亚麻画布 · 钴蓝与麦穗金 · light */
256
+ [data-icen-preset="vangogh"] {
257
+ --icen-design-canvas: #f8f3e4;
258
+ --icen-design-surface: #fffdf3;
259
+ --icen-design-raised: #efe5c9;
260
+ --icen-design-ink: #253650;
261
+ --icen-design-muted: #5c6580;
262
+ --icen-design-faint: #5e667b;
263
+ --icen-design-accent: #275ea0;
264
+ --icen-design-accent-strong: #224e83;
265
+ --icen-design-accent-text: #234c7b;
266
+ --icen-design-on-accent: #fffdf3;
267
+ --icen-design-cold: #a0711e;
268
+ --icen-design-success: #416b3a;
269
+ --icen-design-warning: #855a15;
270
+ --icen-design-error: #a83c31;
271
+ --icen-design-info: #356b85;
272
+ --icen-design-shadow-color: #463d27;
273
+ --icen-design-glass-opacity: 92%;
274
+ --icen-design-shadow-strength: 11%;
275
+ --icen-design-edge-strength: 13%;
276
+ --icen-design-highlight-strength: 62%;
277
+ color-scheme: light;
996
278
  }
997
279
 
998
- /* ── RETRO DARK · 深夜像素 ── */
999
- .retro.dark {
1000
- /* 像素暗色:深蓝灰底 + 霓虹红 + 像素蓝 */
1001
- --token-bg: #1a1a2e;
1002
- --token-bg-soft: #222240;
1003
- --token-surface: #2a2a50;
1004
- --token-surface-strong: #323260;
1005
- --token-line-soft: #3a3a70;
1006
- --token-line: #4a4a90;
1007
- --token-line-strong: #5a5ab0;
1008
- --token-text: #e8e8d8;
1009
- --token-text-muted: #c0c0a8;
1010
- --token-text-faint: #808070;
1011
- --token-accent: #ff4040;
1012
- --token-accent-cold: #5050ff;
1013
-
1014
- /* ── Glow · 霓虹像素光 ── */
1015
- --token-glow: rgba(255,64,64,.14);
1016
- --token-glow-cold: rgba(80,80,255,.10);
1017
-
1018
- /* ── Derived ── */
1019
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 88%, var(--token-accent) 12%);
1020
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 14%, transparent);
1021
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 10%, transparent);
1022
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
1023
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
1024
- --token-on-accent: #ffffff;
1025
-
1026
- /* ── Shadow · 硬像素投影 ── */
1027
- --token-shadow-elevated: 2px 2px 0 rgba(0,0,0,.40);
1028
- --token-shadow-overlay: 3px 3px 0 rgba(0,0,0,.50);
1029
-
1030
- /* ── Semantic ── */
1031
- --token-success: #40ff40;
1032
- --token-success-muted: rgba(64,255,64,.16);
1033
- --token-warning: #ffff40;
1034
- --token-warning-muted: rgba(255,255,64,.16);
1035
- --token-error: #ff4040;
1036
- --token-error-muted: rgba(255,64,64,.16);
1037
- --token-info: #5050ff;
1038
- --token-info-muted: rgba(80,80,255,.16);
1039
-
1040
- /* ── Fill ── */
1041
- --token-fill-1: color-mix(in srgb, var(--token-text) 5%, transparent);
1042
- --token-fill-2: color-mix(in srgb, var(--token-text) 10%, transparent);
1043
- --token-fill-3: color-mix(in srgb, var(--token-text) 16%, transparent);
1044
- --token-fill-4: color-mix(in srgb, var(--token-text) 24%, transparent);
1045
-
1046
- /* ── Glass ── */
1047
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
1048
-
1049
- /* ── BRIDGE ── */
1050
- --accent-clay: var(--token-accent);
1051
- --accent-clay-dark: #d03030;
1052
- --accent-clay-light: #ff6060;
1053
- --accent-cold: var(--token-accent-cold);
1054
- --bg-primary: var(--token-bg);
1055
- --bg-secondary: var(--token-bg-soft);
1056
- --bg-tertiary: var(--token-surface);
1057
- --bg-card: var(--token-bg-soft);
1058
- --bg-card-muted: var(--token-surface);
1059
- --bg-panel: var(--token-surface-strong);
1060
- --bg-hover: var(--token-surface-hover);
1061
- --text-primary: var(--token-text);
1062
- --text-secondary: var(--token-text-muted);
1063
- --text-tertiary: #a0a090;
1064
- --text-muted: var(--token-text-faint);
1065
- --text-subtle: var(--token-line-strong);
1066
- --border-subtle: var(--token-line-soft);
1067
- --border-default: var(--token-line);
1068
- --border-strong: var(--token-line-strong);
1069
- --shadow-sm: var(--token-shadow-elevated);
1070
- --shadow-md: var(--token-shadow-overlay);
1071
- --color-success: var(--token-success);
1072
- --color-success-bg: var(--token-success-muted);
1073
- --color-warning: var(--token-warning);
1074
- --color-warning-bg: var(--token-warning-muted);
1075
- --color-error: var(--token-error);
1076
- --color-error-bg: var(--token-error-muted);
1077
- --color-info: var(--token-info);
1078
- --color-info-bg: var(--token-info-muted);
1079
- --color-pending: var(--token-text-faint);
1080
- --color-pending-bg: var(--token-fill-1);
1081
- --accent-clay-bg: var(--token-accent-subtle);
1082
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 16%, transparent);
1083
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
280
+ /* 梵高 · 亚麻画布 · 钴蓝与麦穗金 · dark */
281
+ [data-icen-preset="vangogh"][data-icen-theme="dark"] {
282
+ --icen-design-canvas: #111e32;
283
+ --icen-design-surface: #1c2d46;
284
+ --icen-design-raised: #2a3f5b;
285
+ --icen-design-ink: #f8efcf;
286
+ --icen-design-muted: #c2c4b5;
287
+ --icen-design-faint: #afb7bd;
288
+ --icen-design-accent: #e5be54;
289
+ --icen-design-accent-strong: #ebc568;
290
+ --icen-design-accent-text: #efd181;
291
+ --icen-design-on-accent: #2b2617;
292
+ --icen-design-cold: #88a5d6;
293
+ --icen-design-success: #b3d29b;
294
+ --icen-design-warning: #f0cd7b;
295
+ --icen-design-error: #efaaa0;
296
+ --icen-design-info: #a1c9e8;
297
+ --icen-design-shadow-color: #050b15;
298
+ --icen-design-glass-opacity: 93%;
299
+ --icen-design-shadow-strength: 30%;
300
+ --icen-design-edge-strength: 16%;
301
+ --icen-design-highlight-strength: 7%;
302
+ color-scheme: dark;
1084
303
  }
1085
304
 
1086
- /* ── RETRO Depth Tokens ── */
1087
- .retro {
1088
- --token-canvas: var(--token-bg);
1089
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 78%, var(--token-bg) 22%);
1090
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 52%, var(--token-bg) 48%);
1091
- --token-card: color-mix(in srgb, var(--token-bg) 80%, var(--token-surface) 20%);
1092
- --token-card-strong: color-mix(in srgb, var(--token-bg) 66%, var(--token-surface) 34%);
1093
- --token-control: color-mix(in srgb, var(--token-bg-soft) 62%, var(--token-bg) 38%);
1094
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 52%, var(--token-bg-soft) 48%);
1095
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1096
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-bg) 16%);
1097
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 86%, var(--token-text) 8%);
1098
- --token-shadow-card: 2px 2px 0 color-mix(in srgb, var(--token-text) 15%, transparent);
1099
- --token-shadow-inset: inset 2px 2px 0 color-mix(in srgb, var(--token-surface) 42%, transparent), inset -1px -1px 0 color-mix(in srgb, var(--token-text) 4%, transparent);
1100
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 36%, transparent);
305
+ /* Recompute semantic aliases at each palette boundary (including nested specimens). */
306
+ :root, [data-icen-preset], [data-icen-theme="dark"] {
307
+ --icen-design-bg-soft: color-mix(in srgb, var(--icen-design-canvas) 70%, var(--icen-design-raised));
308
+ --icen-token-bg: var(--icen-design-canvas);
309
+ --icen-token-bg-soft: var(--icen-design-bg-soft);
310
+ --icen-token-surface: var(--icen-design-surface);
311
+ --icen-token-surface-strong: var(--icen-design-raised);
312
+ --icen-token-text: var(--icen-design-ink);
313
+ --icen-token-text-muted: var(--icen-design-muted);
314
+ --icen-token-text-faint: var(--icen-design-faint);
315
+ --icen-token-accent: var(--icen-design-accent);
316
+ --icen-token-accent-strong: var(--icen-design-accent-strong);
317
+ --icen-token-accent-text: var(--icen-design-accent-text);
318
+ --icen-token-accent-deep: var(--icen-design-accent-strong);
319
+ --icen-token-accent-cold: var(--icen-design-cold);
320
+ --icen-token-on-accent: var(--icen-design-on-accent);
321
+ --icen-token-success: var(--icen-design-success);
322
+ --icen-token-success-text: var(--icen-design-success);
323
+ --icen-token-warning: var(--icen-design-warning);
324
+ --icen-token-error: var(--icen-design-error);
325
+ --icen-token-danger: var(--icen-design-error);
326
+ --icen-token-info: var(--icen-design-info);
327
+ --icen-token-surface-hover: color-mix(in srgb, var(--icen-design-surface) 94%, var(--icen-design-ink));
328
+ --icen-token-line-soft: color-mix(in srgb, var(--icen-design-ink) 10%, transparent);
329
+ --icen-token-line: color-mix(in srgb, var(--icen-design-ink) 19%, transparent);
330
+ --icen-token-line-strong: color-mix(in srgb, var(--icen-design-ink) 38%, transparent);
331
+ --icen-token-line-dashed: var(--icen-token-line);
332
+ --icen-token-outline-soft: var(--icen-token-line-soft);
333
+ --icen-token-outline: var(--icen-token-line);
334
+ --icen-token-outline-strong: var(--icen-token-line-strong);
335
+ --icen-token-fill-1: color-mix(in srgb, var(--icen-design-ink) 4%, transparent);
336
+ --icen-token-fill-2: color-mix(in srgb, var(--icen-design-ink) 7%, transparent);
337
+ --icen-token-fill-3: color-mix(in srgb, var(--icen-design-ink) 12%, transparent);
338
+ --icen-token-fill-4: color-mix(in srgb, var(--icen-design-ink) 18%, transparent);
339
+ --icen-token-accent-subtle: color-mix(in srgb, var(--icen-design-accent) 10%, transparent);
340
+ --icen-token-accent-glow: color-mix(in srgb, var(--icen-design-accent) 8%, transparent);
341
+ --icen-token-glow: transparent;
342
+ --icen-token-glow-cold: transparent;
343
+ --icen-token-success-muted: color-mix(in srgb, var(--icen-design-success) 12%, transparent);
344
+ --icen-token-warning-muted: color-mix(in srgb, var(--icen-design-warning) 12%, transparent);
345
+ --icen-token-error-muted: color-mix(in srgb, var(--icen-design-error) 12%, transparent);
346
+ --icen-token-error-soft: var(--icen-token-error-muted);
347
+ --icen-token-info-muted: color-mix(in srgb, var(--icen-design-info) 12%, transparent);
348
+ --icen-token-canvas: var(--icen-token-bg);
349
+ --icen-token-sidebar: var(--icen-token-bg-soft);
350
+ --icen-token-panel: var(--icen-token-bg-soft);
351
+ --icen-token-card: var(--icen-token-surface);
352
+ --icen-token-card-strong: var(--icen-token-surface-strong);
353
+ --icen-token-control: color-mix(in srgb, var(--icen-design-surface) 70%, var(--icen-design-canvas));
354
+ --icen-token-control-hover: var(--icen-token-surface-hover);
355
+ --icen-token-surface-glass: color-mix(in srgb, var(--icen-token-surface) var(--icen-design-glass-opacity), transparent);
356
+ --icen-token-overlay-bg: var(--icen-token-surface-glass);
357
+ --icen-token-scrollbar-size: 8px;
358
+ --icen-token-scrollbar-size-sm: 6px;
359
+ --icen-token-scrollbar-size-lg: 12px;
360
+ --icen-token-scrollbar-inset: 2px;
361
+ --icen-token-scrollbar-gutter: auto;
362
+ --icen-token-scrollbar-idle-delay: 900ms;
363
+ --icen-token-scrollbar-fade-duration: var(--icen-duration-normal);
364
+ --icen-token-scrollbar-track: transparent;
365
+ --icen-token-scrollbar-thumb: color-mix(in srgb, var(--icen-design-ink) 22%, transparent);
366
+ --icen-token-scrollbar-thumb-hover: color-mix(in srgb, var(--icen-design-ink) 38%, transparent);
367
+ --icen-token-scrollbar-button: transparent;
368
+ --icen-accent-cold: var(--icen-token-accent-cold);
369
+ --icen-bg-primary: var(--icen-token-bg);
370
+ --icen-bg-secondary: var(--icen-token-bg-soft);
371
+ --icen-bg-tertiary: var(--icen-token-surface);
372
+ --icen-bg-card: var(--icen-token-card);
373
+ --icen-bg-card-muted: var(--icen-token-bg-soft);
374
+ --icen-bg-panel: var(--icen-token-panel);
375
+ --icen-bg-hover: var(--icen-token-surface-hover);
376
+ --icen-text-primary: var(--icen-token-text);
377
+ --icen-text-secondary: var(--icen-token-text);
378
+ --icen-text-tertiary: var(--icen-token-text-muted);
379
+ --icen-text-muted: var(--icen-token-text-muted);
380
+ --icen-text-subtle: var(--icen-token-text-faint);
381
+ --icen-border-subtle: var(--icen-token-line-soft);
382
+ --icen-border-default: var(--icen-token-line);
383
+ --icen-border-strong: var(--icen-token-line-strong);
384
+ --icen-shadow-sm: var(--icen-token-shadow-elevated);
385
+ --icen-shadow-md: var(--icen-token-shadow-overlay);
386
+ --icen-color-success: var(--icen-token-success);
387
+ --icen-color-success-bg: var(--icen-token-success-muted);
388
+ --icen-color-warning: var(--icen-token-warning);
389
+ --icen-color-warning-bg: var(--icen-token-warning-muted);
390
+ --icen-color-error: var(--icen-token-error);
391
+ --icen-color-error-bg: var(--icen-token-error-muted);
392
+ --icen-color-info: var(--icen-token-info);
393
+ --icen-color-info-bg: var(--icen-token-info-muted);
394
+ --icen-color-pending: var(--icen-token-text-muted);
395
+ --icen-color-pending-bg: var(--icen-token-bg-soft);
1101
396
  }
1102
397
 
1103
- .retro.dark {
1104
- --token-canvas: var(--token-bg);
1105
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 86%, var(--token-bg) 14%);
1106
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 72%, var(--token-bg) 28%);
1107
- --token-card: color-mix(in srgb, var(--token-surface) 72%, var(--token-bg-soft) 28%);
1108
- --token-card-strong: color-mix(in srgb, var(--token-surface-strong) 72%, var(--token-surface) 28%);
1109
- --token-control: color-mix(in srgb, var(--token-bg-soft) 70%, var(--token-bg) 30%);
1110
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 62%, var(--token-bg-soft) 38%);
1111
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1112
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-text-faint) 8%);
1113
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 86%, var(--token-text-muted) 8%);
1114
- --token-shadow-card: 2px 2px 0 rgba(0,0,0,.30);
1115
- --token-shadow-inset: inset 2px 2px 0 color-mix(in srgb, var(--token-text) 6%, transparent), inset -1px -1px 0 rgba(0,0,0,.22);
1116
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 18%, transparent);
1117
398
  }
1118
-
1119
-
1120
- /* ── 圆角 ── */
1121
- :root {
1122
- --radius-xs: 6px;
1123
- --radius-sm: 8px;
1124
- --radius-md: 10px;
1125
- --radius-lg: 12px;
1126
- --radius-xl: 16px;
1127
- --radius-full: 999px;
1128
- }
1129
-
1130
- /* ── Depth Tokens ──
1131
- Semantic surface levels used by app chrome and primitives. These are
1132
- intentionally derived from theme tokens so every palette keeps its own voice
1133
- while gaining clearer functional separation. */
1134
- :root {
1135
- --token-canvas: var(--token-bg);
1136
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 78%, var(--token-bg) 22%);
1137
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 52%, var(--token-bg) 48%);
1138
- --token-card: color-mix(in srgb, var(--token-bg) 80%, var(--token-surface) 20%);
1139
- --token-card-strong: color-mix(in srgb, var(--token-bg) 66%, var(--token-surface) 34%);
1140
- --token-control: color-mix(in srgb, var(--token-bg-soft) 62%, var(--token-bg) 38%);
1141
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 52%, var(--token-bg-soft) 48%);
1142
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1143
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-bg) 16%);
1144
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 86%, var(--token-text) 8%);
1145
- --token-shadow-card: 0 1px 2px color-mix(in srgb, var(--token-text) 5%, transparent), 0 6px 18px color-mix(in srgb, var(--token-text) 5%, transparent);
1146
- --token-shadow-inset: inset 0 1px 1px color-mix(in srgb, var(--token-surface) 42%, transparent), inset 0 -1px 1px color-mix(in srgb, var(--token-text) 4%, transparent);
1147
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 36%, transparent);
1148
-
1149
- /* ── Scrollbar ──
1150
- 由 base.css 的全局滚动条消费;每个预设可在自己的块里覆盖这 5 个 token,
1151
- 以表达品牌色差(如 piano 用金、ink 用青)。retro/terminal 风格在
1152
- style-profiles.css 里另有像素化硬覆盖。 */
1153
- --token-scrollbar-size: 8px;
1154
- --token-scrollbar-track: transparent;
1155
- --token-scrollbar-thumb: color-mix(in srgb, var(--token-text) 16%, transparent);
1156
- --token-scrollbar-thumb-hover: color-mix(in srgb, var(--token-accent) 50%, transparent);
1157
- --token-scrollbar-button: transparent;
1158
- }
1159
-
1160
- .dark {
1161
- --token-canvas: var(--token-bg);
1162
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 86%, var(--token-bg) 14%);
1163
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 72%, var(--token-bg) 28%);
1164
- --token-card: color-mix(in srgb, var(--token-surface) 72%, var(--token-bg-soft) 28%);
1165
- --token-card-strong: color-mix(in srgb, var(--token-surface-strong) 72%, var(--token-surface) 28%);
1166
- --token-control: color-mix(in srgb, var(--token-bg-soft) 70%, var(--token-bg) 30%);
1167
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 62%, var(--token-bg-soft) 38%);
1168
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1169
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-text-faint) 8%);
1170
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 86%, var(--token-text-muted) 8%);
1171
- --token-shadow-card: 0 1px 1px rgba(0,0,0,.22), 0 12px 28px rgba(0,0,0,.24);
1172
- --token-shadow-inset: inset 0 1px 1px color-mix(in srgb, var(--token-text) 6%, transparent), inset 0 -1px 1px rgba(0,0,0,.22);
1173
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 18%, transparent);
1174
- }
1175
-
1176
- .piano {
1177
- --token-canvas: var(--token-bg);
1178
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 84%, var(--token-bg) 16%);
1179
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 68%, var(--token-bg) 32%);
1180
- --token-card: color-mix(in srgb, var(--token-surface) 56%, var(--token-bg) 44%);
1181
- --token-card-strong: color-mix(in srgb, var(--token-surface) 72%, var(--token-bg-soft) 28%);
1182
- --token-control: color-mix(in srgb, var(--token-bg-soft) 74%, var(--token-line-soft) 26%);
1183
- --token-control-hover: color-mix(in srgb, var(--token-surface-strong) 92%, var(--token-accent) 8%);
1184
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 84%, var(--token-bg) 16%);
1185
- --token-outline: color-mix(in srgb, var(--token-line) 94%, var(--token-text-muted) 6%);
1186
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 92%, var(--token-text) 8%);
1187
- --token-shadow-card: 0 1px 1px color-mix(in srgb, var(--token-text) 7%, transparent), 0 9px 24px color-mix(in srgb, var(--token-text) 7%, transparent);
1188
- --token-shadow-inset: inset 0 1px 1px color-mix(in srgb, var(--token-surface) 70%, transparent), inset 0 -1px 1px color-mix(in srgb, var(--token-text) 5%, transparent);
1189
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 52%, transparent);
1190
- }
1191
-
1192
- .piano.dark {
1193
- --token-canvas: var(--token-bg);
1194
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 86%, black 14%);
1195
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 74%, var(--token-bg) 26%);
1196
- --token-card: color-mix(in srgb, var(--token-surface) 76%, var(--token-bg-soft) 24%);
1197
- --token-card-strong: color-mix(in srgb, var(--token-surface-strong) 78%, var(--token-surface) 22%);
1198
- --token-control: color-mix(in srgb, var(--token-bg-soft) 72%, black 28%);
1199
- --token-control-hover: color-mix(in srgb, var(--token-surface-strong) 92%, var(--token-accent) 8%);
1200
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 86%, var(--token-bg) 14%);
1201
- --token-outline: color-mix(in srgb, var(--token-line) 92%, var(--token-accent) 8%);
1202
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 88%, var(--token-accent) 12%);
1203
- --token-shadow-card: 0 1px 1px rgba(0,0,0,.32), 0 14px 34px rgba(0,0,0,.40);
1204
- --token-shadow-inset: inset 0 1px 1px color-mix(in srgb, var(--token-text) 8%, transparent), inset 0 -1px 1px rgba(0,0,0,.30);
1205
- --token-top-highlight: color-mix(in srgb, var(--token-text) 8%, transparent);
1206
- }
1207
-
1208
- .vangogh {
1209
- --token-canvas: color-mix(in srgb, var(--token-bg) 88%, #f6efd0 12%);
1210
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 78%, var(--token-bg) 22%);
1211
- --token-panel: color-mix(in srgb, var(--token-bg) 70%, var(--token-bg-soft) 30%);
1212
- --token-card: color-mix(in srgb, var(--token-bg) 78%, var(--token-surface) 22%);
1213
- --token-card-strong: color-mix(in srgb, var(--token-bg) 58%, var(--token-surface) 42%);
1214
- --token-control: color-mix(in srgb, var(--token-bg-soft) 58%, var(--token-bg) 42%);
1215
- --token-control-hover: color-mix(in srgb, var(--token-surface-strong) 86%, var(--token-accent) 14%);
1216
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 80%, var(--token-bg) 20%);
1217
- --token-outline: color-mix(in srgb, var(--token-line) 88%, var(--token-accent) 12%);
1218
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 84%, var(--token-accent) 16%);
1219
- --token-shadow-card: 0 1px 2px color-mix(in srgb, var(--token-text) 5%, transparent), 0 8px 22px color-mix(in srgb, var(--token-text) 7%, transparent);
1220
- --token-shadow-inset: inset 0 1px 1px color-mix(in srgb, var(--token-surface) 48%, transparent), inset 0 -1px 1px color-mix(in srgb, var(--token-text) 4%, transparent);
1221
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 30%, transparent);
1222
- }
1223
-
1224
- .vangogh.dark {
1225
- --token-canvas: var(--token-bg);
1226
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 84%, var(--token-bg) 16%);
1227
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 72%, var(--token-bg) 28%);
1228
- --token-card: color-mix(in srgb, var(--token-surface) 72%, var(--token-bg-soft) 28%);
1229
- --token-card-strong: color-mix(in srgb, var(--token-surface-strong) 76%, var(--token-surface) 24%);
1230
- --token-control: color-mix(in srgb, var(--token-bg-soft) 70%, var(--token-bg) 30%);
1231
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 74%, var(--token-accent) 8%);
1232
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1233
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-accent-cold) 8%);
1234
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 84%, var(--token-accent) 10%);
1235
- --token-shadow-card: 0 1px 1px rgba(0,0,0,.22), 0 12px 28px rgba(0,0,0,.24);
1236
- --token-shadow-inset: inset 0 1px 1px color-mix(in srgb, var(--token-text) 6%, transparent), inset 0 -1px 1px rgba(0,0,0,.22);
1237
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 18%, transparent);
1238
- }
1239
-
1240
- /* ── 动画 ── */
1241
- @keyframes blink {
1242
- 0%, 100% { opacity: 1; }
1243
- 50% { opacity: 0; }
1244
- }
1245
-
1246
- .animate-blink {
1247
- animation: blink 1s step-end infinite;
1248
- }
1249
-