@icen.ai/ui 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/AGENTS.md +138 -80
  2. package/README.md +66 -91
  3. package/dist/base.css +208 -179
  4. package/dist/behaviors/accordion.mjs +8 -8
  5. package/dist/behaviors/ai-branch.d.mts +1 -1
  6. package/dist/behaviors/ai-branch.mjs +1010 -94
  7. package/dist/behaviors/ai-chat.d.mts +7 -7
  8. package/dist/behaviors/ai-chat.mjs +1071 -161
  9. package/dist/behaviors/ai-composer.d.mts +44 -12
  10. package/dist/behaviors/ai-composer.mjs +1997 -524
  11. package/dist/behaviors/ai-core.d.mts +1 -1
  12. package/dist/behaviors/ai-core.mjs +1016 -107
  13. package/dist/behaviors/ai-diff.mjs +1019 -127
  14. package/dist/behaviors/ai-feedback.d.mts +1 -1
  15. package/dist/behaviors/ai-feedback.mjs +1035 -126
  16. package/dist/behaviors/ai-panel.d.mts +8 -8
  17. package/dist/behaviors/ai-panel.mjs +1284 -266
  18. package/dist/behaviors/ai-provider.mjs +1003 -101
  19. package/dist/behaviors/ai-threads.d.mts +1 -1
  20. package/dist/behaviors/ai-threads.mjs +1068 -154
  21. package/dist/behaviors/ai-tool.d.mts +2 -2
  22. package/dist/behaviors/ai-tool.mjs +2037 -396
  23. package/dist/behaviors/ai-tools.d.mts +89 -16
  24. package/dist/behaviors/ai-tools.mjs +4448 -372
  25. package/dist/behaviors/autocomplete.d.mts +53 -0
  26. package/dist/behaviors/autocomplete.mjs +1600 -0
  27. package/dist/behaviors/back-top.d.mts +1 -1
  28. package/dist/behaviors/back-top.mjs +951 -14
  29. package/dist/behaviors/carousel.d.mts +1 -1
  30. package/dist/behaviors/carousel.mjs +906 -11
  31. package/dist/behaviors/cascader.d.mts +48 -0
  32. package/dist/behaviors/cascader.mjs +1853 -0
  33. package/dist/behaviors/charts.d.mts +72 -8
  34. package/dist/behaviors/charts.mjs +1901 -256
  35. package/dist/behaviors/code-block.d.mts +36 -0
  36. package/dist/behaviors/code-block.mjs +1611 -0
  37. package/dist/behaviors/command-palette.d.mts +9 -6
  38. package/dist/behaviors/command-palette.mjs +161 -59
  39. package/dist/behaviors/context-menu.d.mts +9 -8
  40. package/dist/behaviors/context-menu.mjs +1112 -44
  41. package/dist/behaviors/controls.d.mts +13 -13
  42. package/dist/behaviors/controls.mjs +989 -130
  43. package/dist/behaviors/copy.d.mts +21 -2
  44. package/dist/behaviors/copy.mjs +1206 -42
  45. package/dist/behaviors/datatable.d.mts +53 -3
  46. package/dist/behaviors/datatable.mjs +1963 -207
  47. package/dist/behaviors/date-picker.d.mts +0 -1
  48. package/dist/behaviors/date-picker.mjs +1340 -293
  49. package/dist/behaviors/design.d.mts +54 -0
  50. package/dist/behaviors/design.mjs +109 -0
  51. package/dist/behaviors/dropdown.d.mts +5 -6
  52. package/dist/behaviors/dropdown.mjs +262 -110
  53. package/dist/behaviors/events.d.mts +120 -3
  54. package/dist/behaviors/events.mjs +47 -2
  55. package/dist/behaviors/feedback.d.mts +30 -0
  56. package/dist/behaviors/feedback.mjs +296 -0
  57. package/dist/behaviors/focus.d.mts +8 -0
  58. package/dist/behaviors/focus.mjs +24 -0
  59. package/dist/behaviors/form-validate.d.mts +102 -0
  60. package/dist/behaviors/form-validate.mjs +6091 -0
  61. package/dist/behaviors/i18n.d.mts +789 -0
  62. package/dist/behaviors/i18n.mjs +1711 -0
  63. package/dist/behaviors/icons.d.mts +93 -0
  64. package/dist/behaviors/icons.mjs +113 -0
  65. package/dist/behaviors/input.d.mts +9 -1
  66. package/dist/behaviors/input.mjs +1056 -60
  67. package/dist/behaviors/kb-access.d.mts +1 -1
  68. package/dist/behaviors/kb-access.mjs +2129 -239
  69. package/dist/behaviors/kb-acl.d.mts +6 -6
  70. package/dist/behaviors/kb-acl.mjs +1119 -179
  71. package/dist/behaviors/kb-answer.mjs +2070 -418
  72. package/dist/behaviors/kb-audit.d.mts +1 -1
  73. package/dist/behaviors/kb-audit.mjs +1076 -154
  74. package/dist/behaviors/kb-canvas.mjs +1100 -177
  75. package/dist/behaviors/kb-chain.mjs +1022 -100
  76. package/dist/behaviors/kb-checkpoint.d.mts +1 -1
  77. package/dist/behaviors/kb-checkpoint.mjs +1319 -169
  78. package/dist/behaviors/kb-chunks.mjs +1152 -213
  79. package/dist/behaviors/kb-citation.d.mts +1 -1
  80. package/dist/behaviors/kb-citation.mjs +1201 -179
  81. package/dist/behaviors/kb-clarify.mjs +1058 -130
  82. package/dist/behaviors/kb-conflict.mjs +1041 -119
  83. package/dist/behaviors/kb-connector.mjs +1104 -176
  84. package/dist/behaviors/kb-core.d.mts +6 -1
  85. package/dist/behaviors/kb-core.mjs +1077 -162
  86. package/dist/behaviors/kb-eval.mjs +1971 -144
  87. package/dist/behaviors/kb-explain.d.mts +1 -1
  88. package/dist/behaviors/kb-explain.mjs +1024 -102
  89. package/dist/behaviors/kb-filter.mjs +2008 -178
  90. package/dist/behaviors/kb-gap.d.mts +1 -1
  91. package/dist/behaviors/kb-gap.mjs +1043 -121
  92. package/dist/behaviors/kb-hittest.d.mts +1 -1
  93. package/dist/behaviors/kb-hittest.mjs +1093 -150
  94. package/dist/behaviors/kb-metadata.mjs +1052 -130
  95. package/dist/behaviors/kb-passage.d.mts +2 -2
  96. package/dist/behaviors/kb-passage.mjs +1101 -161
  97. package/dist/behaviors/kb-pipeline.d.mts +2 -2
  98. package/dist/behaviors/kb-pipeline.mjs +1082 -162
  99. package/dist/behaviors/kb-qa.mjs +1088 -160
  100. package/dist/behaviors/kb-rerank.mjs +1047 -114
  101. package/dist/behaviors/kb-retrieval.mjs +2063 -224
  102. package/dist/behaviors/kb-review.mjs +1990 -159
  103. package/dist/behaviors/kb-sandbox.d.mts +1 -1
  104. package/dist/behaviors/kb-sandbox.mjs +1026 -104
  105. package/dist/behaviors/kb-segment.mjs +1111 -179
  106. package/dist/behaviors/kb-select.d.mts +24 -0
  107. package/dist/behaviors/kb-select.mjs +1989 -0
  108. package/dist/behaviors/kb-sources.d.mts +1 -1
  109. package/dist/behaviors/kb-sources.mjs +1084 -170
  110. package/dist/behaviors/kb-sql.d.mts +1 -1
  111. package/dist/behaviors/kb-sql.mjs +1143 -226
  112. package/dist/behaviors/kb-trace.d.mts +1 -1
  113. package/dist/behaviors/kb-trace.mjs +1042 -128
  114. package/dist/behaviors/kb-visibility.mjs +1086 -158
  115. package/dist/behaviors/kb-who-can.mjs +1974 -137
  116. package/dist/behaviors/mentions.d.mts +93 -0
  117. package/dist/behaviors/mentions.mjs +2152 -0
  118. package/dist/behaviors/modal.d.mts +4 -3
  119. package/dist/behaviors/modal.mjs +1055 -33
  120. package/dist/behaviors/nav.d.mts +1 -1
  121. package/dist/behaviors/nav.mjs +6 -6
  122. package/dist/behaviors/notification.d.mts +16 -8
  123. package/dist/behaviors/notification.mjs +1615 -265
  124. package/dist/behaviors/panel.d.mts +4 -0
  125. package/dist/behaviors/panel.mjs +994 -0
  126. package/dist/behaviors/popover.d.mts +28 -5
  127. package/dist/behaviors/popover.mjs +225 -24
  128. package/dist/behaviors/select.d.mts +5 -2
  129. package/dist/behaviors/select.mjs +1410 -117
  130. package/dist/behaviors/sidebar.d.mts +1 -1
  131. package/dist/behaviors/sidebar.mjs +13 -13
  132. package/dist/behaviors/slider.d.mts +1 -1
  133. package/dist/behaviors/slider.mjs +9 -9
  134. package/dist/behaviors/split-pane.d.mts +1 -1
  135. package/dist/behaviors/split-pane.mjs +7 -7
  136. package/dist/behaviors/suggestions.d.mts +27 -0
  137. package/dist/behaviors/suggestions.mjs +1089 -0
  138. package/dist/behaviors/svg-parse.d.mts +14 -0
  139. package/dist/behaviors/svg-parse.mjs +37 -0
  140. package/dist/behaviors/tabs.d.mts +2 -2
  141. package/dist/behaviors/tabs.mjs +25 -25
  142. package/dist/behaviors/tag-input.d.mts +23 -5
  143. package/dist/behaviors/tag-input.mjs +1359 -104
  144. package/dist/behaviors/theme-switcher.d.mts +24 -0
  145. package/dist/behaviors/theme-switcher.mjs +1981 -0
  146. package/dist/behaviors/theme.d.mts +15 -8
  147. package/dist/behaviors/theme.mjs +390 -28
  148. package/dist/behaviors/toast.d.mts +24 -25
  149. package/dist/behaviors/toast.mjs +1266 -88
  150. package/dist/behaviors/tooltip.d.mts +4 -0
  151. package/dist/behaviors/tooltip.mjs +378 -0
  152. package/dist/behaviors/tree-select.d.mts +69 -0
  153. package/dist/behaviors/tree-select.mjs +1907 -0
  154. package/dist/behaviors/tree.d.mts +1 -1
  155. package/dist/behaviors/tree.mjs +15 -15
  156. package/dist/behaviors/upload.d.mts +3 -2
  157. package/dist/behaviors/upload.mjs +1076 -66
  158. package/dist/cli.mjs +5 -6
  159. package/dist/components/ai-chat.css +666 -573
  160. package/dist/components/ai-diff.css +153 -132
  161. package/dist/components/ai-panel.css +351 -343
  162. package/dist/components/ai-tool.css +393 -238
  163. package/dist/components/autocomplete.css +61 -0
  164. package/dist/components/autocomplete.mjs +3 -0
  165. package/dist/components/back-top.css +34 -31
  166. package/dist/components/badge.css +44 -41
  167. package/dist/components/breadcrumb.css +67 -46
  168. package/dist/components/btn.css +80 -74
  169. package/dist/components/card.css +117 -106
  170. package/dist/components/cascader.css +311 -0
  171. package/dist/components/cascader.mjs +3 -0
  172. package/dist/components/chart-area.css +8 -2
  173. package/dist/components/chart-bar.css +95 -33
  174. package/dist/components/chart-gauge.css +14 -11
  175. package/dist/components/chart-graph.css +20 -17
  176. package/dist/components/chart-heatmap.css +96 -90
  177. package/dist/components/chart-line.css +8 -3
  178. package/dist/components/chart-pie.css +9 -6
  179. package/dist/components/chart-radar.css +8 -5
  180. package/dist/components/chart-scatter.css +9 -6
  181. package/dist/components/chart-sparkline.css +5 -2
  182. package/dist/components/chart-stack.css +14 -11
  183. package/dist/components/charts.css +164 -73
  184. package/dist/components/code-block.css +418 -0
  185. package/dist/components/code-block.mjs +4 -0
  186. package/dist/components/command-palette.css +138 -117
  187. package/dist/components/content.css +257 -251
  188. package/dist/components/copy.css +72 -44
  189. package/dist/components/datatable.css +423 -181
  190. package/dist/components/date-picker.css +135 -104
  191. package/dist/components/empty.css +68 -65
  192. package/dist/components/feedback.css +201 -183
  193. package/dist/components/form-validate.css +120 -0
  194. package/dist/components/form-validate.mjs +3 -0
  195. package/dist/components/form.css +150 -127
  196. package/dist/components/icon.css +102 -0
  197. package/dist/components/icon.mjs +3 -0
  198. package/dist/components/input.css +159 -104
  199. package/dist/components/kb-agent.css +188 -173
  200. package/dist/components/kb-data.css +257 -253
  201. package/dist/components/kb-ground.css +197 -185
  202. package/dist/components/kb-ingest.css +334 -350
  203. package/dist/components/kb-ops.css +265 -259
  204. package/dist/components/kb-perm.css +260 -271
  205. package/dist/components/kb-search.css +317 -360
  206. package/dist/components/kb.css +120 -109
  207. package/dist/components/layout.css +85 -82
  208. package/dist/components/material-chinese.css +73 -0
  209. package/dist/components/material-soviet.css +76 -0
  210. package/dist/components/material.css +275 -0
  211. package/dist/components/media.css +220 -166
  212. package/dist/components/mentions.css +189 -0
  213. package/dist/components/mentions.mjs +3 -0
  214. package/dist/components/menu.css +113 -105
  215. package/dist/components/modal.css +107 -112
  216. package/dist/components/nav.css +118 -115
  217. package/dist/components/notification.css +238 -174
  218. package/dist/components/pagination.css +56 -53
  219. package/dist/components/panel.css +66 -63
  220. package/dist/components/panel.mjs +1 -0
  221. package/dist/components/pill.css +81 -71
  222. package/dist/components/popover.css +67 -53
  223. package/dist/components/scroll-area.css +113 -110
  224. package/dist/components/segmented.css +146 -143
  225. package/dist/components/select.css +206 -186
  226. package/dist/components/sidebar.css +137 -127
  227. package/dist/components/slider.css +117 -114
  228. package/dist/components/split-pane.css +112 -109
  229. package/dist/components/stat.css +112 -106
  230. package/dist/components/steps.css +109 -103
  231. package/dist/components/switch.css +138 -134
  232. package/dist/components/table.css +131 -107
  233. package/dist/components/tabs.css +114 -108
  234. package/dist/components/tag-input.css +48 -133
  235. package/dist/components/tag.css +81 -71
  236. package/dist/components/theme-switcher.css +105 -0
  237. package/dist/components/theme-switcher.mjs +3 -0
  238. package/dist/components/toast.css +100 -86
  239. package/dist/components/toolbar.css +45 -42
  240. package/dist/components/tooltip.css +102 -43
  241. package/dist/components/tooltip.mjs +1 -0
  242. package/dist/components/tree-select.css +416 -0
  243. package/dist/components/tree-select.mjs +3 -0
  244. package/dist/components/upload.css +135 -92
  245. package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
  246. package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
  247. package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
  248. package/dist/fonts/OFL.txt +96 -0
  249. package/dist/fonts/README.md +14 -0
  250. package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
  251. package/dist/index.d.mts +28 -14
  252. package/dist/index.mjs +20705 -9601
  253. package/dist/react.d.mts +91 -0
  254. package/dist/react.mjs +8208 -0
  255. package/dist/registry.json +130 -13
  256. package/dist/tokens/chinese.css +44 -0
  257. package/dist/tokens/colors.css +365 -1222
  258. package/dist/tokens/design.css +109 -0
  259. package/dist/tokens/dtcg.json +11198 -0
  260. package/dist/tokens/figma.variables.json +7017 -0
  261. package/dist/tokens/icon-masks.css +78 -0
  262. package/dist/tokens/pixel.css +50 -0
  263. package/dist/tokens/soviet.css +44 -0
  264. package/dist/tokens/style-profiles.css +36 -547
  265. package/dist/tokens/themes.json +308 -0
  266. package/dist/tokens/tokens-studio.json +6728 -0
  267. package/dist/tokens/typography.css +21 -18
  268. package/dist/tokens.css +1555 -1801
  269. package/dist/ui.css +11975 -9831
  270. package/dist/vue.d.mts +344 -0
  271. package/dist/vue.mjs +7781 -0
  272. package/docs/spec/ai-input-experience.md +75 -0
  273. package/docs/spec/ai-native.md +238 -147
  274. package/docs/spec/design-philosophy.md +189 -0
  275. package/docs/spec/design-primitives.md +196 -0
  276. package/docs/spec/kb-family.md +147 -115
  277. package/package.json +43 -8
  278. package/dist/retro-effects.css +0 -255
  279. package/dist/tokens/retro-effects.css +0 -255
  280. package/docs/research/2026-10-03-ai-kb-components.md +0 -392
  281. package/docs/research/2026-10-03-kb-permissions.md +0 -992
package/dist/tokens.css CHANGED
@@ -1,1309 +1,401 @@
1
- /* @icen.ai/ui — tokens(colors + style-profiles + typography) */
1
+ /* @icen.ai/ui — tokens + opt-in design materials */
2
+ @layer icen.tokens, icen.base, icen.components;
3
+ @layer icen.tokens {
2
4
 
3
5
  /* ── tokens/colors.css ── */
4
- /*
5
- * Icen Design System — 色彩 Tokens
6
- *
7
- * 6 预设 × 2 模式 = 12 套完整配色
8
- * clay(默认)/ piano / art / vangogh / ink / retro
9
- *
10
- * 每套包含:
11
- * 12 base + 2 glow + 6 derived + 6 semantic + 4 fill + 2 shadow + 3 outline
12
- * + depth 层级(canvas/sidebar/panel/card/control)+ scrollbar + bridge 别名
13
- *
14
- * 用法: import "./colors.css"; —— 挂在 <html> 的 preset 类决定 base 取值,
15
- * .dark 类切换明暗,二者正交组合。
16
- */
17
-
18
- /* ══════════════════════════════════════════════════════════════
19
- CLAY — 温暖纸感 · 陶土橙 + 牛皮纸白
20
- Warm Paper · Clay-Dust Orange × Parchment Cream
21
- ══════════════════════════════════════════════════════════════ */
22
-
23
- :root {
24
- /* ── 12 Base Tokens ── */
25
- --token-bg: #faf9f5;
26
- --token-bg-soft: #f5f3ec;
27
- --token-surface: #ffffff;
28
- --token-surface-strong: #f5f3ec;
29
- --token-line-soft: rgba(43, 41, 38, 0.12);
30
- --token-line: rgba(43, 41, 38, 0.22);
31
- --token-line-strong: rgba(43, 41, 38, 0.38);
32
- --token-text: #1f1e1c;
33
- --token-text-muted: #5e5d58;
34
- --token-text-faint: #9d9b93;
35
- --token-accent: #d97757;
36
- --token-accent-cold: #7a9cb0;
37
- --token-accent-deep: #c6613f;
38
-
39
- /* ── Glow (background radial accents) ── */
40
- --token-glow: rgba(217,119,87,.12);
41
- --token-glow-cold: rgba(122,156,176,.06);
42
-
43
- /* ── Derived ── */
44
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 92%, var(--token-accent) 8%);
45
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 14%, transparent);
46
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 10%, transparent);
47
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
48
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
49
- --token-on-accent: #ffffff;
50
-
51
- /* ── Shadow ── */
52
- --token-shadow-elevated: 0 12px 32px rgba(31, 30, 29, 0.05);
53
- --token-shadow-overlay: 0 18px 44px rgba(31, 30, 29, 0.08);
54
-
55
- /* ── Semantic ── */
56
- --token-success: #3d8a5a;
57
- --token-success-muted: color-mix(in srgb, var(--token-success) 12%, transparent);
58
- --token-warning: #b8860b;
59
- --token-warning-muted: rgba(184,134,11,.12);
60
- --token-error: #c0392b;
61
- --token-error-muted: color-mix(in srgb, var(--token-error) 12%, transparent);
62
- --token-info: #6a8ea0;
63
- --token-info-muted: rgba(106,142,160,.12);
64
-
65
- /* ── Fill Scale (overlay textures) ── */
66
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
67
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
68
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
69
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
70
-
71
- /* ── Surface Glass ── */
72
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 88%, transparent);
73
-
74
- /* ═══════════════════════════════════════════
75
- BRIDGE — legacy component token names
76
- ═══════════════════════════════════════════ */
77
-
78
- /* ── 主色 ── */
79
- --accent-clay: var(--token-accent);
80
- --accent-clay-dark: #c6613f;
81
- --accent-clay-light: #e8a087;
82
- --accent-cold: var(--token-accent-cold);
83
-
84
- /* ── 背景 ── */
85
- --bg-primary: var(--token-bg);
86
- --bg-secondary: var(--token-bg-soft);
87
- --bg-tertiary: var(--token-surface);
88
- --bg-card: #fffdfa;
89
- --bg-card-muted: #f7f0e4;
90
- --bg-panel: var(--token-surface-strong);
91
- --bg-hover: var(--token-surface-hover);
92
-
93
- /* ── 文字 ── */
94
- --text-primary: var(--token-text);
95
- --text-secondary: #383834;
96
- --text-tertiary: var(--token-text-muted);
97
- --text-muted: #87867f;
98
- --text-subtle: var(--token-text-faint);
99
-
100
- /* ── 边框 ── */
101
- --border-subtle: var(--token-line-soft);
102
- --border-default: var(--token-line);
103
- --border-strong: var(--token-line-strong);
104
-
105
- /* ── 阴影 ── */
106
- --shadow-sm: var(--token-shadow-elevated);
107
- --shadow-md: var(--token-shadow-overlay);
108
-
109
- /* ── 语义色 ── */
110
- --color-success: var(--token-success);
111
- --color-success-bg: var(--token-success-muted);
112
- --color-warning: var(--token-warning);
113
- --color-warning-bg: var(--token-warning-muted);
114
- --color-error: var(--token-error);
115
- --color-error-bg: var(--token-error-muted);
116
- --color-info: var(--token-info);
117
- --color-info-bg: var(--token-info-muted);
118
- --color-pending: #87867f;
119
- --color-pending-bg: #f9f9f8;
120
-
121
- /* ── 装饰色 ── */
122
- --accent-clay-bg: color-mix(in srgb, var(--token-accent) 8%, transparent);
123
- --accent-clay-bg-strong: var(--token-accent-subtle);
124
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
125
- }
126
-
127
- /* ── CLAY DARK ── */
128
- .dark {
129
- /* ── 12 Base Tokens ── */
130
- --token-bg: #171410;
131
- --token-bg-soft: #211d19;
132
- --token-surface: #2a2520;
133
- --token-surface-strong: #302b25;
134
- --token-line-soft: #3b352f;
135
- --token-line: #4c433b;
136
- --token-line-strong: #5e5349;
137
- --token-text: #f5f4f0;
138
- --token-text-muted: #a8a6a0;
139
- --token-text-faint: #6a6863;
140
- --token-accent: #e08a68;
141
- --token-accent-cold: #7aa0b8;
142
-
143
- /* ── Glow ── */
144
- --token-glow: rgba(224,138,104,.10);
145
- --token-glow-cold: rgba(122,160,184,.05);
146
-
147
- /* ── Derived ── */
148
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 90%, var(--token-accent) 10%);
149
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
150
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
151
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
152
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
153
- --token-on-accent: #ffffff;
154
-
155
- /* ── Shadow ── */
156
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.18), 0 4px 12px rgba(0,0,0,.16);
157
- --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.22), 0 8px 24px rgba(0,0,0,.26);
158
-
159
- /* ── Semantic ── */
160
- --token-success: #8fbfaa;
161
- --token-success-muted: rgba(143,191,170,.15);
162
- --token-warning: #d4a520;
163
- --token-warning-muted: rgba(212,165,32,.15);
164
- --token-error: #d46a45;
165
- --token-error-muted: rgba(212,106,69,.15);
166
- --token-info: #6a9ab8;
167
- --token-info-muted: rgba(106,154,184,.15);
168
-
169
- /* ── Fill ── */
170
- --token-fill-1: color-mix(in srgb, var(--token-text) 5%, transparent);
171
- --token-fill-2: color-mix(in srgb, var(--token-text) 10%, transparent);
172
- --token-fill-3: color-mix(in srgb, var(--token-text) 16%, transparent);
173
- --token-fill-4: color-mix(in srgb, var(--token-text) 24%, transparent);
174
-
175
- /* ── Surface Glass ── */
176
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
177
-
178
- /* ── BRIDGE ── */
179
- --accent-clay: var(--token-accent);
180
- --accent-clay-dark: #d47a57;
181
- --accent-clay-light: #eba38a;
182
- --accent-cold: var(--token-accent-cold);
183
- --bg-primary: var(--token-bg);
184
- --bg-secondary: var(--token-bg-soft);
185
- --bg-tertiary: var(--token-surface);
186
- --bg-card: #221f1b;
187
- --bg-card-muted: #26221d;
188
- --bg-panel: var(--token-surface-strong);
189
- --bg-hover: var(--token-surface-hover);
190
- --text-primary: var(--token-text);
191
- --text-secondary: #d4d3ce;
192
- --text-tertiary: var(--token-text-muted);
193
- --text-muted: #7a7872;
194
- --text-subtle: var(--token-text-faint);
195
- --border-subtle: var(--token-line-soft);
196
- --border-default: var(--token-line);
197
- --border-strong: var(--token-line-strong);
198
- --shadow-sm: var(--token-shadow-elevated);
199
- --shadow-md: var(--token-shadow-overlay);
200
- --color-success: var(--token-success);
201
- --color-success-bg: var(--token-success-muted);
202
- --color-warning: var(--token-warning);
203
- --color-warning-bg: var(--token-warning-muted);
204
- --color-error: var(--token-error);
205
- --color-error-bg: var(--token-error-muted);
206
- --color-info: var(--token-info);
207
- --color-info-bg: var(--token-info-muted);
208
- --color-pending: #7a7872;
209
- --color-pending-bg: #222120;
210
- --accent-clay-bg: color-mix(in srgb, var(--token-accent) 8%, transparent);
211
- --accent-clay-bg-strong: var(--token-accent-subtle);
212
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
213
- }
214
-
215
- /* ══════════════════════════════════════════════════════════════
216
- PIANO — 象牙琴键 · 乌木黑键 · 大漆光泽
217
- Piano Keys · Ivory × Ebony Lacquer · Brass Nameplate
218
- ══════════════════════════════════════════════════════════════ */
219
-
220
- .piano {
221
- /* ── 12 Base Tokens ── */
222
- --token-bg: #f1eee6;
223
- --token-bg-soft: #e5dfd2;
224
- --token-surface: #faf8f2;
225
- --token-surface-strong: #eee8db;
226
- --token-line-soft: #d2cab9;
227
- --token-line: #b8ad9a;
228
- --token-line-strong: #8f8578;
229
- --token-text: #11100e;
230
- --token-text-muted: #4e4b45;
231
- --token-text-faint: #8b857b;
232
- --token-accent: #b89145;
233
- --token-accent-cold: #566370;
234
-
235
- /* ── Glow ── */
236
- --token-glow: rgba(184,145,69,.12);
237
- --token-glow-cold: rgba(22,24,26,.05);
238
-
239
- /* ── Derived ── */
240
- --token-surface-hover: color-mix(in srgb, var(--token-surface-strong) 88%, var(--token-accent) 12%);
241
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 14%, transparent);
242
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 10%, transparent);
243
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
244
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
245
- --token-on-accent: #12100b;
246
-
247
- /* ── Shadow · 漆面冷反光 ── */
248
- --token-shadow-elevated: 0 1px 2px rgba(17,16,14,.06), 0 7px 20px rgba(17,16,14,.08);
249
- --token-shadow-overlay: 0 2px 5px rgba(17,16,14,.10), 0 16px 42px rgba(17,16,14,.16);
250
-
251
- /* ── Semantic ── */
252
- --token-success: #5a9e7a;
253
- --token-success-muted: rgba(90,158,122,.10);
254
- --token-warning: #b89145;
255
- --token-warning-muted: rgba(184,145,69,.12);
256
- --token-error: #a84a42;
257
- --token-error-muted: rgba(168,74,66,.10);
258
- --token-info: #5a7488;
259
- --token-info-muted: rgba(90,116,136,.10);
260
-
261
- /* ── Fill ── */
262
- --token-fill-1: color-mix(in srgb, var(--token-text) 3%, transparent);
263
- --token-fill-2: color-mix(in srgb, var(--token-text) 6%, transparent);
264
- --token-fill-3: color-mix(in srgb, var(--token-text) 10%, transparent);
265
- --token-fill-4: color-mix(in srgb, var(--token-text) 16%, transparent);
266
-
267
- /* ── Surface Glass ── */
268
- --token-surface-glass: color-mix(in srgb, var(--token-surface) 86%, transparent);
269
-
270
- /* ── BRIDGE ── */
271
- --accent-clay: var(--token-accent);
272
- --accent-clay-dark: #967333;
273
- --accent-clay-light: #d2b36f;
274
- --accent-cold: var(--token-accent-cold);
275
- --bg-primary: var(--token-bg);
276
- --bg-secondary: var(--token-bg-soft);
277
- --bg-tertiary: var(--token-surface);
278
- --bg-card: var(--token-surface);
279
- --bg-card-muted: var(--token-bg-soft);
280
- --bg-panel: var(--token-surface-strong);
281
- --bg-hover: var(--token-surface-hover);
282
- --text-primary: var(--token-text);
283
- --text-secondary: #2e2b27;
284
- --text-tertiary: var(--token-text-muted);
285
- --text-muted: #8b857b;
286
- --text-subtle: var(--token-text-faint);
287
- --border-subtle: var(--token-line-soft);
288
- --border-default: var(--token-line);
289
- --border-strong: var(--token-line-strong);
290
- --shadow-sm: var(--token-shadow-elevated);
291
- --shadow-md: var(--token-shadow-overlay);
292
- --color-success: var(--token-success);
293
- --color-success-bg: var(--token-success-muted);
294
- --color-warning: var(--token-warning);
295
- --color-warning-bg: var(--token-warning-muted);
296
- --color-error: var(--token-error);
297
- --color-error-bg: var(--token-error-muted);
298
- --color-info: var(--token-info);
299
- --color-info-bg: var(--token-info-muted);
300
- --color-pending: #8b857b;
301
- --color-pending-bg: var(--token-bg-soft);
302
- --accent-clay-bg: var(--token-accent-subtle);
303
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 20%, transparent);
304
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
305
- }
306
-
307
- /* ── PIANO DARK ── */
308
- .piano.dark {
309
- /* ── 12 Base Tokens ── */
310
- --token-bg: #090909;
311
- --token-bg-soft: #11100f;
312
- --token-surface: #1a1917;
313
- --token-surface-strong: #24221f;
314
- --token-line-soft: #2f2c27;
315
- --token-line: #463f34;
316
- --token-line-strong: #685b45;
317
- --token-text: #f6f1e7;
318
- --token-text-muted: #b7afa2;
319
- --token-text-faint: #736b60;
320
- --token-accent: #d6b567;
321
- --token-accent-cold: #7c8a94;
322
-
323
- /* ── Glow ── */
324
- --token-glow: rgba(214,181,103,.14);
325
- --token-glow-cold: rgba(210,220,225,.04);
326
-
327
- /* ── Derived ── */
328
- --token-surface-hover: color-mix(in srgb, var(--token-surface-strong) 88%, var(--token-accent) 12%);
329
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
330
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
331
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
332
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 95%, transparent);
333
- --token-on-accent: #0a0a0a;
334
-
335
- /* ── Shadow ── */
336
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.28), 0 10px 26px rgba(0,0,0,.34);
337
- --token-shadow-overlay: 0 2px 5px rgba(0,0,0,.34), 0 18px 46px rgba(0,0,0,.46);
338
-
339
- /* ── Semantic ── */
340
- --token-success: #7ac09a;
341
- --token-success-muted: rgba(122,192,154,.12);
342
- --token-warning: #d6b567;
343
- --token-warning-muted: rgba(214,181,103,.13);
344
- --token-error: #d07668;
345
- --token-error-muted: rgba(208,118,104,.12);
346
- --token-info: #7293aa;
347
- --token-info-muted: rgba(114,147,170,.12);
348
-
349
- /* ── Fill ── */
350
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
351
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
352
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
353
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
354
-
355
- /* ── Surface Glass ── */
356
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
357
-
358
- /* ── BRIDGE ── */
359
- --accent-clay: var(--token-accent);
360
- --accent-clay-dark: #b8954b;
361
- --accent-clay-light: #e7cf8b;
362
- --accent-cold: var(--token-accent-cold);
363
- --bg-primary: var(--token-bg);
364
- --bg-secondary: var(--token-bg-soft);
365
- --bg-tertiary: var(--token-surface);
366
- --bg-card: var(--token-bg-soft);
367
- --bg-card-muted: var(--token-surface);
368
- --bg-panel: var(--token-surface-strong);
369
- --bg-hover: var(--token-surface-hover);
370
- --text-primary: var(--token-text);
371
- --text-secondary: #d8d0c2;
372
- --text-tertiary: var(--token-text-muted);
373
- --text-muted: var(--token-text-faint);
374
- --text-subtle: var(--token-text-faint);
375
- --border-subtle: var(--token-line-soft);
376
- --border-default: var(--token-line);
377
- --border-strong: var(--token-line-strong);
378
- --shadow-sm: var(--token-shadow-elevated);
379
- --shadow-md: var(--token-shadow-overlay);
380
- --color-success: var(--token-success);
381
- --color-success-bg: var(--token-success-muted);
382
- --color-warning: var(--token-warning);
383
- --color-warning-bg: var(--token-warning-muted);
384
- --color-error: var(--token-error);
385
- --color-error-bg: var(--token-error-muted);
386
- --color-info: var(--token-info);
387
- --color-info-bg: var(--token-info-muted);
388
- --color-pending: var(--token-text-faint);
389
- --color-pending-bg: var(--token-bg-soft);
390
- --accent-clay-bg: var(--token-accent-subtle);
391
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 16%, transparent);
392
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
393
- }
394
-
395
- /* ══════════════════════════════════════════════════════════════
396
- ART — 莫奈 · 日出印象 + 睡莲
397
- Monet · Impression, Sunrise × Water Lilies
398
- ══════════════════════════════════════════════════════════════ */
399
-
400
- /* ── ART LIGHT · 日出印象 (Claude Monet, 1872) ── */
401
- .art {
402
- /* 勒阿弗尔晨雾 · 日出橙红 · 港湾青灰 */
403
- --token-bg: #dce8e3;
404
- --token-bg-soft: #ccdcd6;
405
- --token-surface: #edf3ee;
406
- --token-surface-strong: #d8e6df;
407
- --token-line-soft: #b7c9c1;
408
- --token-line: #96aaa2;
409
- --token-line-strong: #718980;
410
- --token-text: #172226;
411
- --token-text-muted: #445553;
412
- --token-text-faint: #768985;
413
- --token-accent: #d66f4f;
414
- --token-accent-cold: #4f8f90;
415
-
416
- /* ── Glow · 雾霭橙光 ── */
417
- --token-glow: rgba(214,111,79,.12);
418
- --token-glow-cold: rgba(79,143,144,.07);
419
-
420
- /* ── Derived ── */
421
- --token-surface-hover: color-mix(in srgb, var(--token-surface-strong) 88%, var(--token-accent) 12%);
422
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
423
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
424
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
425
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
426
- --token-on-accent: #ffffff;
427
-
428
- --token-shadow-elevated: 0 1px 2px rgba(23,34,38,.05), 0 6px 18px rgba(23,34,38,.08);
429
- --token-shadow-overlay: 0 2px 5px rgba(23,34,38,.08), 0 12px 32px rgba(23,34,38,.12);
430
-
431
- --token-success: #5a8c6e;
432
- --token-success-muted: rgba(90,140,110,.10);
433
- --token-warning: #b67933;
434
- --token-warning-muted: rgba(182,121,51,.11);
435
- --token-error: #b95e52;
436
- --token-error-muted: rgba(185,94,82,.11);
437
- --token-info: #568aa0;
438
- --token-info-muted: rgba(86,138,160,.11);
439
-
440
- --token-fill-1: color-mix(in srgb, var(--token-text) 3%, transparent);
441
- --token-fill-2: color-mix(in srgb, var(--token-text) 6%, transparent);
442
- --token-fill-3: color-mix(in srgb, var(--token-text) 10%, transparent);
443
- --token-fill-4: color-mix(in srgb, var(--token-text) 16%, transparent);
444
-
445
- --token-surface-glass: color-mix(in srgb, var(--token-bg) 84%, transparent);
446
-
447
- /* ── BRIDGE ── */
448
- --accent-clay: var(--token-accent);
449
- --accent-clay-dark: #b95a3c;
450
- --accent-clay-light: #e69a82;
451
- --accent-cold: var(--token-accent-cold);
452
- --bg-primary: var(--token-bg);
453
- --bg-secondary: var(--token-bg-soft);
454
- --bg-tertiary: var(--token-surface);
455
- --bg-card: var(--token-surface);
456
- --bg-card-muted: var(--token-bg-soft);
457
- --bg-panel: var(--token-surface-strong);
458
- --bg-hover: var(--token-surface-hover);
459
- --text-primary: var(--token-text);
460
- --text-secondary: var(--token-text-muted);
461
- --text-tertiary: #556864;
462
- --text-muted: var(--token-text-faint);
463
- --text-subtle: var(--token-line-strong);
464
- --border-subtle: var(--token-line-soft);
465
- --border-default: var(--token-line);
466
- --border-strong: var(--token-line-strong);
467
- --shadow-sm: var(--token-shadow-elevated);
468
- --shadow-md: var(--token-shadow-overlay);
469
- --color-success: var(--token-success);
470
- --color-success-bg: var(--token-success-muted);
471
- --color-warning: var(--token-warning);
472
- --color-warning-bg: var(--token-warning-muted);
473
- --color-error: var(--token-error);
474
- --color-error-bg: var(--token-error-muted);
475
- --color-info: var(--token-info);
476
- --color-info-bg: var(--token-info-muted);
477
- --color-pending: var(--token-text-faint);
478
- --color-pending-bg: var(--token-fill-1);
479
- --accent-clay-bg: var(--token-accent-subtle);
480
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
481
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 20%, transparent);
482
- }
483
-
484
- /* ── ART DARK · 莫奈睡莲 (Water Lilies) ── */
485
- .art.dark {
486
- /* 睡莲池水 · 暮色蓝绿 · 莲粉紫影 */
487
- --token-bg: #172521;
488
- --token-bg-soft: #1d312c;
489
- --token-surface: #263d37;
490
- --token-surface-strong: #304a42;
491
- --token-line-soft: #35554c;
492
- --token-line: #4c7167;
493
- --token-line-strong: #659082;
494
- --token-text: #edf1e8;
495
- --token-text-muted: #c1cabd;
496
- --token-text-faint: #7f9188;
497
- --token-accent: #d59ab1;
498
- --token-accent-cold: #78aaa2;
499
-
500
- /* ── Glow · 池面粉紫和水光 ── */
501
- --token-glow: rgba(213,154,177,.10);
502
- --token-glow-cold: rgba(120,170,162,.10);
503
-
504
- /* ── Derived ── */
505
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 86%, var(--token-accent-cold) 14%);
506
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
507
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
508
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
509
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
510
- /* 睡莲粉 accent 上的文字色:深绿灰(白字在 #d59ab1 上对比度不达标) */
511
- --token-on-accent: #26302b;
512
-
513
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.18), 0 8px 22px rgba(0,0,0,.24);
514
- --token-shadow-overlay: 0 2px 5px rgba(0,0,0,.24), 0 14px 36px rgba(0,0,0,.32);
515
-
516
- --token-success: #5ab88a;
517
- --token-success-muted: rgba(90,184,138,.12);
518
- --token-warning: #c5aa68;
519
- --token-warning-muted: rgba(197,170,104,.12);
520
- --token-error: #d1847e;
521
- --token-error-muted: rgba(209,132,126,.12);
522
- --token-info: #78aaa2;
523
- --token-info-muted: rgba(120,170,162,.12);
524
-
525
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
526
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
527
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
528
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
529
-
530
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
531
-
532
- /* ── BRIDGE ── */
533
- --accent-clay: var(--token-accent);
534
- --accent-clay-dark: #bc7f9a;
535
- --accent-clay-light: #e4b7ca;
536
- --accent-cold: var(--token-accent-cold);
537
- --bg-primary: var(--token-bg);
538
- --bg-secondary: var(--token-bg-soft);
539
- --bg-tertiary: var(--token-surface);
540
- --bg-card: var(--token-bg-soft);
541
- --bg-card-muted: var(--token-surface);
542
- --bg-panel: var(--token-surface-strong);
543
- --bg-hover: var(--token-surface-hover);
544
- --text-primary: var(--token-text);
545
- --text-secondary: var(--token-text-muted);
546
- --text-tertiary: #a5b1aa;
547
- --text-muted: var(--token-text-faint);
548
- --text-subtle: var(--token-line-strong);
549
- --border-subtle: var(--token-line-soft);
550
- --border-default: var(--token-line);
551
- --border-strong: var(--token-line-strong);
552
- --shadow-sm: var(--token-shadow-elevated);
553
- --shadow-md: var(--token-shadow-overlay);
554
- --color-success: var(--token-success);
555
- --color-success-bg: var(--token-success-muted);
556
- --color-warning: var(--token-warning);
557
- --color-warning-bg: var(--token-warning-muted);
558
- --color-error: var(--token-error);
559
- --color-error-bg: var(--token-error-muted);
560
- --color-info: var(--token-info);
561
- --color-info-bg: var(--token-info-muted);
562
- --color-pending: var(--token-text-faint);
563
- --color-pending-bg: var(--token-fill-1);
564
- --accent-clay-bg: var(--token-accent-subtle);
565
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
566
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
567
- }
568
-
569
- /* ══════════════════════════════════════════════════════════════
570
- VANGOGH — 麦田鸦群 + 星空
571
- Van Gogh · Wheatfield × Starry Night
572
- ══════════════════════════════════════════════════════════════ */
573
-
574
- /* ── VANGOGH LIGHT · 麦田鸦群 ── */
575
- .vangogh {
576
- /* 干麦秆画布 · 麦浪金 · 普鲁士蓝阴影 */
577
- --token-bg: #e8ddb2;
578
- --token-bg-soft: #d5c58f;
579
- --token-surface: #f2e8bd;
580
- --token-surface-strong: #decb85;
581
- --token-line-soft: #c0ad6e;
582
- --token-line: #9f8b53;
583
- --token-line-strong: #70623f;
584
- --token-text: #1f241b;
585
- --token-text-muted: #4a5138;
586
- --token-text-faint: #767b57;
587
- --token-accent: #1f527c;
588
- --token-accent-cold: #476f45;
589
-
590
- --token-glow: rgba(31,82,124,.09);
591
- --token-glow-cold: rgba(71,111,69,.07);
592
-
593
- --token-surface-hover: color-mix(in srgb, var(--token-surface-strong) 90%, var(--token-accent) 10%);
594
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 10%, transparent);
595
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 7%, transparent);
596
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
597
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
598
- --token-on-accent: #fff3c5;
599
-
600
- --token-shadow-elevated: 0 1px 2px rgba(31,36,27,.06), 0 7px 20px rgba(31,36,27,.10);
601
- --token-shadow-overlay: 0 2px 5px rgba(31,36,27,.09), 0 16px 40px rgba(31,36,27,.15);
602
-
603
- --token-success: #3f7d50;
604
- --token-success-muted: rgba(63,125,80,.12);
605
- --token-warning: #a97824;
606
- --token-warning-muted: rgba(169,120,36,.12);
607
- --token-error: #9c513a;
608
- --token-error-muted: rgba(156,81,58,.11);
609
- --token-info: #2d638e;
610
- --token-info-muted: rgba(45,99,142,.11);
611
-
612
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
613
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
614
- --token-fill-3: color-mix(in srgb, var(--token-text) 13%, transparent);
615
- --token-fill-4: color-mix(in srgb, var(--token-text) 20%, transparent);
616
-
617
- --token-surface-glass: color-mix(in srgb, var(--token-surface) 82%, transparent);
618
-
619
- /* ── BRIDGE ── */
620
- --accent-clay: var(--token-accent);
621
- --accent-clay-dark: #173f64;
622
- --accent-clay-light: #5b82a6;
623
- --accent-cold: var(--token-accent-cold);
624
- --bg-primary: var(--token-bg);
625
- --bg-secondary: var(--token-bg-soft);
626
- --bg-tertiary: var(--token-surface);
627
- --bg-card: var(--token-surface);
628
- --bg-card-muted: var(--token-bg-soft);
629
- --bg-panel: var(--token-surface-strong);
630
- --bg-hover: var(--token-surface-hover);
631
- --text-primary: var(--token-text);
632
- --text-secondary: var(--token-text-muted);
633
- --text-tertiary: #606847;
634
- --text-muted: var(--token-text-faint);
635
- --text-subtle: var(--token-line-strong);
636
- --border-subtle: var(--token-line-soft);
637
- --border-default: var(--token-line);
638
- --border-strong: var(--token-line-strong);
639
- --shadow-sm: var(--token-shadow-elevated);
640
- --shadow-md: var(--token-shadow-overlay);
641
- --color-success: var(--token-success);
642
- --color-success-bg: var(--token-success-muted);
643
- --color-warning: var(--token-warning);
644
- --color-warning-bg: var(--token-warning-muted);
645
- --color-error: var(--token-error);
646
- --color-error-bg: var(--token-error-muted);
647
- --color-info: var(--token-info);
648
- --color-info-bg: var(--token-info-muted);
649
- --color-pending: var(--token-text-faint);
650
- --color-pending-bg: var(--token-fill-1);
651
- --accent-clay-bg: var(--token-accent-subtle);
652
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 16%, transparent);
653
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
654
- }
655
-
656
- /* ── VANGOGH DARK · 星空 ── */
657
- .vangogh.dark {
658
- /* 钴蓝夜空 · 漩涡青蓝 · 星点暖黄 */
659
- --token-bg: #0f1b2e;
660
- --token-bg-soft: #142440;
661
- --token-surface: #1a3050;
662
- --token-surface-strong: #223a60;
663
- --token-line-soft: #1c3455;
664
- --token-line: #2a4a75;
665
- --token-line-strong: #3a5a8a;
666
- --token-text: #f0ece0;
667
- --token-text-muted: #c0bcb0;
668
- --token-text-faint: #77728b;
669
- --token-accent: #e8c840;
670
- --token-accent-cold: #4a98b8;
671
-
672
- --token-glow: rgba(232,200,64,.12);
673
- --token-glow-cold: rgba(74,152,184,.08);
674
-
675
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 88%, var(--token-accent) 12%);
676
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 10%, transparent);
677
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 6%, transparent);
678
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
679
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
680
- --token-on-accent: #101824;
681
-
682
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.14), 0 4px 12px rgba(0,0,0,.20);
683
- --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.18), 0 8px 24px rgba(0,0,0,.28);
684
-
685
- --token-success: #5ab88a;
686
- --token-success-muted: rgba(90,184,138,.12);
687
- --token-warning: #d4a028;
688
- --token-warning-muted: rgba(212,160,40,.12);
689
- --token-error: #d06060;
690
- --token-error-muted: rgba(208,96,96,.12);
691
- --token-info: #6090c0;
692
- --token-info-muted: rgba(96,144,192,.12);
693
-
694
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
695
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
696
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
697
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
698
-
699
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
700
-
701
- /* ── BRIDGE ── */
702
- --accent-clay: var(--token-accent);
703
- --accent-clay-dark: #c8a830;
704
- --accent-clay-light: #f0e070;
705
- --accent-cold: var(--token-accent-cold);
706
- --bg-primary: var(--token-bg);
707
- --bg-secondary: var(--token-bg-soft);
708
- --bg-tertiary: var(--token-surface);
709
- --bg-card: var(--token-bg-soft);
710
- --bg-card-muted: var(--token-surface);
711
- --bg-panel: var(--token-surface-strong);
712
- --bg-hover: var(--token-surface-hover);
713
- --text-primary: var(--token-text);
714
- --text-secondary: var(--token-text-muted);
715
- --text-tertiary: #a0a098;
716
- --text-muted: var(--token-text-faint);
717
- --text-subtle: var(--token-line-strong);
718
- --border-subtle: var(--token-line-soft);
719
- --border-default: var(--token-line);
720
- --border-strong: var(--token-line-strong);
721
- --shadow-sm: var(--token-shadow-elevated);
722
- --shadow-md: var(--token-shadow-overlay);
723
- --color-success: var(--token-success);
724
- --color-success-bg: var(--token-success-muted);
725
- --color-warning: var(--token-warning);
726
- --color-warning-bg: var(--token-warning-muted);
727
- --color-error: var(--token-error);
728
- --color-error-bg: var(--token-error-muted);
729
- --color-info: var(--token-info);
730
- --color-info-bg: var(--token-info-muted);
731
- --color-pending: var(--token-text-faint);
732
- --color-pending-bg: var(--token-fill-1);
733
- --accent-clay-bg: var(--token-accent-subtle);
734
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
735
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
736
- }
737
-
738
- /* ══════════════════════════════════════════════════════════════
739
- INK — 水墨纸砚 · 松烟翠
740
- Sumi Ink · Rice Paper × Pine-Soot Green
741
- ══════════════════════════════════════════════════════════════ */
742
-
743
- /* ── INK LIGHT · 宣纸水墨 ── */
744
- .ink {
745
- /* 宣纸白底 · 墨灰 · 松烟绿 accent */
746
- --token-bg: #F5F2ED;
747
- --token-bg-soft: #EDE9E2;
748
- --token-surface: #E8E4DC;
749
- --token-surface-strong: #E0DBD2;
750
- --token-line-soft: #D4CFC6;
751
- --token-line: #B8B2A8;
752
- --token-line-strong: #969088;
753
- --token-text: #1A1816;
754
- --token-text-muted: #5C5854;
755
- --token-text-faint: #969088;
756
- --token-accent: #5B7A5E;
757
- --token-accent-cold: #6B7E8A;
758
-
759
- --token-glow: rgba(91,122,94,.08);
760
- --token-glow-cold: rgba(107,126,138,.04);
761
-
762
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 94%, var(--token-accent) 6%);
763
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 10%, transparent);
764
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 6%, transparent);
765
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
766
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
767
- --token-on-accent: #ffffff;
768
-
769
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.04), 0 4px 14px rgba(0,0,0,.06);
770
- --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.06), 0 10px 28px rgba(0,0,0,.08);
771
-
772
- --token-success: #5A8E6A;
773
- --token-success-muted: rgba(90,142,106,.10);
774
- --token-warning: #9A7A3A;
775
- --token-warning-muted: rgba(154,122,58,.10);
776
- --token-error: #A05048;
777
- --token-error-muted: rgba(160,80,72,.10);
778
- --token-info: #5A7890;
779
- --token-info-muted: rgba(90,120,144,.10);
780
-
781
- --token-fill-1: color-mix(in srgb, var(--token-text) 3%, transparent);
782
- --token-fill-2: color-mix(in srgb, var(--token-text) 6%, transparent);
783
- --token-fill-3: color-mix(in srgb, var(--token-text) 10%, transparent);
784
- --token-fill-4: color-mix(in srgb, var(--token-text) 16%, transparent);
785
-
786
- --token-surface-glass: color-mix(in srgb, var(--token-bg) 86%, transparent);
787
-
788
- /* ── BRIDGE ── */
789
- --accent-clay: var(--token-accent);
790
- --accent-clay-dark: #4A6A4E;
791
- --accent-clay-light: #8AA88E;
792
- --accent-cold: var(--token-accent-cold);
793
- --bg-primary: var(--token-bg);
794
- --bg-secondary: var(--token-bg-soft);
795
- --bg-tertiary: var(--token-surface);
796
- --bg-card: #FCFAF7;
797
- --bg-card-muted: var(--token-bg-soft);
798
- --bg-panel: var(--token-surface-strong);
799
- --bg-hover: var(--token-surface-hover);
800
- --text-primary: var(--token-text);
801
- --text-secondary: var(--token-text-muted);
802
- --text-tertiary: #7A7672;
803
- --text-muted: var(--token-text-faint);
804
- --text-subtle: var(--token-line-strong);
805
- --border-subtle: var(--token-line-soft);
806
- --border-default: var(--token-line);
807
- --border-strong: var(--token-line-strong);
808
- --shadow-sm: var(--token-shadow-elevated);
809
- --shadow-md: var(--token-shadow-overlay);
810
- --color-success: var(--token-success);
811
- --color-success-bg: var(--token-success-muted);
812
- --color-warning: var(--token-warning);
813
- --color-warning-bg: var(--token-warning-muted);
814
- --color-error: var(--token-error);
815
- --color-error-bg: var(--token-error-muted);
816
- --color-info: var(--token-info);
817
- --color-info-bg: var(--token-info-muted);
818
- --color-pending: var(--token-text-faint);
819
- --color-pending-bg: var(--token-fill-1);
820
- --accent-clay-bg: var(--token-accent-subtle);
821
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
822
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 20%, transparent);
823
- }
824
-
825
- /* ── INK DARK · 夜墨松烟 ── */
826
- .ink.dark {
827
- /* 墨色夜空 · 松烟暗绿 · 冷灰星点 */
828
- --token-bg: #131815;
829
- --token-bg-soft: #1A201D;
830
- --token-surface: #212824;
831
- --token-surface-strong: #28302B;
832
- --token-line-soft: #2A322D;
833
- --token-line: #3A423D;
834
- --token-line-strong: #4A524D;
835
- --token-text: #F0EEE8;
836
- --token-text-muted: #B0AEAA;
837
- --token-text-faint: #74726e;
838
- --token-accent: #7AA87E;
839
- --token-accent-cold: #6A8EA0;
840
-
841
- --token-glow: rgba(122,168,126,.10);
842
- --token-glow-cold: rgba(106,142,160,.05);
843
-
844
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 90%, var(--token-accent) 10%);
845
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 10%, transparent);
846
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 6%, transparent);
847
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
848
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
849
- /* 松烟绿 accent 上的文字色:深墨(白字在 #7AA87E 上对比度不达标) */
850
- --token-on-accent: #1a2018;
851
-
852
- --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.2), 0 4px 14px rgba(0,0,0,.22);
853
- --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.28), 0 10px 30px rgba(0,0,0,.34);
854
-
855
- --token-success: #6AB080;
856
- --token-success-muted: rgba(106,176,128,.12);
857
- --token-warning: #B89A45;
858
- --token-warning-muted: rgba(184,154,69,.12);
859
- --token-error: #C06860;
860
- --token-error-muted: rgba(192,104,96,.12);
861
- --token-info: #6A98B8;
862
- --token-info-muted: rgba(106,152,184,.12);
863
-
864
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
865
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
866
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
867
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
868
-
869
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
870
-
871
- /* ── BRIDGE ── */
872
- --accent-clay: var(--token-accent);
873
- --accent-clay-dark: #5A8A62;
874
- --accent-clay-light: #A0CAA4;
875
- --accent-cold: var(--token-accent-cold);
876
- --bg-primary: var(--token-bg);
877
- --bg-secondary: var(--token-bg-soft);
878
- --bg-tertiary: var(--token-surface);
879
- --bg-card: var(--token-bg-soft);
880
- --bg-card-muted: var(--token-surface);
881
- --bg-panel: var(--token-surface-strong);
882
- --bg-hover: var(--token-surface-hover);
883
- --text-primary: var(--token-text);
884
- --text-secondary: var(--token-text-muted);
885
- --text-tertiary: #989692;
886
- --text-muted: var(--token-text-faint);
887
- --text-subtle: var(--token-line-strong);
888
- --border-subtle: var(--token-line-soft);
889
- --border-default: var(--token-line);
890
- --border-strong: var(--token-line-strong);
891
- --shadow-sm: var(--token-shadow-elevated);
892
- --shadow-md: var(--token-shadow-overlay);
893
- --color-success: var(--token-success);
894
- --color-success-bg: var(--token-success-muted);
895
- --color-warning: var(--token-warning);
896
- --color-warning-bg: var(--token-warning-muted);
897
- --color-error: var(--token-error);
898
- --color-error-bg: var(--token-error-muted);
899
- --color-info: var(--token-info);
900
- --color-info-bg: var(--token-info-muted);
901
- --color-pending: var(--token-text-faint);
902
- --color-pending-bg: var(--token-fill-1);
903
- --accent-clay-bg: var(--token-accent-subtle);
904
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 14%, transparent);
905
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 22%, transparent);
906
- }
907
-
908
- /* ══════════════════════════════════════════════════════════════
909
- RETRO — 8-bit · 红白机 · 像素风
910
- NES · Famicom · Pixel Art · CRT Glow
911
- ══════════════════════════════════════════════════════════════ */
912
-
913
- /* ── RETRO LIGHT · 经典像素 ── */
914
- .retro {
915
- /* 像素风配色:纯白底 + 经典红 + 深蓝 */
916
- --token-bg: #f0f0e8;
917
- --token-bg-soft: #e0e0d0;
918
- --token-surface: #e8e8dc;
919
- --token-surface-strong: #dcdcc8;
920
- --token-line-soft: #c0c0a8;
921
- --token-line: #a0a088;
922
- --token-line-strong: #808068;
923
- --token-text: #1a1a1a;
924
- --token-text-muted: #4a4a3a;
925
- --token-text-faint: #7a7a6a;
926
- --token-accent: #d03030;
927
- --token-accent-cold: #3030a0;
928
-
929
- /* ── Glow ── */
930
- --token-glow: rgba(208,48,48,.10);
931
- --token-glow-cold: rgba(48,48,160,.08);
932
-
933
- /* ── Derived ── */
934
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 90%, var(--token-accent) 10%);
935
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 12%, transparent);
936
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
937
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 55%, transparent);
938
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
939
- --token-on-accent: #ffffff;
940
-
941
- /* ── Shadow · 硬像素投影 ── */
942
- --token-shadow-elevated: 2px 2px 0 rgba(26,26,26,.25);
943
- --token-shadow-overlay: 3px 3px 0 rgba(26,26,26,.35);
944
-
945
- /* ── Semantic ── */
946
- --token-success: #30a030;
947
- --token-success-muted: rgba(48,160,48,.14);
948
- --token-warning: #c8a020;
949
- --token-warning-muted: rgba(200,160,32,.14);
950
- --token-error: #d03030;
951
- --token-error-muted: rgba(208,48,48,.14);
952
- --token-info: #3030a0;
953
- --token-info-muted: rgba(48,48,160,.14);
954
-
955
- /* ── Fill ── */
956
- --token-fill-1: color-mix(in srgb, var(--token-text) 4%, transparent);
957
- --token-fill-2: color-mix(in srgb, var(--token-text) 8%, transparent);
958
- --token-fill-3: color-mix(in srgb, var(--token-text) 14%, transparent);
959
- --token-fill-4: color-mix(in srgb, var(--token-text) 22%, transparent);
960
-
961
- /* ── Glass ── */
962
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 88%, transparent);
963
-
964
- /* ── BRIDGE ── */
965
- --accent-clay: var(--token-accent);
966
- --accent-clay-dark: #a02020;
967
- --accent-clay-light: #e06060;
968
- --accent-cold: var(--token-accent-cold);
969
- --bg-primary: var(--token-bg);
970
- --bg-secondary: var(--token-bg-soft);
971
- --bg-tertiary: var(--token-surface);
972
- --bg-card: var(--token-surface);
973
- --bg-card-muted: var(--token-bg-soft);
974
- --bg-panel: var(--token-surface-strong);
975
- --bg-hover: var(--token-surface-hover);
976
- --text-primary: var(--token-text);
977
- --text-secondary: var(--token-text-muted);
978
- --text-tertiary: #5a5a4a;
979
- --text-muted: var(--token-text-faint);
980
- --text-subtle: var(--token-line-strong);
981
- --border-subtle: var(--token-line-soft);
982
- --border-default: var(--token-line);
983
- --border-strong: var(--token-line-strong);
984
- --shadow-sm: var(--token-shadow-elevated);
985
- --shadow-md: var(--token-shadow-overlay);
986
- --color-success: var(--token-success);
987
- --color-success-bg: var(--token-success-muted);
988
- --color-warning: var(--token-warning);
989
- --color-warning-bg: var(--token-warning-muted);
990
- --color-error: var(--token-error);
991
- --color-error-bg: var(--token-error-muted);
992
- --color-info: var(--token-info);
993
- --color-info-bg: var(--token-info-muted);
994
- --color-pending: var(--token-text-faint);
995
- --color-pending-bg: var(--token-fill-1);
996
- --accent-clay-bg: var(--token-accent-subtle);
997
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 20%, transparent);
998
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
999
- }
1000
-
1001
- /* ── RETRO DARK · 深夜像素 ── */
1002
- .retro.dark {
1003
- /* 像素暗色:深蓝灰底 + 霓虹红 + 像素蓝 */
1004
- --token-bg: #1a1a2e;
1005
- --token-bg-soft: #222240;
1006
- --token-surface: #2a2a50;
1007
- --token-surface-strong: #323260;
1008
- --token-line-soft: #3a3a70;
1009
- --token-line: #4a4a90;
1010
- --token-line-strong: #5a5ab0;
1011
- --token-text: #e8e8d8;
1012
- --token-text-muted: #c0c0a8;
1013
- --token-text-faint: #808070;
1014
- --token-accent: #ff4040;
1015
- --token-accent-cold: #5050ff;
1016
-
1017
- /* ── Glow · 霓虹像素光 ── */
1018
- --token-glow: rgba(255,64,64,.14);
1019
- --token-glow-cold: rgba(80,80,255,.10);
1020
-
1021
- /* ── Derived ── */
1022
- --token-surface-hover: color-mix(in srgb, var(--token-surface) 88%, var(--token-accent) 12%);
1023
- --token-accent-subtle: color-mix(in srgb, var(--token-accent) 14%, transparent);
1024
- --token-accent-glow: color-mix(in srgb, var(--token-accent) 10%, transparent);
1025
- --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
1026
- --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
1027
- --token-on-accent: #ffffff;
1028
-
1029
- /* ── Shadow · 硬像素投影 ── */
1030
- --token-shadow-elevated: 2px 2px 0 rgba(0,0,0,.40);
1031
- --token-shadow-overlay: 3px 3px 0 rgba(0,0,0,.50);
1032
-
1033
- /* ── Semantic ── */
1034
- --token-success: #40ff40;
1035
- --token-success-muted: rgba(64,255,64,.16);
1036
- --token-warning: #ffff40;
1037
- --token-warning-muted: rgba(255,255,64,.16);
1038
- --token-error: #ff4040;
1039
- --token-error-muted: rgba(255,64,64,.16);
1040
- --token-info: #5050ff;
1041
- --token-info-muted: rgba(80,80,255,.16);
1042
-
1043
- /* ── Fill ── */
1044
- --token-fill-1: color-mix(in srgb, var(--token-text) 5%, transparent);
1045
- --token-fill-2: color-mix(in srgb, var(--token-text) 10%, transparent);
1046
- --token-fill-3: color-mix(in srgb, var(--token-text) 16%, transparent);
1047
- --token-fill-4: color-mix(in srgb, var(--token-text) 24%, transparent);
1048
-
1049
- /* ── Glass ── */
1050
- --token-surface-glass: color-mix(in srgb, var(--token-bg-soft) 82%, transparent);
1051
-
1052
- /* ── BRIDGE ── */
1053
- --accent-clay: var(--token-accent);
1054
- --accent-clay-dark: #d03030;
1055
- --accent-clay-light: #ff6060;
1056
- --accent-cold: var(--token-accent-cold);
1057
- --bg-primary: var(--token-bg);
1058
- --bg-secondary: var(--token-bg-soft);
1059
- --bg-tertiary: var(--token-surface);
1060
- --bg-card: var(--token-bg-soft);
1061
- --bg-card-muted: var(--token-surface);
1062
- --bg-panel: var(--token-surface-strong);
1063
- --bg-hover: var(--token-surface-hover);
1064
- --text-primary: var(--token-text);
1065
- --text-secondary: var(--token-text-muted);
1066
- --text-tertiary: #a0a090;
1067
- --text-muted: var(--token-text-faint);
1068
- --text-subtle: var(--token-line-strong);
1069
- --border-subtle: var(--token-line-soft);
1070
- --border-default: var(--token-line);
1071
- --border-strong: var(--token-line-strong);
1072
- --shadow-sm: var(--token-shadow-elevated);
1073
- --shadow-md: var(--token-shadow-overlay);
1074
- --color-success: var(--token-success);
1075
- --color-success-bg: var(--token-success-muted);
1076
- --color-warning: var(--token-warning);
1077
- --color-warning-bg: var(--token-warning-muted);
1078
- --color-error: var(--token-error);
1079
- --color-error-bg: var(--token-error-muted);
1080
- --color-info: var(--token-info);
1081
- --color-info-bg: var(--token-info-muted);
1082
- --color-pending: var(--token-text-faint);
1083
- --color-pending-bg: var(--token-fill-1);
1084
- --accent-clay-bg: var(--token-accent-subtle);
1085
- --accent-clay-bg-strong: color-mix(in srgb, var(--token-accent) 16%, transparent);
1086
- --accent-clay-border: color-mix(in srgb, var(--token-accent) 24%, transparent);
1087
- }
1088
-
1089
- /* ── RETRO Depth Tokens ── */
1090
- .retro {
1091
- --token-canvas: var(--token-bg);
1092
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 78%, var(--token-bg) 22%);
1093
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 52%, var(--token-bg) 48%);
1094
- --token-card: color-mix(in srgb, var(--token-bg) 80%, var(--token-surface) 20%);
1095
- --token-card-strong: color-mix(in srgb, var(--token-bg) 66%, var(--token-surface) 34%);
1096
- --token-control: color-mix(in srgb, var(--token-bg-soft) 62%, var(--token-bg) 38%);
1097
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 52%, var(--token-bg-soft) 48%);
1098
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1099
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-bg) 16%);
1100
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 86%, var(--token-text) 8%);
1101
- --token-shadow-card: 2px 2px 0 color-mix(in srgb, var(--token-text) 15%, transparent);
1102
- --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);
1103
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 36%, transparent);
1104
- }
1105
-
1106
- .retro.dark {
1107
- --token-canvas: var(--token-bg);
1108
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 86%, var(--token-bg) 14%);
1109
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 72%, var(--token-bg) 28%);
1110
- --token-card: color-mix(in srgb, var(--token-surface) 72%, var(--token-bg-soft) 28%);
1111
- --token-card-strong: color-mix(in srgb, var(--token-surface-strong) 72%, var(--token-surface) 28%);
1112
- --token-control: color-mix(in srgb, var(--token-bg-soft) 70%, var(--token-bg) 30%);
1113
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 62%, var(--token-bg-soft) 38%);
1114
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1115
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-text-faint) 8%);
1116
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 86%, var(--token-text-muted) 8%);
1117
- --token-shadow-card: 2px 2px 0 rgba(0,0,0,.30);
1118
- --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);
1119
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 18%, transparent);
1120
- }
1121
-
1122
-
1123
- /* ── 圆角 ── */
1124
- :root {
1125
- --radius-xs: 6px;
1126
- --radius-sm: 8px;
1127
- --radius-md: 10px;
1128
- --radius-lg: 12px;
1129
- --radius-xl: 16px;
1130
- --radius-full: 999px;
1131
- }
1132
-
1133
- /* ── Depth Tokens ──
1134
- Semantic surface levels used by app chrome and primitives. These are
1135
- intentionally derived from theme tokens so every palette keeps its own voice
1136
- while gaining clearer functional separation. */
1137
- :root {
1138
- --token-canvas: var(--token-bg);
1139
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 78%, var(--token-bg) 22%);
1140
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 52%, var(--token-bg) 48%);
1141
- --token-card: color-mix(in srgb, var(--token-bg) 80%, var(--token-surface) 20%);
1142
- --token-card-strong: color-mix(in srgb, var(--token-bg) 66%, var(--token-surface) 34%);
1143
- --token-control: color-mix(in srgb, var(--token-bg-soft) 62%, var(--token-bg) 38%);
1144
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 52%, var(--token-bg-soft) 48%);
1145
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1146
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-bg) 16%);
1147
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 86%, var(--token-text) 8%);
1148
- --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);
1149
- --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);
1150
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 36%, transparent);
1151
-
1152
- /* ── Scrollbar ──
1153
- 由 base.css 的全局滚动条消费;每个预设可在自己的块里覆盖这 5 个 token,
1154
- 以表达品牌色差(如 piano 用金、ink 用青)。retro/terminal 风格在
1155
- style-profiles.css 里另有像素化硬覆盖。 */
1156
- --token-scrollbar-size: 8px;
1157
- --token-scrollbar-track: transparent;
1158
- --token-scrollbar-thumb: color-mix(in srgb, var(--token-text) 16%, transparent);
1159
- --token-scrollbar-thumb-hover: color-mix(in srgb, var(--token-accent) 50%, transparent);
1160
- --token-scrollbar-button: transparent;
1161
- }
1162
-
1163
- .dark {
1164
- --token-canvas: var(--token-bg);
1165
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 86%, var(--token-bg) 14%);
1166
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 72%, var(--token-bg) 28%);
1167
- --token-card: color-mix(in srgb, var(--token-surface) 72%, var(--token-bg-soft) 28%);
1168
- --token-card-strong: color-mix(in srgb, var(--token-surface-strong) 72%, var(--token-surface) 28%);
1169
- --token-control: color-mix(in srgb, var(--token-bg-soft) 70%, var(--token-bg) 30%);
1170
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 62%, var(--token-bg-soft) 38%);
1171
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1172
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-text-faint) 8%);
1173
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 86%, var(--token-text-muted) 8%);
1174
- --token-shadow-card: 0 1px 1px rgba(0,0,0,.22), 0 12px 28px rgba(0,0,0,.24);
1175
- --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);
1176
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 18%, transparent);
1177
- }
1178
-
1179
- .piano {
1180
- --token-canvas: var(--token-bg);
1181
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 84%, var(--token-bg) 16%);
1182
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 68%, var(--token-bg) 32%);
1183
- --token-card: color-mix(in srgb, var(--token-surface) 56%, var(--token-bg) 44%);
1184
- --token-card-strong: color-mix(in srgb, var(--token-surface) 72%, var(--token-bg-soft) 28%);
1185
- --token-control: color-mix(in srgb, var(--token-bg-soft) 74%, var(--token-line-soft) 26%);
1186
- --token-control-hover: color-mix(in srgb, var(--token-surface-strong) 92%, var(--token-accent) 8%);
1187
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 84%, var(--token-bg) 16%);
1188
- --token-outline: color-mix(in srgb, var(--token-line) 94%, var(--token-text-muted) 6%);
1189
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 92%, var(--token-text) 8%);
1190
- --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);
1191
- --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);
1192
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 52%, transparent);
1193
- }
1194
-
1195
- .piano.dark {
1196
- --token-canvas: var(--token-bg);
1197
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 86%, black 14%);
1198
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 74%, var(--token-bg) 26%);
1199
- --token-card: color-mix(in srgb, var(--token-surface) 76%, var(--token-bg-soft) 24%);
1200
- --token-card-strong: color-mix(in srgb, var(--token-surface-strong) 78%, var(--token-surface) 22%);
1201
- --token-control: color-mix(in srgb, var(--token-bg-soft) 72%, black 28%);
1202
- --token-control-hover: color-mix(in srgb, var(--token-surface-strong) 92%, var(--token-accent) 8%);
1203
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 86%, var(--token-bg) 14%);
1204
- --token-outline: color-mix(in srgb, var(--token-line) 92%, var(--token-accent) 8%);
1205
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 88%, var(--token-accent) 12%);
1206
- --token-shadow-card: 0 1px 1px rgba(0,0,0,.32), 0 14px 34px rgba(0,0,0,.40);
1207
- --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);
1208
- --token-top-highlight: color-mix(in srgb, var(--token-text) 8%, transparent);
1209
- }
1210
-
1211
- .vangogh {
1212
- --token-canvas: color-mix(in srgb, var(--token-bg) 88%, #f6efd0 12%);
1213
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 78%, var(--token-bg) 22%);
1214
- --token-panel: color-mix(in srgb, var(--token-bg) 70%, var(--token-bg-soft) 30%);
1215
- --token-card: color-mix(in srgb, var(--token-bg) 78%, var(--token-surface) 22%);
1216
- --token-card-strong: color-mix(in srgb, var(--token-bg) 58%, var(--token-surface) 42%);
1217
- --token-control: color-mix(in srgb, var(--token-bg-soft) 58%, var(--token-bg) 42%);
1218
- --token-control-hover: color-mix(in srgb, var(--token-surface-strong) 86%, var(--token-accent) 14%);
1219
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 80%, var(--token-bg) 20%);
1220
- --token-outline: color-mix(in srgb, var(--token-line) 88%, var(--token-accent) 12%);
1221
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 84%, var(--token-accent) 16%);
1222
- --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);
1223
- --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);
1224
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 30%, transparent);
1225
- }
1226
-
1227
- .vangogh.dark {
1228
- --token-canvas: var(--token-bg);
1229
- --token-sidebar: color-mix(in srgb, var(--token-bg-soft) 84%, var(--token-bg) 16%);
1230
- --token-panel: color-mix(in srgb, var(--token-bg-soft) 72%, var(--token-bg) 28%);
1231
- --token-card: color-mix(in srgb, var(--token-surface) 72%, var(--token-bg-soft) 28%);
1232
- --token-card-strong: color-mix(in srgb, var(--token-surface-strong) 76%, var(--token-surface) 24%);
1233
- --token-control: color-mix(in srgb, var(--token-bg-soft) 70%, var(--token-bg) 30%);
1234
- --token-control-hover: color-mix(in srgb, var(--token-surface-hover) 74%, var(--token-accent) 8%);
1235
- --token-outline-soft: color-mix(in srgb, var(--token-line-soft) 82%, var(--token-bg) 18%);
1236
- --token-outline: color-mix(in srgb, var(--token-line) 84%, var(--token-accent-cold) 8%);
1237
- --token-outline-strong: color-mix(in srgb, var(--token-line-strong) 84%, var(--token-accent) 10%);
1238
- --token-shadow-card: 0 1px 1px rgba(0,0,0,.22), 0 12px 28px rgba(0,0,0,.24);
1239
- --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);
1240
- --token-top-highlight: color-mix(in srgb, var(--token-surface) 18%, transparent);
1241
- }
1242
-
1243
- /* ── 动画 ── */
1244
- @keyframes blink {
1245
- 0%, 100% { opacity: 1; }
1246
- 50% { opacity: 0; }
1247
- }
1248
-
1249
- .animate-blink {
1250
- animation: blink 1s step-end infinite;
6
+ /* GENERATED from themes.json by bun run colors. Edit the catalogue, never this file.
7
+ * 6 complete themes × light/dark; 现代 is the default. Primitives are separate. */
8
+
9
+ /* 现代 · 清透瓷面 · 冷调柔光 · light */
10
+ :root, [data-icen-preset="modern"] {
11
+ --icen-design-canvas: #f5f6f8;
12
+ --icen-design-surface: #ffffff;
13
+ --icen-design-raised: #edf0f5;
14
+ --icen-design-ink: #202124;
15
+ --icen-design-muted: #606773;
16
+ --icen-design-faint: #626c79;
17
+ --icen-design-accent: #087bf5;
18
+ --icen-design-accent-strong: #0062cc;
19
+ --icen-design-accent-text: #0059b8;
20
+ --icen-design-on-accent: #ffffff;
21
+ --icen-design-cold: #58758f;
22
+ --icen-design-success: #247347;
23
+ --icen-design-warning: #846000;
24
+ --icen-design-error: #b02d36;
25
+ --icen-design-info: #336c91;
26
+ --icen-design-shadow-color: #182337;
27
+ --icen-design-glass-opacity: 84%;
28
+ --icen-design-shadow-strength: 10%;
29
+ --icen-design-edge-strength: 11%;
30
+ --icen-design-highlight-strength: 76%;
31
+ color-scheme: light;
32
+ }
33
+
34
+ /* 现代 · 清透瓷面 · 冷调柔光 · dark */
35
+ [data-icen-theme="dark"], [data-icen-preset="modern"][data-icen-theme="dark"] {
36
+ --icen-design-canvas: #15171b;
37
+ --icen-design-surface: #22272f;
38
+ --icen-design-raised: #2c333e;
39
+ --icen-design-ink: #f1f4f9;
40
+ --icen-design-muted: #b1bbca;
41
+ --icen-design-faint: #9faabd;
42
+ --icen-design-accent: #8cbdff;
43
+ --icen-design-accent-strong: #91bfff;
44
+ --icen-design-accent-text: #9dc6ff;
45
+ --icen-design-on-accent: #10223c;
46
+ --icen-design-cold: #9bb4cb;
47
+ --icen-design-success: #8bd3a6;
48
+ --icen-design-warning: #e4c373;
49
+ --icen-design-error: #f2a1a5;
50
+ --icen-design-info: #97c8e8;
51
+ --icen-design-shadow-color: #000000;
52
+ --icen-design-glass-opacity: 90%;
53
+ --icen-design-shadow-strength: 27%;
54
+ --icen-design-edge-strength: 13%;
55
+ --icen-design-highlight-strength: 8%;
56
+ color-scheme: dark;
57
+ }
58
+
59
+ /* 东韵 · 绢本与青瓷 · 温润细光 · light */
60
+ [data-icen-preset="dongyun"] {
61
+ --icen-design-canvas: #f4f1e9;
62
+ --icen-design-surface: #fffdf7;
63
+ --icen-design-raised: #e9e6db;
64
+ --icen-design-ink: #293a34;
65
+ --icen-design-muted: #60695c;
66
+ --icen-design-faint: #626957;
67
+ --icen-design-accent: #477668;
68
+ --icen-design-accent-strong: #305c4e;
69
+ --icen-design-accent-text: #315748;
70
+ --icen-design-on-accent: #fffdf7;
71
+ --icen-design-cold: #85724d;
72
+ --icen-design-success: #3b6544;
73
+ --icen-design-warning: #795517;
74
+ --icen-design-error: #a33e37;
75
+ --icen-design-info: #426477;
76
+ --icen-design-shadow-color: #343c2e;
77
+ --icen-design-glass-opacity: 97%;
78
+ --icen-design-shadow-strength: 7%;
79
+ --icen-design-edge-strength: 14%;
80
+ --icen-design-highlight-strength: 40%;
81
+ color-scheme: light;
82
+ }
83
+
84
+ /* 东韵 · 绢本与青瓷 · 温润细光 · dark */
85
+ [data-icen-preset="dongyun"][data-icen-theme="dark"] {
86
+ --icen-design-canvas: #181e1b;
87
+ --icen-design-surface: #242e28;
88
+ --icen-design-raised: #334037;
89
+ --icen-design-ink: #f0eee0;
90
+ --icen-design-muted: #bfc8b6;
91
+ --icen-design-faint: #b2bea9;
92
+ --icen-design-accent: #a0c5ac;
93
+ --icen-design-accent-strong: #b0d0b6;
94
+ --icen-design-accent-text: #bdd9c1;
95
+ --icen-design-on-accent: #24382b;
96
+ --icen-design-cold: #d0bd8d;
97
+ --icen-design-success: #accd9e;
98
+ --icen-design-warning: #e1c68d;
99
+ --icen-design-error: #edada2;
100
+ --icen-design-info: #accbda;
101
+ --icen-design-shadow-color: #080e0a;
102
+ --icen-design-glass-opacity: 98%;
103
+ --icen-design-shadow-strength: 25%;
104
+ --icen-design-edge-strength: 17%;
105
+ --icen-design-highlight-strength: 5%;
106
+ color-scheme: dark;
107
+ }
108
+
109
+ /* 巨构 · 混凝土与搪瓷 · 实体承重 · light */
110
+ [data-icen-preset="jugou"] {
111
+ --icen-design-canvas: #edece6;
112
+ --icen-design-surface: #faf9f3;
113
+ --icen-design-raised: #e1e0d8;
114
+ --icen-design-ink: #252723;
115
+ --icen-design-muted: #5e625b;
116
+ --icen-design-faint: #62645b;
117
+ --icen-design-accent: #b53c2d;
118
+ --icen-design-accent-strong: #9e3025;
119
+ --icen-design-accent-text: #912e24;
120
+ --icen-design-on-accent: #fffaf0;
121
+ --icen-design-cold: #596d75;
122
+ --icen-design-success: #3d6141;
123
+ --icen-design-warning: #765413;
124
+ --icen-design-error: #9a3138;
125
+ --icen-design-info: #3c6078;
126
+ --icen-design-shadow-color: #242821;
127
+ --icen-design-glass-opacity: 100%;
128
+ --icen-design-shadow-strength: 16%;
129
+ --icen-design-edge-strength: 24%;
130
+ --icen-design-highlight-strength: 20%;
131
+ color-scheme: light;
132
+ }
133
+
134
+ /* 巨构 · 混凝土与搪瓷 · 实体承重 · dark */
135
+ [data-icen-preset="jugou"][data-icen-theme="dark"] {
136
+ --icen-design-canvas: #1b1d1c;
137
+ --icen-design-surface: #2a2e2c;
138
+ --icen-design-raised: #393e3b;
139
+ --icen-design-ink: #f4f0e3;
140
+ --icen-design-muted: #c3c6ba;
141
+ --icen-design-faint: #b8bdae;
142
+ --icen-design-accent: #ed9d86;
143
+ --icen-design-accent-strong: #f1ac92;
144
+ --icen-design-accent-text: #f6bba3;
145
+ --icen-design-on-accent: #3c211b;
146
+ --icen-design-cold: #b1c5ce;
147
+ --icen-design-success: #aecb9f;
148
+ --icen-design-warning: #e6c88b;
149
+ --icen-design-error: #f0b1ad;
150
+ --icen-design-info: #accbdc;
151
+ --icen-design-shadow-color: #090d0b;
152
+ --icen-design-glass-opacity: 100%;
153
+ --icen-design-shadow-strength: 38%;
154
+ --icen-design-edge-strength: 25%;
155
+ --icen-design-highlight-strength: 4%;
156
+ color-scheme: dark;
157
+ }
158
+
159
+ /* 钢琴 · 象牙琴键 · 乌木与漆面微光 · light */
160
+ [data-icen-preset="piano"] {
161
+ --icen-design-canvas: #f5f3ed;
162
+ --icen-design-surface: #fffefb;
163
+ --icen-design-raised: #ece8df;
164
+ --icen-design-ink: #252522;
165
+ --icen-design-muted: #69685f;
166
+ --icen-design-faint: #6a675c;
167
+ --icen-design-accent: #94713f;
168
+ --icen-design-accent-strong: #765424;
169
+ --icen-design-accent-text: #72501f;
170
+ --icen-design-on-accent: #fffefb;
171
+ --icen-design-cold: #657386;
172
+ --icen-design-success: #3d6e4b;
173
+ --icen-design-warning: #805d17;
174
+ --icen-design-error: #a53d39;
175
+ --icen-design-info: #456984;
176
+ --icen-design-shadow-color: #24231e;
177
+ --icen-design-glass-opacity: 89%;
178
+ --icen-design-shadow-strength: 12%;
179
+ --icen-design-edge-strength: 14%;
180
+ --icen-design-highlight-strength: 90%;
181
+ color-scheme: light;
182
+ }
183
+
184
+ /* 钢琴 · 象牙琴键 · 乌木与漆面微光 · dark */
185
+ [data-icen-preset="piano"][data-icen-theme="dark"] {
186
+ --icen-design-canvas: #131416;
187
+ --icen-design-surface: #222427;
188
+ --icen-design-raised: #303338;
189
+ --icen-design-ink: #f4f1e8;
190
+ --icen-design-muted: #b8b5aa;
191
+ --icen-design-faint: #aaa89e;
192
+ --icen-design-accent: #d2b278;
193
+ --icen-design-accent-strong: #d8ba85;
194
+ --icen-design-accent-text: #e3c48c;
195
+ --icen-design-on-accent: #292215;
196
+ --icen-design-cold: #a5b3c6;
197
+ --icen-design-success: #a4cfb0;
198
+ --icen-design-warning: #e2c57f;
199
+ --icen-design-error: #e9aaa7;
200
+ --icen-design-info: #a5c5e3;
201
+ --icen-design-shadow-color: #000000;
202
+ --icen-design-glass-opacity: 93%;
203
+ --icen-design-shadow-strength: 33%;
204
+ --icen-design-edge-strength: 17%;
205
+ --icen-design-highlight-strength: 11%;
206
+ color-scheme: dark;
207
+ }
208
+
209
+ /* 莫奈 · 睡莲水面 · 蓝绿柔光与含蓄紫调 · light */
210
+ [data-icen-preset="monet"] {
211
+ --icen-design-canvas: #f4f7f4;
212
+ --icen-design-surface: #fcfdfb;
213
+ --icen-design-raised: #e8eeea;
214
+ --icen-design-ink: #20332e;
215
+ --icen-design-muted: #5b6f65;
216
+ --icen-design-faint: #5b6e64;
217
+ --icen-design-accent: #2b675c;
218
+ --icen-design-accent-strong: #245c50;
219
+ --icen-design-accent-text: #24574c;
220
+ --icen-design-on-accent: #ffffff;
221
+ --icen-design-cold: #667c8a;
222
+ --icen-design-success: #307449;
223
+ --icen-design-warning: #805f1b;
224
+ --icen-design-error: #a43d42;
225
+ --icen-design-info: #3d6a82;
226
+ --icen-design-shadow-color: #23372f;
227
+ --icen-design-glass-opacity: 93%;
228
+ --icen-design-shadow-strength: 8%;
229
+ --icen-design-edge-strength: 12%;
230
+ --icen-design-highlight-strength: 52%;
231
+ color-scheme: light;
232
+ }
233
+
234
+ /* 莫奈 · 睡莲水面 · 蓝绿柔光与含蓄紫调 · dark */
235
+ [data-icen-preset="monet"][data-icen-theme="dark"] {
236
+ --icen-design-canvas: #121d1a;
237
+ --icen-design-surface: #1d2d27;
238
+ --icen-design-raised: #2c3d34;
239
+ --icen-design-ink: #e6f0e7;
240
+ --icen-design-muted: #a7c0b1;
241
+ --icen-design-faint: #9cb1a4;
242
+ --icen-design-accent: #93c9ad;
243
+ --icen-design-accent-strong: #a0d2b7;
244
+ --icen-design-accent-text: #a5d8bd;
245
+ --icen-design-on-accent: #173328;
246
+ --icen-design-cold: #a1baca;
247
+ --icen-design-success: #91d2a2;
248
+ --icen-design-warning: #dac487;
249
+ --icen-design-error: #e8a7ad;
250
+ --icen-design-info: #9bc4da;
251
+ --icen-design-shadow-color: #06100b;
252
+ --icen-design-glass-opacity: 95%;
253
+ --icen-design-shadow-strength: 27%;
254
+ --icen-design-edge-strength: 14%;
255
+ --icen-design-highlight-strength: 6%;
256
+ color-scheme: dark;
257
+ }
258
+
259
+ /* 梵高 · 亚麻画布 · 钴蓝与麦穗金 · light */
260
+ [data-icen-preset="vangogh"] {
261
+ --icen-design-canvas: #f8f3e4;
262
+ --icen-design-surface: #fffdf3;
263
+ --icen-design-raised: #efe5c9;
264
+ --icen-design-ink: #253650;
265
+ --icen-design-muted: #5c6580;
266
+ --icen-design-faint: #5e667b;
267
+ --icen-design-accent: #275ea0;
268
+ --icen-design-accent-strong: #224e83;
269
+ --icen-design-accent-text: #234c7b;
270
+ --icen-design-on-accent: #fffdf3;
271
+ --icen-design-cold: #a0711e;
272
+ --icen-design-success: #416b3a;
273
+ --icen-design-warning: #855a15;
274
+ --icen-design-error: #a83c31;
275
+ --icen-design-info: #356b85;
276
+ --icen-design-shadow-color: #463d27;
277
+ --icen-design-glass-opacity: 92%;
278
+ --icen-design-shadow-strength: 11%;
279
+ --icen-design-edge-strength: 13%;
280
+ --icen-design-highlight-strength: 62%;
281
+ color-scheme: light;
282
+ }
283
+
284
+ /* 梵高 · 亚麻画布 · 钴蓝与麦穗金 · dark */
285
+ [data-icen-preset="vangogh"][data-icen-theme="dark"] {
286
+ --icen-design-canvas: #111e32;
287
+ --icen-design-surface: #1c2d46;
288
+ --icen-design-raised: #2a3f5b;
289
+ --icen-design-ink: #f8efcf;
290
+ --icen-design-muted: #c2c4b5;
291
+ --icen-design-faint: #afb7bd;
292
+ --icen-design-accent: #e5be54;
293
+ --icen-design-accent-strong: #ebc568;
294
+ --icen-design-accent-text: #efd181;
295
+ --icen-design-on-accent: #2b2617;
296
+ --icen-design-cold: #88a5d6;
297
+ --icen-design-success: #b3d29b;
298
+ --icen-design-warning: #f0cd7b;
299
+ --icen-design-error: #efaaa0;
300
+ --icen-design-info: #a1c9e8;
301
+ --icen-design-shadow-color: #050b15;
302
+ --icen-design-glass-opacity: 93%;
303
+ --icen-design-shadow-strength: 30%;
304
+ --icen-design-edge-strength: 16%;
305
+ --icen-design-highlight-strength: 7%;
306
+ color-scheme: dark;
307
+ }
308
+
309
+ /* Recompute semantic aliases at each palette boundary (including nested specimens). */
310
+ :root, [data-icen-preset], [data-icen-theme="dark"] {
311
+ --icen-design-bg-soft: color-mix(in srgb, var(--icen-design-canvas) 70%, var(--icen-design-raised));
312
+ --icen-token-bg: var(--icen-design-canvas);
313
+ --icen-token-bg-soft: var(--icen-design-bg-soft);
314
+ --icen-token-surface: var(--icen-design-surface);
315
+ --icen-token-surface-strong: var(--icen-design-raised);
316
+ --icen-token-text: var(--icen-design-ink);
317
+ --icen-token-text-muted: var(--icen-design-muted);
318
+ --icen-token-text-faint: var(--icen-design-faint);
319
+ --icen-token-accent: var(--icen-design-accent);
320
+ --icen-token-accent-strong: var(--icen-design-accent-strong);
321
+ --icen-token-accent-text: var(--icen-design-accent-text);
322
+ --icen-token-accent-deep: var(--icen-design-accent-strong);
323
+ --icen-token-accent-cold: var(--icen-design-cold);
324
+ --icen-token-on-accent: var(--icen-design-on-accent);
325
+ --icen-token-success: var(--icen-design-success);
326
+ --icen-token-success-text: var(--icen-design-success);
327
+ --icen-token-warning: var(--icen-design-warning);
328
+ --icen-token-error: var(--icen-design-error);
329
+ --icen-token-danger: var(--icen-design-error);
330
+ --icen-token-info: var(--icen-design-info);
331
+ --icen-token-surface-hover: color-mix(in srgb, var(--icen-design-surface) 94%, var(--icen-design-ink));
332
+ --icen-token-line-soft: color-mix(in srgb, var(--icen-design-ink) 10%, transparent);
333
+ --icen-token-line: color-mix(in srgb, var(--icen-design-ink) 19%, transparent);
334
+ --icen-token-line-strong: color-mix(in srgb, var(--icen-design-ink) 38%, transparent);
335
+ --icen-token-line-dashed: var(--icen-token-line);
336
+ --icen-token-outline-soft: var(--icen-token-line-soft);
337
+ --icen-token-outline: var(--icen-token-line);
338
+ --icen-token-outline-strong: var(--icen-token-line-strong);
339
+ --icen-token-fill-1: color-mix(in srgb, var(--icen-design-ink) 4%, transparent);
340
+ --icen-token-fill-2: color-mix(in srgb, var(--icen-design-ink) 7%, transparent);
341
+ --icen-token-fill-3: color-mix(in srgb, var(--icen-design-ink) 12%, transparent);
342
+ --icen-token-fill-4: color-mix(in srgb, var(--icen-design-ink) 18%, transparent);
343
+ --icen-token-accent-subtle: color-mix(in srgb, var(--icen-design-accent) 10%, transparent);
344
+ --icen-token-accent-glow: color-mix(in srgb, var(--icen-design-accent) 8%, transparent);
345
+ --icen-token-glow: transparent;
346
+ --icen-token-glow-cold: transparent;
347
+ --icen-token-success-muted: color-mix(in srgb, var(--icen-design-success) 12%, transparent);
348
+ --icen-token-warning-muted: color-mix(in srgb, var(--icen-design-warning) 12%, transparent);
349
+ --icen-token-error-muted: color-mix(in srgb, var(--icen-design-error) 12%, transparent);
350
+ --icen-token-error-soft: var(--icen-token-error-muted);
351
+ --icen-token-info-muted: color-mix(in srgb, var(--icen-design-info) 12%, transparent);
352
+ --icen-token-canvas: var(--icen-token-bg);
353
+ --icen-token-sidebar: var(--icen-token-bg-soft);
354
+ --icen-token-panel: var(--icen-token-bg-soft);
355
+ --icen-token-card: var(--icen-token-surface);
356
+ --icen-token-card-strong: var(--icen-token-surface-strong);
357
+ --icen-token-control: color-mix(in srgb, var(--icen-design-surface) 70%, var(--icen-design-canvas));
358
+ --icen-token-control-hover: var(--icen-token-surface-hover);
359
+ --icen-token-surface-glass: color-mix(in srgb, var(--icen-token-surface) var(--icen-design-glass-opacity), transparent);
360
+ --icen-token-overlay-bg: var(--icen-token-surface-glass);
361
+ --icen-token-scrollbar-size: 8px;
362
+ --icen-token-scrollbar-track: transparent;
363
+ --icen-token-scrollbar-thumb: color-mix(in srgb, var(--icen-design-ink) 22%, transparent);
364
+ --icen-token-scrollbar-thumb-hover: color-mix(in srgb, var(--icen-design-ink) 38%, transparent);
365
+ --icen-token-scrollbar-button: transparent;
366
+ --icen-accent-cold: var(--icen-token-accent-cold);
367
+ --icen-bg-primary: var(--icen-token-bg);
368
+ --icen-bg-secondary: var(--icen-token-bg-soft);
369
+ --icen-bg-tertiary: var(--icen-token-surface);
370
+ --icen-bg-card: var(--icen-token-card);
371
+ --icen-bg-card-muted: var(--icen-token-bg-soft);
372
+ --icen-bg-panel: var(--icen-token-panel);
373
+ --icen-bg-hover: var(--icen-token-surface-hover);
374
+ --icen-text-primary: var(--icen-token-text);
375
+ --icen-text-secondary: var(--icen-token-text);
376
+ --icen-text-tertiary: var(--icen-token-text-muted);
377
+ --icen-text-muted: var(--icen-token-text-muted);
378
+ --icen-text-subtle: var(--icen-token-text-faint);
379
+ --icen-border-subtle: var(--icen-token-line-soft);
380
+ --icen-border-default: var(--icen-token-line);
381
+ --icen-border-strong: var(--icen-token-line-strong);
382
+ --icen-shadow-sm: var(--icen-token-shadow-elevated);
383
+ --icen-shadow-md: var(--icen-token-shadow-overlay);
384
+ --icen-color-success: var(--icen-token-success);
385
+ --icen-color-success-bg: var(--icen-token-success-muted);
386
+ --icen-color-warning: var(--icen-token-warning);
387
+ --icen-color-warning-bg: var(--icen-token-warning-muted);
388
+ --icen-color-error: var(--icen-token-error);
389
+ --icen-color-error-bg: var(--icen-token-error-muted);
390
+ --icen-color-info: var(--icen-token-info);
391
+ --icen-color-info-bg: var(--icen-token-info-muted);
392
+ --icen-color-pending: var(--icen-token-text-muted);
393
+ --icen-color-pending-bg: var(--icen-token-bg-soft);
1251
394
  }
1252
395
 
1253
396
 
1254
-
1255
397
  /* ── tokens/style-profiles.css ── */
1256
- /*
1257
- * Icen Design System — 风格配置 (Style Profiles)
1258
- *
1259
- * 这是颜色主题之上的第二层抽象:
1260
- * .style-modern → 默认现代风格(不覆盖)
1261
- * .style-retro → 8-bit / 红白机 / 像素风
1262
- * .style-terminal → 命令行 / CRT 终端(预留)
1263
- *
1264
- * 规则:
1265
- * 1. 这些类挂在 <html> 上,与 .clay/.piano/.art/.vangogh/.ink/.retro 共存。
1266
- * 2. 只覆盖与“风格”相关的变量:字体、圆角、阴影硬度、抗锯齿、图像渲染。
1267
- * 3. 颜色仍由 preset 决定,保持正交。
1268
- *
1269
- * 注:选择器引用的是 base.css 的交互基元(.pressable / .control / .lift),
1270
- * 而非源项目 opengal 的 .og-* 命名——切换 profile 时这些基元自动获得
1271
- * 对应风格的几何/边框/阴影形态。
1272
- */
1273
-
1274
- /* ══════════════════════════════════════════════════════════════
1275
- 字体资源
1276
- ══════════════════════════════════════════════════════════════ */
1277
-
1278
- /* Press Start 2P — 经典 8-bit 像素字体(西文) */
1279
- @font-face {
1280
- font-family: "Pixel Retro";
1281
- src:
1282
- local("Press Start 2P"),
1283
- local("VT323"),
1284
- url("https://fonts.gstatic.com/s/pressstart2p/v15/e3t4euO8T-267oIAQAu6jDQyK3nVivM.woff2") format("woff2");
1285
- font-weight: 400;
1286
- font-style: normal;
1287
- font-display: swap;
1288
- unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
1289
- }
1290
-
1291
- /* 中文像素风回退:无通用免费像素中文字体,使用系统等宽/宋体保持清晰 */
1292
- @font-face {
1293
- font-family: "Pixel CJK Fallback";
1294
- src:
1295
- local("Zpix"),
1296
- local("SimSun"),
1297
- local("Songti SC"),
1298
- local("STSong"),
1299
- local("Noto Serif SC"),
1300
- local("PingFang SC"),
1301
- local("Microsoft YaHei");
1302
- font-weight: 400;
1303
- font-style: normal;
1304
- font-display: swap;
1305
- }
1306
-
398
+ /* Shared fallback defaults. Built-in primitive recipes live in design/pixel/chinese/soviet.css. */
1307
399
  :root {
1308
400
  /* ══════════════════════════════════════════════════════════════
1309
401
  风格底层 token(兜底值)
@@ -1311,562 +403,1224 @@
1311
403
  ══════════════════════════════════════════════════════════════ */
1312
404
 
1313
405
  /* ── Density 密度 ── */
1314
- --density-space-xs: 0.25rem;
1315
- --density-space-sm: 0.5rem;
1316
- --density-space-md: 0.75rem;
1317
- --density-space-lg: 1rem;
1318
- --density-space-xl: 1.5rem;
1319
- --density-space-2xl: 2rem;
1320
- --density-space-3xl: 3rem;
1321
- --density-space-4xl: 4rem;
1322
- --density-input-height-sm: 28px;
1323
- --density-input-height-md: 36px;
1324
- --density-input-height-lg: 44px;
1325
- --density-font-size-2xs: 10px;
1326
- --density-font-size-xs: 11px;
1327
- --density-font-size-sm: 12px;
1328
- --density-font-size-md: 13px;
1329
- --density-font-size-lg: 14px;
1330
- --density-font-size-xl: 18px;
1331
- --density-font-size-2xl: 22px;
406
+ --icen-density-space-2xs: 0.125rem;
407
+ --icen-density-space-xs: 0.25rem;
408
+ --icen-density-space-sm: 0.5rem;
409
+ --icen-density-space-md: 0.75rem;
410
+ --icen-density-space-lg: 1rem;
411
+ --icen-density-space-xl: 1.5rem;
412
+ --icen-density-space-2xl: 2rem;
413
+ --icen-density-space-3xl: 3rem;
414
+ --icen-density-space-4xl: 4rem;
415
+ --icen-density-input-height-sm: 28px;
416
+ --icen-density-input-height-md: 36px;
417
+ --icen-density-input-height-lg: 44px;
418
+ --icen-density-font-size-2xs: 10px;
419
+ --icen-density-font-size-xs: 11px;
420
+ --icen-density-font-size-sm: 12px;
421
+ --icen-density-font-size-md: 13px;
422
+ --icen-density-font-size-lg: 14px;
423
+ --icen-density-font-size-xl: 18px;
424
+ --icen-density-font-size-2xl: 22px;
1332
425
 
1333
426
  /* ── Motion 动效 ── */
1334
- --duration-instant: 0ms;
1335
- --duration-fast: 150ms;
1336
- --duration-normal: 200ms;
1337
- --duration-slow: 300ms;
1338
- --ease-linear: linear;
1339
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
1340
- --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
427
+ --icen-duration-instant: 0ms;
428
+ --icen-duration-fast: 150ms;
429
+ --icen-duration-normal: 200ms;
430
+ --icen-duration-slow: 300ms;
431
+ --icen-ease-linear: linear;
432
+ --icen-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
433
+ --icen-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
1341
434
 
1342
435
  /* ── Typography 字体 ──
1343
- --line-height-heading 不在此定义:typography.css 独家拥有(icen 品牌 1.2),
436
+ --icen-line-height-heading 不在此定义:typography.css 独家拥有(icen 品牌 1.2),
1344
437
  各 .style-* profile 需要差异化时在自己的块里覆盖。 */
1345
- --font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
1346
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1347
- --font-mono-paper: ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Courier New', monospace;
1348
- --font-heading: var(--font-body);
1349
- --letter-spacing-body: 0;
1350
- --letter-spacing-heading: 0;
1351
- --line-height-body: 1.5;
1352
- }
1353
-
1354
- /* ══════════════════════════════════════════════════════════════
1355
- MODERN — 默认现代风格(兜底值即为现代值,显式声明便于阅读)
1356
- ══════════════════════════════════════════════════════════════ */
1357
-
1358
- .style-modern {
1359
- /* ── Density ── */
1360
- --density-space-xs: 0.25rem;
1361
- --density-space-sm: 0.5rem;
1362
- --density-space-md: 0.75rem;
1363
- --density-space-lg: 1rem;
1364
- --density-space-xl: 1.5rem;
1365
- --density-space-2xl: 2rem;
1366
- --density-space-3xl: 3rem;
1367
- --density-space-4xl: 4rem;
1368
- --density-input-height-sm: 28px;
1369
- --density-input-height-md: 36px;
1370
- --density-input-height-lg: 44px;
1371
- --density-font-size-2xs: 10px;
1372
- --density-font-size-xs: 11px;
1373
- --density-font-size-sm: 12px;
1374
- --density-font-size-md: 13px;
1375
- --density-font-size-lg: 14px;
1376
- --density-font-size-xl: 18px;
1377
- --density-font-size-2xl: 22px;
1378
-
1379
- /* ── Motion ── */
1380
- --duration-fast: 150ms;
1381
- --duration-normal: 200ms;
1382
- --duration-slow: 300ms;
1383
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
1384
-
1385
- /* ── Typography ── */
1386
- --font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
1387
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1388
- --font-mono-paper: ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Courier New', monospace;
1389
- --font-heading: var(--font-body);
1390
- --letter-spacing-body: 0;
1391
- --letter-spacing-heading: 0;
1392
- --line-height-body: 1.5;
1393
- --line-height-heading: 1.2;
1394
- }
1395
-
1396
- /* ══════════════════════════════════════════════════════════════
1397
- RETRO — 8-bit / 红白机 / 像素风
1398
- ══════════════════════════════════════════════════════════════ */
1399
-
1400
- .style-retro {
1401
- /* ── Density:像素风更紧凑 ── */
1402
- --density-space-xs: 0.125rem;
1403
- --density-space-sm: 0.25rem;
1404
- --density-space-md: 0.5rem;
1405
- --density-space-lg: 0.75rem;
1406
- --density-space-xl: 1rem;
1407
- --density-space-2xl: 1.5rem;
1408
- --density-space-3xl: 2rem;
1409
- --density-space-4xl: 3rem;
1410
- --density-input-height-sm: 24px;
1411
- --density-input-height-md: 32px;
1412
- --density-input-height-lg: 40px;
1413
- --density-font-size-2xs: 9px;
1414
- --density-font-size-xs: 9px;
1415
- --density-font-size-sm: 10px;
1416
- --density-font-size-md: 11px;
1417
- --density-font-size-lg: 12px;
1418
- --density-font-size-xl: 14px;
1419
- --density-font-size-2xl: 16px;
1420
-
1421
- /* ── Motion:像素风瞬间切换 ── */
1422
- --duration-fast: 0ms;
1423
- --duration-normal: 0ms;
1424
- --duration-slow: 0ms;
1425
- --ease-out: linear;
1426
-
1427
- /* ── Typography:像素字体 ── */
1428
- --font-body: "Pixel Retro", "Pixel CJK Fallback", "Press Start 2P", "VT323", "SimSun", "Songti SC", "STSong", monospace;
1429
- --font-mono: "Pixel Retro", "VT323", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1430
- --font-mono-paper: "Pixel Retro", "JetBrains Mono", "Courier New", monospace;
1431
- --font-heading: "Pixel Retro", "Press Start 2P", "VT323", var(--font-body);
1432
- --letter-spacing-body: 0.02em;
1433
- --letter-spacing-heading: 0.04em;
1434
- --line-height-body: 1.5;
1435
- --line-height-heading: 1.2;
1436
-
1437
- /* ── 圆角:像素风几乎无圆角 ── */
1438
- --radius-xs: 0px;
1439
- --radius-sm: 0px;
1440
- --radius-md: 2px;
1441
- --radius-lg: 2px;
1442
- --radius-xl: 2px;
1443
- --radius-full: 0px;
1444
-
1445
- /* ── 滚动条 ── */
1446
- --token-scrollbar-size: 10px;
1447
-
1448
- /* ── icen 原语覆盖:retro 的聚焦环/按下/悬停全部像素化 ── */
1449
- --icen-ring: 2px solid var(--token-accent);
1450
- --icen-ring-soft: 2px solid var(--token-accent);
1451
- --icen-ring-error: 2px solid var(--token-error);
1452
- --icen-ring-success: 2px solid var(--token-success);
1453
- --icen-press: translate(2px, 2px);
1454
- --icen-press-soft: translate(1px, 1px);
1455
- --icen-hover-border: var(--token-accent);
1456
- --icen-hover-border-strong: var(--token-accent);
1457
- --icen-control-focus-shadow: inset 2px 2px 0 var(--token-line-soft), inset -1px -1px 0 var(--token-surface-strong);
1458
- --icen-control-focus-border: var(--token-accent);
1459
- --icen-control-error-shadow: inset 2px 2px 0 var(--token-line-soft), inset -1px -1px 0 var(--token-surface-strong);
1460
-
1461
- /* ── 渲染 ── */
1462
- image-rendering: pixelated;
1463
- -webkit-font-smoothing: none;
1464
- -moz-osx-font-smoothing: unset;
1465
- }
1466
-
1467
- /* 全局排版覆盖 */
1468
- .style-retro body {
1469
- font-family: "Numeric Math", var(--font-body);
1470
- line-height: var(--line-height-body);
1471
- letter-spacing: var(--letter-spacing-body);
1472
- }
1473
-
1474
- /* 标题强化像素感 */
1475
- .style-retro h1,
1476
- .style-retro h2,
1477
- .style-retro h3,
1478
- .style-retro h4,
1479
- .style-retro h5,
1480
- .style-retro h6 {
1481
- font-family: var(--font-heading);
1482
- letter-spacing: var(--letter-spacing-heading);
1483
- line-height: var(--line-height-heading);
1484
- text-transform: uppercase;
1485
- }
1486
-
1487
- /* ══════════════════════════════════════════════════════════════
1488
- 按钮 / 可点击元素 — 8-bit 像素按钮
1489
- base.css 的 .pressable / 原生 button / [role=button] / 复位按钮
1490
- 注:聚焦环 / 按下形变 / 悬停边框 由 --icen-* 原语驱动,
1491
- 在 .style-retro 块里已统一覆盖;这里只补"按钮的像素投影",
1492
- 这是 .pressable::after 高光无法表达的形态。
1493
- ══════════════════════════════════════════════════════════════ */
1494
-
1495
- .style-retro .pressable,
1496
- .style-retro button,
1497
- .style-retro [role="button"],
1498
- .style-retro input[type="button"],
1499
- .style-retro input[type="submit"],
1500
- .style-retro input[type="reset"] {
1501
- position: relative;
1502
- border-radius: var(--radius-md);
1503
- border: 2px solid var(--token-line-strong);
1504
- box-shadow:
1505
- inset -2px -2px 0 var(--token-line-soft),
1506
- inset 2px 2px 0 var(--token-surface-strong),
1507
- 2px 2px 0 var(--token-line);
1508
- transition: all var(--duration-fast) var(--ease-out);
438
+ --icen-font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
439
+ --icen-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
440
+ --icen-font-mono-paper: ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Courier New', monospace;
441
+ --icen-font-heading: var(--icen-font-body);
442
+ --icen-letter-spacing-body: 0;
443
+ --icen-letter-spacing-heading: 0;
444
+ --icen-line-height-body: 1.5;
1509
445
  }
1510
446
 
1511
- /* 禁用 .pressable::after 的现代渐变高光,retro 用硬投影表达层级 */
1512
- .style-retro .pressable::after,
1513
- .style-retro button::after {
1514
- display: none;
1515
- }
1516
447
 
1517
- /* 悬停:边框高亮(聚焦环由 --icen-ring 接管,不再硬覆盖 outline) */
1518
- .style-retro .pressable:hover,
1519
- .style-retro button:hover,
1520
- .style-retro [role="button"]:hover {
1521
- border-color: var(--token-accent);
1522
- }
448
+ /* ── tokens/typography.css ── */
449
+ /*
450
+ * @icen.ai/ui — Typography Tokens(icen canonical)
451
+ * 默认排版:现代系统无衬线;代码/数字提供独立工具类。
452
+ * 像素原语的点阵排版在 pixel.css 中定义。
453
+ * 工具类:.icen-font-math(数字密集区,"Numeric Math" 数学字体 + tabular-nums)
454
+ */
1523
455
 
1524
- /* 按下:内移 + 阴影消失(位移值由 --icen-press 驱动) */
1525
- .style-retro .pressable:active,
1526
- .style-retro button:active,
1527
- .style-retro [role="button"]:active {
1528
- box-shadow:
1529
- inset -2px -2px 0 var(--token-line-soft),
1530
- inset 2px 2px 0 var(--token-surface-strong);
456
+ /* ── 数学/等宽数字字体(数字密集区的精密感) ── */
457
+ @font-face {
458
+ font-family: "Numeric Math";
459
+ src:
460
+ local("Cambria Math"),
461
+ local("STIX Two Math"),
462
+ local("Latin Modern Math"),
463
+ local("Asana Math");
464
+ unicode-range: U+0025-003A, U+00A5, U+2212, U+223C;
1531
465
  }
1532
466
 
1533
- /* 禁用状态 */
1534
- .style-retro .pressable:where(:disabled, [aria-disabled="true"], [data-disabled]),
1535
- .style-retro button:disabled {
1536
- box-shadow: none;
1537
- outline: none;
467
+ :root {
468
+ /* ── icen 品牌字体栈 ──
469
+ body:系统无衬线;mono:系统等宽
470
+ heading:跟随界面字体 */
471
+ --icen-font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
472
+ --icen-font-mono: ui-monospace, SFMono-Regular, Consolas, monospace;
473
+ --icen-font-heading: var(--icen-font-body);
474
+ --icen-font-cjk: var(--icen-font-heading);
475
+ --icen-line-height-body: 1.7;
476
+ /* 独家定义(style-profiles.css 的 :root 不再重复;profile 差异化在各 .style-* 块覆盖) */
477
+ --icen-line-height-heading: 1.2;
1538
478
  }
1539
479
 
1540
- /* ══════════════════════════════════════════════════════════════
1541
- 输入框 / 表单元素 — 像素输入框
1542
- base.css 的 .control 是 wrapper 基元;原生 input/textarea/select 同样适用
1543
- 注:聚焦阴影/边框已由 --icen-control-focus-* 接管,这里只补像素 inset 阴影
1544
- ══════════════════════════════════════════════════════════════ */
1545
-
1546
- .style-retro .control,
1547
- .style-retro input,
1548
- .style-retro textarea,
1549
- .style-retro select {
1550
- border-radius: var(--radius-md);
1551
- border: 2px solid var(--token-line);
1552
- background: var(--token-bg);
1553
- box-shadow:
1554
- inset 2px 2px 0 var(--token-line-soft),
1555
- inset -1px -1px 0 var(--token-surface-strong);
1556
- transition: none;
1557
- }
1558
-
1559
- /* 被 .control 容器包裹的输入框:自身边框透明化,
1560
- 完全交给外层容器承担像素边框,避免常驻/聚焦状态出现双层内框。 */
1561
- .style-retro .control input:not([type="checkbox"]):not([type="radio"]),
1562
- .style-retro .control textarea,
1563
- .style-retro .control select,
1564
- .style-retro .control [contenteditable="true"] {
1565
- border-color: transparent !important;
1566
- box-shadow: none !important;
1567
- background: transparent !important;
1568
- }
1569
-
1570
- .style-retro input:hover,
1571
- .style-retro textarea:hover,
1572
- .style-retro select:hover,
1573
- .style-retro .control:hover {
1574
- border-color: var(--icen-hover-border);
480
+ /* ── 全局排版 ── */
481
+ body {
482
+ font-family: var(--icen-font-body);
483
+ line-height: var(--icen-line-height-body);
484
+ -webkit-font-smoothing: antialiased;
485
+ -moz-osx-font-smoothing: grayscale;
486
+ font-feature-settings: "rlig" 1, "calt" 1;
487
+ font-variant-numeric: normal;
1575
488
  }
1576
489
 
1577
- /* 文本输入区自身无焦点环,完全交给外层容器;
1578
- .control:focus-within 的 box-shadow / border 由 --icen-control-focus-* 自动驱动 */
1579
- .style-retro input:focus,
1580
- .style-retro textarea:focus,
1581
- .style-retro select:focus,
1582
- .style-retro input:focus-visible,
1583
- .style-retro textarea:focus-visible,
1584
- .style-retro select:focus-visible,
1585
- .style-retro [contenteditable="true"]:focus,
1586
- .style-retro [contenteditable="true"]:focus-visible {
1587
- outline: none !important;
1588
- box-shadow: none !important;
1589
- border-color: transparent !important;
490
+ h1, h2, h3, h4, h5, h6 {
491
+ font-family: var(--icen-font-heading);
492
+ line-height: var(--icen-line-height-heading);
1590
493
  }
1591
494
 
1592
- /* 占位符文字 */
1593
- .style-retro input::placeholder,
1594
- .style-retro textarea::placeholder {
1595
- color: var(--token-text-faint);
1596
- opacity: 0.7;
495
+ /* ── 数字密集区工具类 ── */
496
+ .icen-font-math {
497
+ font-family: "Numeric Math", math, var(--icen-font-body);
498
+ font-variant-numeric: lining-nums tabular-nums;
1597
499
  }
1598
500
 
1599
- /* ══════════════════════════════════════════════════════════════
1600
- 开关 / 复选框 — 像素开关
1601
- ══════════════════════════════════════════════════════════════ */
1602
501
 
1603
- .style-retro input[type="checkbox"],
1604
- .style-retro input[type="radio"] {
1605
- appearance: none;
1606
- width: 16px;
1607
- height: 16px;
1608
- border: 2px solid var(--token-line-strong);
1609
- background: var(--token-bg);
1610
- box-shadow:
1611
- inset -2px -2px 0 var(--token-line-soft),
1612
- inset 2px 2px 0 var(--token-surface-strong);
1613
- cursor: pointer;
502
+ /* ── tokens/design.css ── */
503
+ /* 现代 primitive: geometry, type, rhythm and lighting. Color palettes live in themes.json. */
504
+ :root {
505
+ --icen-design-radius: 10px;
506
+ --icen-design-space: 4px;
507
+ --icen-design-control-height: 40px;
508
+ --icen-design-font-size: 14px;
509
+ --icen-design-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
510
+ --icen-design-glass-blur: 20px;
511
+ --icen-design-motion: 1;
512
+ }
513
+
514
+ /* Materials and geometry belong to the primitive, across every palette. */
515
+ :root, [data-icen-preset], [data-icen-theme="dark"] {
516
+ --icen-token-surface-glass: color-mix(in srgb, var(--icen-token-surface) var(--icen-design-glass-opacity), transparent);
517
+ /* Contact, near-field and ambient shadows share a light source. Negative
518
+ * spread keeps the shadow under the object instead of fogging its outline. */
519
+ --icen-token-shadow-card: 0 1px 2px -1px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent), 0 4px 10px -5px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .7), transparent), 0 12px 24px -12px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .5), transparent);
520
+ --icen-token-shadow-elevated: 0 1px 3px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .75), transparent), 0 8px 20px -8px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent), 0 24px 48px -16px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent);
521
+ --icen-token-shadow-overlay: 0 2px 6px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent), 0 16px 36px -12px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * 1.2), transparent), 0 40px 88px -24px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * 1.2), transparent);
522
+ --icen-token-top-highlight: color-mix(in srgb, var(--icen-design-light) var(--icen-design-highlight-strength), transparent);
523
+ --icen-token-shadow-inset: inset 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .35), transparent), inset 0 -1px 0 color-mix(in srgb, var(--icen-token-top-highlight) 45%, transparent);
524
+ --icen-token-shadow-popover: var(--icen-token-shadow-elevated);
525
+ --icen-token-material-edge: color-mix(in srgb, var(--icen-token-text) var(--icen-design-edge-strength), transparent);
526
+ --icen-token-material-light: inset 0 1px 0 var(--icen-token-top-highlight), inset 0 -1px 0 color-mix(in srgb, var(--icen-token-top-highlight) 18%, transparent);
527
+ --icen-token-scrim: color-mix(in srgb, var(--icen-design-shadow-color) 32%, transparent);
1614
528
  }
1615
529
 
1616
- .style-retro input[type="checkbox"]:checked,
1617
- .style-retro input[type="radio"]:checked {
1618
- background: var(--token-accent);
1619
- border-color: var(--token-accent);
1620
- box-shadow:
1621
- inset 2px 2px 0 color-mix(in srgb, var(--token-on-accent) 50%, transparent),
1622
- inset -2px -2px 0 color-mix(in srgb, var(--token-accent-cold) 30%, transparent);
530
+ :root {
531
+ --icen-design-light: #ffffff;
532
+ --icen-radius-xs: max(0px, calc(var(--icen-design-radius) - 6px));
533
+ --icen-radius-sm: max(0px, calc(var(--icen-design-radius) - 2px));
534
+ --icen-radius-md: var(--icen-design-radius);
535
+ --icen-radius-lg: calc(var(--icen-design-radius) + 6px);
536
+ --icen-radius-xl: calc(var(--icen-design-radius) + 14px);
537
+ --icen-radius-full: 999px;
538
+ --icen-font-body: var(--icen-design-font);
539
+ --icen-font-heading: var(--icen-design-font);
540
+ --icen-font-cjk: var(--icen-design-font);
541
+ --icen-font-mono: ui-monospace, SFMono-Regular, Consolas, monospace;
542
+ --icen-font-mono-paper: var(--icen-font-mono);
543
+ --icen-line-height-body: 1.55;
544
+ --icen-line-height-heading: 1.25;
545
+ --icen-letter-spacing-body: 0;
546
+ --icen-letter-spacing-heading: -.02em;
547
+ --icen-duration-fast: calc(120ms * var(--icen-design-motion));
548
+ --icen-duration-normal: calc(180ms * var(--icen-design-motion));
549
+ --icen-duration-slow: calc(260ms * var(--icen-design-motion));
550
+ --icen-ease-out: cubic-bezier(.16, 1, .3, 1);
551
+ --icen-ease-bounce: var(--icen-ease-out);
552
+ --icen-hover-border: var(--icen-token-line);
553
+ --icen-hover-border-strong: var(--icen-token-line-strong);
554
+ --icen-press: scale(.985);
555
+ --icen-press-soft: scale(.99);
556
+ --icen-disabled-opacity: .48;
557
+ --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
558
+ --icen-ring-soft: 0 0 0 3px var(--icen-token-accent-subtle);
559
+ --icen-control-focus-border: var(--icen-token-accent);
560
+ --icen-control-focus-shadow: var(--icen-token-shadow-inset), var(--icen-ring-soft);
561
+ }
562
+
563
+ /* Density changes rhythm and row height, never shrinks reading text. Re-declare
564
+ * recipes at the density boundary so inherited resolved variables cannot freeze. */
565
+ :root,
566
+ :root [data-icen-density] {
567
+ --icen-design-density-scale: 1;
568
+ --icen-design-density-offset: 0px;
569
+ --icen-density-space-2xs: calc(var(--icen-design-space) * var(--icen-design-density-scale) * .5);
570
+ --icen-density-space-xs: calc(var(--icen-design-space) * var(--icen-design-density-scale));
571
+ --icen-density-space-sm: calc(var(--icen-design-space) * var(--icen-design-density-scale) * 2);
572
+ --icen-density-space-md: calc(var(--icen-design-space) * var(--icen-design-density-scale) * 3);
573
+ --icen-density-space-lg: calc(var(--icen-design-space) * var(--icen-design-density-scale) * 4);
574
+ --icen-density-space-xl: calc(var(--icen-design-space) * var(--icen-design-density-scale) * 6);
575
+ --icen-density-space-2xl: calc(var(--icen-design-space) * var(--icen-design-density-scale) * 8);
576
+ --icen-density-space-3xl: calc(var(--icen-design-space) * var(--icen-design-density-scale) * 12);
577
+ --icen-density-space-4xl: calc(var(--icen-design-space) * var(--icen-design-density-scale) * 16);
578
+ --icen-density-input-height-sm: max(28px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset) - 8px));
579
+ --icen-density-input-height-md: calc(var(--icen-design-control-height) + var(--icen-design-density-offset));
580
+ --icen-density-input-height-lg: calc(var(--icen-design-control-height) + var(--icen-design-density-offset) + 8px);
581
+ --icen-density-font-size-2xs: max(12px, calc(var(--icen-design-font-size) - 2px));
582
+ --icen-density-font-size-xs: max(12px, calc(var(--icen-design-font-size) - 2px));
583
+ --icen-density-font-size-sm: max(12px, calc(var(--icen-design-font-size) - 1px));
584
+ --icen-density-font-size-md: var(--icen-design-font-size);
585
+ --icen-density-font-size-lg: calc(var(--icen-design-font-size) + 2px);
586
+ --icen-density-font-size-xl: calc(var(--icen-design-font-size) + 6px);
587
+ --icen-density-font-size-2xl: calc(var(--icen-design-font-size) + 12px);
588
+ }
589
+ :root[data-icen-density="compact"],
590
+ :root [data-icen-density="compact"] {
591
+ --icen-design-density-scale: .75;
592
+ --icen-design-density-offset: -6px;
593
+ }
594
+ :root[data-icen-density="comfortable"],
595
+ :root [data-icen-density="comfortable"] {
596
+ --icen-design-density-scale: 1.25;
597
+ --icen-design-density-offset: 4px;
598
+ }
599
+ @media (pointer: coarse) {
600
+ :root, :root [data-icen-density] {
601
+ --icen-density-input-height-sm: max(44px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset) - 8px));
602
+ --icen-density-input-height-md: max(44px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset)));
603
+ --icen-density-input-height-lg: max(44px, calc(var(--icen-design-control-height) + var(--icen-design-density-offset) + 8px));
604
+ }
605
+ }
606
+ @media (prefers-reduced-motion: reduce) {
607
+ :root { --icen-design-motion: 0; }
608
+ }
609
+
610
+
611
+ /* ── tokens/chinese.css ── */
612
+ /* 中式 / Chinese — Song-era proportion, book typography and quiet paper planes.
613
+ * Palette-independent: the active theme supplies every pigment and semantic color.
614
+ * Display type is serif; small controls and dense information remain sans-serif.
615
+ */
616
+ :root[data-icen-style="chinese"],
617
+ :root[data-icen-style="chinese"] [data-icen-preset] {
618
+ --icen-design-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
619
+ --icen-design-font-size: 14px;
620
+ --icen-design-radius: 4px;
621
+ --icen-design-space: 4.5px;
622
+ --icen-design-control-height: 42px;
623
+ --icen-design-glass-opacity: 100%;
624
+ --icen-design-glass-blur: 0px;
625
+ --icen-radius-xs: max(0px, calc(var(--icen-design-radius) - 2px));
626
+ --icen-radius-sm: var(--icen-design-radius);
627
+ --icen-radius-md: var(--icen-design-radius);
628
+ --icen-radius-lg: calc(var(--icen-design-radius) * 2);
629
+ --icen-radius-xl: calc(var(--icen-design-radius) * 3);
630
+ --icen-radius-full: 999px;
631
+ --icen-font-body: var(--icen-design-font);
632
+ --icen-font-heading: 'Iowan Old Style', 'Palatino Linotype', 'Songti SC', 'Noto Serif CJK SC', 'Source Han Serif SC', 'STSong', 'SimSun', serif;
633
+ --icen-font-cjk: var(--icen-design-font);
634
+ --icen-line-height-body: 1.75;
635
+ --icen-line-height-heading: 1.4;
636
+ --icen-letter-spacing-body: .012em;
637
+ --icen-letter-spacing-heading: .045em;
638
+ --icen-duration-fast: calc(140ms * var(--icen-design-motion));
639
+ --icen-duration-normal: calc(240ms * var(--icen-design-motion));
640
+ --icen-duration-slow: calc(340ms * var(--icen-design-motion));
641
+ --icen-ease-out: cubic-bezier(.22, .68, .2, 1);
642
+ --icen-ease-bounce: var(--icen-ease-out);
643
+ --icen-token-surface-glass: var(--icen-token-surface);
644
+ --icen-token-shadow-card: 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .45), transparent), 0 6px 18px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .25), transparent);
645
+ --icen-token-shadow-elevated: 0 1px 3px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .65), transparent), 0 12px 30px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .55), transparent);
646
+ --icen-token-shadow-overlay: 0 2px 5px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent), 0 24px 64px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .7), transparent);
647
+ --icen-token-shadow-popover: var(--icen-token-shadow-elevated);
648
+ --icen-token-shadow-inset: inset 0 0 0 0 transparent;
649
+ --icen-token-material-light: inset 0 0 0 0 transparent;
650
+ --icen-token-top-highlight: transparent;
651
+ --icen-token-material-edge: var(--icen-token-line);
652
+ }
653
+
654
+
655
+ /* ── tokens/soviet.css ── */
656
+ /* 苏式 / Soviet — architectural mass and constructivist typographic hierarchy.
657
+ * Square slabs, strong load-bearing edges and short, deliberate feedback.
658
+ * No ideological emblems or palette overrides: color remains a separate axis.
659
+ */
660
+ :root[data-icen-style="soviet"],
661
+ :root[data-icen-style="soviet"] [data-icen-preset] {
662
+ --icen-design-font: 'Segoe UI', 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', Arial, sans-serif;
663
+ --icen-design-font-size: 14px;
664
+ --icen-design-radius: 0px;
665
+ --icen-design-space: 4px;
666
+ --icen-design-control-height: 44px;
667
+ --icen-design-glass-opacity: 100%;
668
+ --icen-design-glass-blur: 0px;
669
+ --icen-radius-xs: var(--icen-design-radius);
670
+ --icen-radius-sm: var(--icen-design-radius);
671
+ --icen-radius-md: var(--icen-design-radius);
672
+ --icen-radius-lg: var(--icen-design-radius);
673
+ --icen-radius-xl: var(--icen-design-radius);
674
+ --icen-radius-full: var(--icen-design-radius);
675
+ --icen-font-body: var(--icen-design-font);
676
+ --icen-font-heading: 'Bahnschrift', 'DIN Alternate', 'Arial Narrow', 'Helvetica Neue', 'PingFang SC', 'Microsoft YaHei', sans-serif;
677
+ --icen-font-cjk: var(--icen-design-font);
678
+ --icen-line-height-body: 1.6;
679
+ --icen-line-height-heading: 1.12;
680
+ --icen-letter-spacing-body: 0;
681
+ --icen-letter-spacing-heading: -.025em;
682
+ --icen-duration-fast: calc(90ms * var(--icen-design-motion));
683
+ --icen-duration-normal: calc(150ms * var(--icen-design-motion));
684
+ --icen-duration-slow: calc(220ms * var(--icen-design-motion));
685
+ --icen-ease-out: cubic-bezier(.2, 0, .2, 1);
686
+ --icen-ease-bounce: var(--icen-ease-out);
687
+ --icen-token-surface-glass: var(--icen-token-surface);
688
+ --icen-token-shadow-card: 0 3px 0 var(--icen-token-line);
689
+ --icen-token-shadow-elevated: 0 4px 0 var(--icen-token-line-strong), 0 12px 24px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .65), transparent);
690
+ --icen-token-shadow-overlay: 0 6px 0 var(--icen-token-line-strong), 0 24px 48px color-mix(in srgb, var(--icen-design-shadow-color) var(--icen-design-shadow-strength), transparent);
691
+ --icen-token-shadow-popover: var(--icen-token-shadow-elevated);
692
+ --icen-token-shadow-inset: inset 0 -1px 0 var(--icen-token-line);
693
+ --icen-token-material-light: inset 0 0 0 0 transparent;
694
+ --icen-token-top-highlight: transparent;
695
+ --icen-token-material-edge: var(--icen-token-line-strong);
696
+ }
697
+
698
+
699
+ /* ── tokens/pixel.css ── */
700
+ /* 像素 / Pixel — a discrete grid, print-like contours and mechanical feedback.
701
+ * This is a primitive, never a palette: every color comes from the current theme.
702
+ * Native 12px CJK glyphs, 24/36/48px display sizes, four-pixel spacing, opaque
703
+ * materials, square corners and stepped shadows. No CRT haze or flashing noise.
704
+ */
705
+ @font-face {
706
+ font-family: 'Icen Pixel';
707
+ src: url('./fonts/fusion-pixel-12px-zh-hans.woff2') format('woff2');
708
+ font-display: swap;
709
+ font-style: normal;
710
+ font-weight: 400;
1623
711
  }
1624
-
1625
- .style-retro input[type="checkbox"]:checked::after {
1626
- content: "";
1627
- display: block;
1628
- width: 6px;
1629
- height: 10px;
1630
- margin: 1px 0 0 4px;
1631
- border: solid var(--token-on-accent);
1632
- border-width: 0 2px 2px 0;
1633
- transform: rotate(45deg);
712
+ :root[data-icen-style="pixel"], :root[data-icen-style="pixel"] [data-icen-preset] {
713
+ --icen-design-font: 'Icen Pixel', ui-monospace, 'Microsoft YaHei', monospace;
714
+ --icen-design-font-size: 12px;
715
+ --icen-design-space: 4px;
716
+ --icen-design-control-height: 40px;
717
+ --icen-design-glass-opacity: 100%;
718
+ --icen-design-glass-blur: 0px;
719
+ --icen-design-motion: 0;
720
+ --icen-radius-xs: 0px;
721
+ --icen-radius-sm: 0px;
722
+ --icen-radius-md: 0px;
723
+ --icen-radius-lg: 0px;
724
+ --icen-radius-xl: 0px;
725
+ --icen-radius-full: 0px;
726
+ --icen-font-body: var(--icen-design-font);
727
+ --icen-font-heading: var(--icen-design-font);
728
+ --icen-font-cjk: var(--icen-design-font);
729
+ --icen-font-mono: var(--icen-design-font);
730
+ --icen-letter-spacing-heading: 0;
731
+ --icen-line-height-body: 2;
732
+ --icen-line-height-heading: 1.5;
733
+ --icen-token-shadow-card: 2px 2px 0 var(--icen-token-line-strong);
734
+ --icen-token-shadow-elevated: 4px 4px 0 var(--icen-token-line-strong);
735
+ --icen-token-shadow-overlay: 8px 8px 0 var(--icen-token-line-strong);
736
+ --icen-token-shadow-inset: none;
737
+ --icen-token-material-light: 0 0 0 1px var(--icen-token-line-strong);
738
+ --icen-token-top-highlight: transparent;
739
+ --icen-press: translate(2px, 2px);
740
+ --icen-press-soft: translate(2px, 2px);
741
+ --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
742
+ --icen-ring-soft: 0 0 0 2px var(--icen-token-accent);
743
+ --icen-control-focus-shadow: 0 0 0 2px var(--icen-token-accent);
744
+ --icen-ease-out: steps(1, end);
745
+ --icen-ease-bounce: steps(1, end);
1634
746
  }
1635
747
 
1636
- .style-retro input[type="radio"] {
1637
- border-radius: 0;
1638
- }
1639
748
 
1640
- .style-retro input[type="radio"]:checked::after {
1641
- content: "";
1642
- display: block;
1643
- width: 6px;
1644
- height: 6px;
1645
- margin: 3px;
1646
- background: var(--token-on-accent);
749
+ /* ── tokens/icon-masks.css ── */
750
+ /* Generated by scripts/icon-masks.ts from behaviors/icons.ts. */
751
+ :root {
752
+ --icen-token-icon-file: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6%202.5h5.5L16%207v9.5a1%201%200%200%201-1%201H5a1%201%200%200%201-1-1v-12a2%202%200%200%201%202-2ZM11.5%202.5V7H16%22%2F%3E%3C%2Fsvg%3E");
753
+ --icen-token-icon-folder: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%205a1.5%201.5%200%200%201%201.5-1.5H8l2%202h5.5A1.5%201.5%200%200%201%2017%207v8a1.5%201.5%200%200%201-1.5%201.5h-11A1.5%201.5%200%200%201%203%2015Z%22%2F%3E%3C%2Fsvg%3E");
754
+ --icen-token-icon-globe: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M17.5%2010a7.5%207.5%200%201%201-15%200%207.5%207.5%200%200%201%2015%200ZM2.5%2010h15M10%202.5c-4%204-4%2011%200%2015%204-4%204-11%200-15Z%22%2F%3E%3C%2Fsvg%3E");
755
+ --icen-token-icon-document: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6%202.5h5.5L16%207v9.5a1%201%200%200%201-1%201H5a1%201%200%200%201-1-1v-12a2%202%200%200%201%202-2ZM11.5%202.5V7H16M7%2010.5h6M7%2013.5h6%22%2F%3E%3C%2Fsvg%3E");
756
+ --icen-token-icon-agent: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%206V3M8%203h2M5%206h10a2%202%200%200%201%202%202v7a2%202%200%200%201-2%202H5a2%202%200%200%201-2-2V8a2%202%200%200%201%202-2ZM1.5%2010h1.5M17%2010h1.5M7%2010v2M13%2010v2M8%2014h4%22%2F%3E%3C%2Fsvg%3E");
757
+ --icen-token-icon-paperclip: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M14%207%208.3%2012.7a1.6%201.6%200%200%201-2.3-2.3l6.3-6.3a3.2%203.2%200%200%201%204.5%204.5l-7%207a4.7%204.7%200%200%201-6.7-6.7l7-7%22%2F%3E%3C%2Fsvg%3E");
758
+ --icen-token-icon-stop: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6.5%205h7A1.5%201.5%200%200%201%2015%206.5v7a1.5%201.5%200%200%201-1.5%201.5h-7A1.5%201.5%200%200%201%205%2013.5v-7A1.5%201.5%200%200%201%206.5%205Z%22%2F%3E%3C%2Fsvg%3E");
759
+ --icen-token-icon-terminal: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5%203.5h10a2%202%200%200%201%202%202v9a2%202%200%200%201-2%202H5a2%202%200%200%201-2-2v-9a2%202%200%200%201%202-2ZM6%207l3%203-3%203M11%2013h3%22%2F%3E%3C%2Fsvg%3E");
760
+ --icen-token-icon-branch: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6%206v8M14%206v2a4%204%200%200%201-4%204H6M8%204a2%202%200%201%201-4%200%202%202%200%200%201%204%200ZM8%2016a2%202%200%201%201-4%200%202%202%200%200%201%204%200ZM16%204a2%202%200%201%201-4%200%202%202%200%200%201%204%200Z%22%2F%3E%3C%2Fsvg%3E");
761
+ --icen-token-icon-line-numbers: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%205h2M3%2010h2M3%2015h2M8%205h9M8%2010h9M8%2015h9%22%2F%3E%3C%2Fsvg%3E");
762
+ --icen-token-icon-wrap: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%205h14M3%2010h10a3%203%200%200%201%200%206h-3M12.5%2013.5%2010%2016l2.5%202.5%22%2F%3E%3C%2Fsvg%3E");
763
+ --icen-token-icon-calendar: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5.5%204h9A2.5%202.5%200%200%201%2017%206.5v8a2.5%202.5%200%200%201-2.5%202.5h-9A2.5%202.5%200%200%201%203%2014.5v-8A2.5%202.5%200%200%201%205.5%204ZM6.5%202.5v3M13.5%202.5v3M3%208h14M6.5%2011h.1M10%2011h.1M13.5%2011h.1M6.5%2014h.1M10%2014h.1%22%2F%3E%3C%2Fsvg%3E");
764
+ --icen-token-icon-close: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6%206l8%208M14%206l-8%208%22%2F%3E%3C%2Fsvg%3E");
765
+ --icen-token-icon-check: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4.5%2010.2l3.6%203.6%207.4-7.6%22%2F%3E%3C%2Fsvg%3E");
766
+ --icen-token-icon-chevron-down: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5.5%207.75%2010%2012.25l4.5-4.5%22%2F%3E%3C%2Fsvg%3E");
767
+ --icen-token-icon-chevron-up: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M5.5%2012.25%2010%207.75l4.5%204.5%22%2F%3E%3C%2Fsvg%3E");
768
+ --icen-token-icon-chevron-right: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M7.75%205.5%2012.25%2010l-4.5%204.5%22%2F%3E%3C%2Fsvg%3E");
769
+ --icen-token-icon-chevron-left: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12.25%205.5%207.75%2010l4.5%204.5%22%2F%3E%3C%2Fsvg%3E");
770
+ --icen-token-icon-arrow-right: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%2010h13M11%204.5l5.5%205.5-5.5%205.5%22%2F%3E%3C%2Fsvg%3E");
771
+ --icen-token-icon-arrow-left: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M16.5%2010h-13M9%204.5%203.5%2010%209%2015.5%22%2F%3E%3C%2Fsvg%3E");
772
+ --icen-token-icon-arrow-up: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%2016.5v-13M4.5%209%2010%203.5%2015.5%209%22%2F%3E%3C%2Fsvg%3E");
773
+ --icen-token-icon-arrow-down: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%203.5v13M4.5%2011l5.5%205.5%205.5-5.5%22%2F%3E%3C%2Fsvg%3E");
774
+ --icen-token-icon-plus: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%204v12M4%2010h12%22%2F%3E%3C%2Fsvg%3E");
775
+ --icen-token-icon-minus: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%2010h12%22%2F%3E%3C%2Fsvg%3E");
776
+ --icen-token-icon-sort: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6%2015V4M3%207l3-3%203%203M14%205v11M11%2013l3%203%203-3%22%2F%3E%3C%2Fsvg%3E");
777
+ --icen-token-icon-search: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M13.3%2013.3%2017%2017M14.5%208.5a6%206%200%201%201-12%200%206%206%200%200%201%2012%200%22%2F%3E%3C%2Fsvg%3E");
778
+ --icen-token-icon-sun: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M13.5%2010a3.5%203.5%200%201%201-7%200%203.5%203.5%200%200%201%207%200M10%201.75v1.5M10%2016.75v1.5M1.75%2010h1.5M16.75%2010h1.5M4.17%204.17l1.06%201.06M14.77%2014.77l1.06%201.06M4.17%2015.83l1.06-1.06M14.77%205.23l1.06-1.06%22%2F%3E%3C%2Fsvg%3E");
779
+ --icen-token-icon-moon: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M17.25%2011.15A7.5%207.5%200%200%201%208.85%202.75a7.5%207.5%200%201%200%208.4%208.4Z%22%2F%3E%3C%2Fsvg%3E");
780
+ --icen-token-icon-modern: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6.5%203h7A3.5%203.5%200%200%201%2017%206.5v7a3.5%203.5%200%200%201-3.5%203.5h-7A3.5%203.5%200%200%201%203%2013.5v-7A3.5%203.5%200%200%201%206.5%203ZM7%2010l3-3%203%203-3%203Z%22%2F%3E%3C%2Fsvg%3E");
781
+ --icen-token-icon-pixel: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%203h5v5H3ZM12%203h5v5h-5ZM3%2012h5v5H3ZM12%2012h5v5h-5Z%22%2F%3E%3C%2Fsvg%3E");
782
+ --icen-token-icon-chinese: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%208c3%200%205-2%207-5%202%203%204%205%207%205M4%208h12M6%208v8m8-8v8M3%2016h14M8%2016v-5h4v5%22%2F%3E%3C%2Fsvg%3E");
783
+ --icen-token-icon-soviet: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%2017h14M5%2017V8h4v9m0-12h6v12M7%208V5h2m2%203h2m-2%203h2m-2%203h2M10%205V3h4v2%22%2F%3E%3C%2Fsvg%3E");
784
+ --icen-token-icon-more: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%209.9v.2M10%209.9v.2M16%209.9v.2%22%2F%3E%3C%2Fsvg%3E");
785
+ --icen-token-icon-copy: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M7%207h8a2%202%200%200%201%202%202v6a2%202%200%200%201-2%202H9a2%202%200%200%201-2-2V7ZM13%207V5a2%202%200%200%200-2-2H5a2%202%200%200%200-2%202v6a2%202%200%200%200%202%202h2%22%2F%3E%3C%2Fsvg%3E");
786
+ --icen-token-icon-edit: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M11.5%204.5l4%204M4%2012l9-9a1.4%201.4%200%200%201%202%200l2%202a1.4%201.4%200%200%201%200%202l-9%209-5%201Z%22%2F%3E%3C%2Fsvg%3E");
787
+ --icen-token-icon-link: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M8%206l2-2a4.2%204.2%200%200%201%206%206l-2%202M12%2014l-2%202a4.2%204.2%200%200%201-6-6l2-2M7%2013l6-6%22%2F%3E%3C%2Fsvg%3E");
788
+ --icen-token-icon-trash: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%205.5h13M7%205.5V3h6v2.5M5%205.5l.7%2011.5h8.6L15%205.5M8%209v5M12%209v5%22%2F%3E%3C%2Fsvg%3E");
789
+ --icen-token-icon-spinner: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%203a7%207%200%201%201-7%207%22%2F%3E%3C%2Fsvg%3E");
790
+ --icen-token-icon-circle-check: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M18%2010a8%208%200%201%201-16%200%208%208%200%200%201%2016%200ZM6%2010l2.7%202.7%205.3-5.4%22%2F%3E%3C%2Fsvg%3E");
791
+ --icen-token-icon-circle-error: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M18%2010a8%208%200%201%201-16%200%208%208%200%200%201%2016%200ZM7.2%207.2l5.6%205.6M12.8%207.2l-5.6%205.6%22%2F%3E%3C%2Fsvg%3E");
792
+ --icen-token-icon-circle-info: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M18%2010a8%208%200%201%201-16%200%208%208%200%200%201%2016%200ZM10%209v5M10%206.1v.15%22%2F%3E%3C%2Fsvg%3E");
793
+ --icen-token-icon-triangle-alert: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M8.7%203.5a1.5%201.5%200%200%201%202.6%200l6.4%2011.3a1.5%201.5%200%200%201-1.3%202.2H3.6a1.5%201.5%200%200%201-1.3-2.2ZM10%207.2v4.4M10%2014v.15%22%2F%3E%3C%2Fsvg%3E");
794
+ --icen-token-icon-refresh: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M16.5%207.2A7%207%200%200%200%204.3%205.9L2.5%208M2.5%203.5V8H7M3.5%2012.8a7%207%200%200%200%2012.2%201.3l1.8-2.1M13%2012h4.5v4.5%22%2F%3E%3C%2Fsvg%3E");
795
+ --icen-token-icon-external: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M11.5%203H17v5.5M17%203l-8%208M8%203H5a2%202%200%200%200-2%202v10a2%202%200%200%200%202%202h10a2%202%200%200%200%202-2v-3%22%2F%3E%3C%2Fsvg%3E");
796
+ --icen-token-icon-home: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%2010.25%2010%204l6.5%206.25M5.75%208.75v7a.75.75%200%200%200%20.75.75h7.5a.75.75%200%200%200%20.75-.75v-7%22%2F%3E%3C%2Fsvg%3E");
797
+ --icen-token-icon-settings: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%205.5h13M3.5%2010h13M3.5%2014.5h13M7%204v3M12.5%208.5v3M8%2013v3%22%2F%3E%3C%2Fsvg%3E");
798
+ --icen-token-icon-star: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%202.5l2.4%205.1%205.6.4-4.2%203.7%201.3%205.5-5.1-3-5.1%203%201.3-5.5L1.8%208l5.6-.4Z%22%2F%3E%3C%2Fsvg%3E");
799
+ --icen-token-icon-eye: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M2.2%2010s3-5.4%207.8-5.4S17.8%2010%2017.8%2010s-3%205.4-7.8%205.4S2.2%2010%202.2%2010ZM10%2012.4a2.4%202.4%200%201%200%200-4.8%202.4%202.4%200%200%200%200%204.8Z%22%2F%3E%3C%2Fsvg%3E");
800
+ --icen-token-icon-eye-off: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M2.2%2010s3-5.4%207.8-5.4S17.8%2010%2017.8%2010s-3%205.4-7.8%205.4S2.2%2010%202.2%2010ZM10%2012.4a2.4%202.4%200%201%200%200-4.8%202.4%202.4%200%200%200%200%204.8ZM3.5%203.5l13%2013%22%2F%3E%3C%2Fsvg%3E");
801
+ --icen-token-icon-inbox: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%2012.25h3.7l1.5%202.5h2.6l1.5-2.5h3.7M4.7%205.5l-1.2%206.75v3.25a1.5%201.5%200%200%200%201.5%201.5h10a1.5%201.5%200%200%200%201.5-1.5v-3.25L15.3%205.5a1.3%201.3%200%200%200-1.25-1H5.95a1.3%201.3%200%200%200-1.25%201Z%22%2F%3E%3C%2Fsvg%3E");
802
+ --icen-token-icon-bell: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%203.5a4.5%204.5%200%200%201%204.5%204.5c0%204.5%201.8%205.7%202.5%206.5H3c.7-.8%202.5-2%202.5-6.5A4.5%204.5%200%200%201%2010%203.5ZM8.5%2016.5a1.6%201.6%200%200%200%203%200%22%2F%3E%3C%2Fsvg%3E");
803
+ --icen-token-icon-users: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M13.8%2016.5v-1.5a3.5%203.5%200%200%200-3.5-3.5H6.3a3.5%203.5%200%200%200-3.5%203.5v1.5M8.3%208.9a2.7%202.7%200%201%200%200-5.4%202.7%202.7%200%200%200%200%205.4ZM16.5%2016.5v-1.3a3.3%203.3%200%200%200-2.3-3.1M12.3%203.7a2.7%202.7%200%200%201%200%205.2%22%2F%3E%3C%2Fsvg%3E");
804
+ --icen-token-icon-activity: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M17%2010h-2.6l-2%205.8L8%204.2%206%2010H3%22%2F%3E%3C%2Fsvg%3E");
805
+ --icen-token-icon-trend-up: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%2014.5l4.2-4.2%202.8%202.8%205.9-5.9M12.4%207.2h4.2v4.2%22%2F%3E%3C%2Fsvg%3E");
806
+ --icen-token-icon-trend-down: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%205.5l4.2%204.2%202.8-2.8%205.9%205.9M12.4%2012.8h4.2V8.6%22%2F%3E%3C%2Fsvg%3E");
807
+ --icen-token-icon-rocket: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%202.5c2%201.5%203.2%204%203.2%206.8%200%201.5-.3%202.9-.8%204.2H7.6c-.5-1.3-.8-2.7-.8-4.2%200-2.8%201.2-5.3%203.2-6.8ZM10%208.6a1.5%201.5%200%201%200%200-3%201.5%201.5%200%200%200%200%203ZM7.6%2012.5%205.6%2015.4c-.9.3-1.6%201-2%202M12.4%2012.5l2%202.9c.9.3%201.6%201%202%202M8.7%2013.8c0%201.8.5%203.1%201.3%204.2.8-1.1%201.3-2.4%201.3-4.2%22%2F%3E%3C%2Fsvg%3E");
808
+ --icen-token-icon-bold: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6.5%204h4.2a3%203%200%200%201%200%206H6.5M6.5%2010h5a3%203%200%200%201%200%206H6.5M6.5%204v12%22%2F%3E%3C%2Fsvg%3E");
809
+ --icen-token-icon-italic: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M8.5%204.5h7M4.5%2015.5h7M12.5%204.5l-5%2011%22%2F%3E%3C%2Fsvg%3E");
810
+ --icen-token-icon-underline: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6%204v5.5a4%204%200%200%200%208%200V4M4.5%2016h11%22%2F%3E%3C%2Fsvg%3E");
811
+ --icen-token-icon-align-left: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%204.5h13M3.5%2010h8.5M3.5%2015.5h11%22%2F%3E%3C%2Fsvg%3E");
812
+ --icen-token-icon-align-center: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%204.5h13M5.75%2010h8.5M4.5%2015.5h11%22%2F%3E%3C%2Fsvg%3E");
813
+ --icen-token-icon-align-right: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%204.5h13M8%2010h8.5M5.5%2015.5h11%22%2F%3E%3C%2Fsvg%3E");
814
+ --icen-token-icon-list: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6.5%205h10M6.5%2010h10M6.5%2015h10M3.5%205h.01M3.5%2010h.01M3.5%2015h.01%22%2F%3E%3C%2Fsvg%3E");
815
+ --icen-token-icon-server: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3%203h14a1.5%201.5%200%200%201%201.5%201.5v2A1.5%201.5%200%200%201%2017%208H3a1.5%201.5%200%200%201-1.5-1.5v-2A1.5%201.5%200%200%201%203%203ZM3%2012h14a1.5%201.5%200%200%201%201.5%201.5v2A1.5%201.5%200%200%201%2017%2017H3a1.5%201.5%200%200%201-1.5-1.5v-2A1.5%201.5%200%200%201%203%2012ZM5%205.5h.01M5%2014.5h.01%22%2F%3E%3C%2Fsvg%3E");
816
+ --icen-token-icon-sparkle: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%202.5l1.6%204.3%204.3%201.6-4.3%201.6L10%2014.3l-1.6-4.3-4.3-1.6%204.3-1.6ZM15.5%2012.5l.8%202.1%202.1.8-2.1.8-.8%202.1-.8-2.1-2.1-.8%202.1-.8Z%22%2F%3E%3C%2Fsvg%3E");
817
+ --icen-token-icon-play: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M6.5%204.8v10.4c0%20.9%201%201.5%201.8%201l8.3-5.2a1.2%201.2%200%200%200%200-2L8.3%203.8a1.2%201.2%200%200%200-1.8%201Z%22%2F%3E%3C%2Fsvg%3E");
818
+ --icen-token-icon-chart-line: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%203.5v13h13M6.5%2012l2.8-2.8%202.2%202.2%204-4.4%22%2F%3E%3C%2Fsvg%3E");
819
+ --icen-token-icon-layers: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%203.2%203.6%206.5%2010%209.8l6.4-3.3ZM4.5%2010.4%2010%2013.2l5.5-2.8M4.5%2013.6%2010%2016.4l5.5-2.8%22%2F%3E%3C%2Fsvg%3E");
820
+ --icen-token-icon-box: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M17%206%2010%203.2%203%206v8l7%202.8%207-2.8ZM3%206l7%202.8L17%206M10%209v7.8%22%2F%3E%3C%2Fsvg%3E");
821
+ --icen-token-icon-filter: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%204.5h12l-4.4%205.1v5l-3.2-1.6V9.6Z%22%2F%3E%3C%2Fsvg%3E");
822
+ --icen-token-icon-columns: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M3.5%204h13v12h-13ZM8.2%204v12M12.8%204v12%22%2F%3E%3C%2Fsvg%3E");
823
+ --icen-token-icon-download: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2020%2020%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%221.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%203.5v8M6.8%208.3%2010%2011.5l3.2-3.2M4%2015v2.5a1.5%201.5%200%200%200%201.5%201.5h9a1.5%201.5%200%200%200%201.5-1.5V15%22%2F%3E%3C%2Fsvg%3E");
824
+ }
825
+
826
+
827
+ }
828
+
829
+ @layer icen.components {
830
+ /* Material contract (default 现代 primitive; theme via data-icen-preset):
831
+ * <section data-icen-material="content|chrome|floating">arbitrary content</section>
832
+ * content = opaque reading; chrome = translucent navigation; floating = temporary
833
+ * operations. HTML primitives need no JS. Existing components consume the same
834
+ * recipes automatically. Force opaque via html[data-icen-transparency="reduced"].
835
+ * This file ships with tokens.css as well as ui.css; kit consumers need no extras.
836
+ */
837
+ /* The base layer also defines interaction defaults. Keep the primitive's
838
+ * interaction recipe in the components layer so separately imported base.css
839
+ * cannot quietly restore a different press/focus model. */
840
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) {
841
+ --icen-press: scale(.985);
842
+ --icen-press-soft: scale(.99);
843
+ --icen-hover-border: var(--icen-token-line);
844
+ --icen-hover-border-strong: var(--icen-token-line-strong);
845
+ --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
846
+ --icen-ring-soft: 0 0 0 3px var(--icen-token-accent-subtle);
847
+ --icen-control-focus-border: var(--icen-token-accent);
848
+ --icen-control-focus-shadow: var(--icen-token-shadow-inset), var(--icen-ring-soft);
849
+ --icen-disabled-opacity: .48;
850
+ }
851
+ /* Selection is a contained surface, never a check glyph. ARIA remains the source
852
+ * of truth for keyboard/assistive technology; focus has its own outer outline. */
853
+ :root :is(.icen-theme-switcher-option[aria-pressed="true"], .icen-select-option.is-selected, .icen-cascader-item.is-selected, .icen-cascader-item.is-active, .icen-tree-select-row.is-selected, .icen-tree-select-row.is-checked, .icen-menu-item[aria-checked="true"], .icen-menu-item--checked:not([aria-checked="false"]), .icen-ai-composer-popup-option[aria-selected="true"], .icen-kb-checkpoint-menu-item.is-checked) {
854
+ background: var(--icen-token-accent-subtle);
855
+ color: var(--icen-token-text);
856
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--icen-token-accent) 65%, var(--icen-token-line-soft));
857
+ }
858
+ :root :is(.icen-select-option.is-focused, .icen-cascader-item.is-focused, .icen-tree-select-row.is-focused) { outline: 1px solid var(--icen-token-outline); outline-offset: -3px; }
859
+
860
+ /* Native selection controls keep native values, keyboard behavior and mixed state,
861
+ * but their selected geometry is an inset core rather than an OS check glyph. */
862
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]) {
863
+ appearance: none;
864
+ box-sizing: border-box;
865
+ inline-size: 16px;
866
+ block-size: 16px;
867
+ flex: 0 0 auto;
868
+ border: 1.5px solid var(--icen-token-outline);
869
+ border-radius: var(--icen-radius-xs);
870
+ padding: 3px;
871
+ background: var(--icen-token-surface);
872
+ background-clip: content-box;
873
+ cursor: pointer;
1647
874
  }
1648
-
1649
- /* ══════════════════════════════════════════════════════════════
1650
- 卡片 / 面板 / 表面 — 硬像素边框
1651
- ══════════════════════════════════════════════════════════════ */
1652
-
1653
- .style-retro .surface-elevated,
1654
- .style-retro [class*="shadow-[var(--token-shadow-card)"] {
1655
- box-shadow:
1656
- 2px 2px 0 var(--token-line);
1657
- border-width: 2px;
1658
- border-style: solid;
1659
- border-color: var(--token-line-strong);
875
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):checked {
876
+ border-color: var(--icen-token-accent);
877
+ background-color: var(--icen-token-accent);
878
+ }
879
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):indeterminate {
880
+ border-color: var(--icen-token-accent);
881
+ background-color: transparent;
882
+ background-image: linear-gradient(var(--icen-token-accent),var(--icen-token-accent));
883
+ background-size: 8px 2px;
884
+ background-position: center;
885
+ background-repeat: no-repeat;
886
+ }
887
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 2px; }
888
+ @media (forced-colors: active) {
889
+ :root :is(.icen-theme-switcher-option[aria-pressed="true"], .icen-select-option.is-selected, .icen-cascader-item.is-selected, .icen-tree-select-row.is-selected, .icen-tree-select-row.is-checked, .icen-menu-item[aria-checked="true"], .icen-ai-composer-popup-option[aria-selected="true"], .icen-kb-checkpoint-menu-item.is-checked) { outline: 3px double Highlight; outline-offset: -3px; }
890
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]) { forced-color-adjust: none; border-color: CanvasText; background-color: Canvas; }
891
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):checked { background-color: Highlight; }
892
+ :root :is(input.icen-dt-check, input.icen-choice-box, .icen-form input[type="checkbox"], input[data-icen-kb-segment-clean]):indeterminate { background-image: linear-gradient(Highlight,Highlight); }
893
+ }
894
+
895
+ /* Component display rules must not override native hidden semantics. Preserve
896
+ * until-found so browser find-in-page can reveal intentionally searchable content. */
897
+ :where([class^="icen-"], [class*=" icen-"])[hidden]:not([hidden="until-found"]) {
898
+ display: none !important; /* guard:allow-important native hidden must win over component display:flex/grid */
899
+ }
900
+ :root[data-icen-design-changing] *,
901
+ :root[data-icen-design-changing] *::before,
902
+ :root[data-icen-design-changing] *::after {
903
+ transition: none !important; /* guard:allow-important palette changes must not pass through unreadable intermediate colors */
904
+ }
905
+ :root body {
906
+ font-family: var(--icen-font-body);
907
+ font-variant-numeric: normal;
908
+ font-size: var(--icen-density-font-size-md);
909
+ line-height: var(--icen-line-height-body);
910
+ letter-spacing: var(--icen-letter-spacing-body);
911
+ background: var(--icen-token-canvas);
912
+ color: var(--icen-token-text);
913
+ }
914
+ :root :is(h1,h2,h3,h4,h5,h6) {
915
+ font-family: var(--icen-font-heading);
916
+ letter-spacing: var(--icen-letter-spacing-heading);
917
+ line-height: var(--icen-line-height-heading);
918
+ text-wrap: balance;
919
+ }
920
+ :root :is(button,input,textarea,select) { font-family: var(--icen-font-body); }
921
+ :root [data-icen-material] {
922
+ background: var(--icen-token-surface);
923
+ color: var(--icen-token-text);
924
+ border: 1px solid var(--icen-token-outline-soft);
925
+ border-radius: var(--icen-radius-lg);
926
+ }
927
+ :root :is([data-icen-material="content"],.icen-card) {
928
+ background: var(--icen-token-surface);
929
+ box-shadow: none;
1660
930
  }
1661
-
1662
- /* 禁用平滑悬停提升;.lift 在 retro 下用硬投影 + 边框色变化表达悬停 */
1663
- .style-retro .lift:hover {
1664
- transform: none;
1665
- box-shadow:
1666
- 2px 2px 0 var(--token-accent);
1667
- border-color: var(--token-accent);
931
+ /* Opaque fallback is the default. Enable transparency only with browser support. */
932
+ :root :is([data-icen-material="chrome"],[data-icen-material="floating"],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
933
+ background: var(--icen-token-surface);
934
+ border-color: var(--icen-token-material-edge);
935
+ box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-elevated);
936
+ backdrop-filter: none;
937
+ -webkit-backdrop-filter: none;
1668
938
  }
1669
-
1670
- /* ══════════════════════════════════════════════════════════════
1671
- 滚动条 — 方块像素滚动条
1672
- ══════════════════════════════════════════════════════════════ */
1673
-
1674
- .style-retro * {
1675
- scrollbar-width: thin;
1676
- scrollbar-color: var(--token-accent) var(--token-bg-soft);
939
+ :root [data-icen-material="chrome"] { box-shadow: var(--icen-token-material-light); }
940
+ :root .icen-nav[data-icen-scroll-reactive]:not(.is-scrolled) {
941
+ background: var(--icen-token-surface);
942
+ backdrop-filter: none;
943
+ -webkit-backdrop-filter: none;
1677
944
  }
1678
-
1679
- .style-retro ::-webkit-scrollbar {
1680
- width: var(--token-scrollbar-size);
1681
- height: var(--token-scrollbar-size);
945
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
946
+ :root :is([data-icen-material="chrome"],[data-icen-material="floating"],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
947
+ background: var(--icen-token-surface-glass);
948
+ backdrop-filter: blur(var(--icen-design-glass-blur)) saturate(1.15);
949
+ -webkit-backdrop-filter: blur(var(--icen-design-glass-blur)) saturate(1.15);
950
+ }
951
+ }
952
+ :root .icen-nav { box-shadow: var(--icen-token-material-light); }
953
+ :root .icen-btn {
954
+ --btn-border-hover: var(--icen-token-line);
955
+ gap: var(--icen-density-space-sm);
956
+ border-radius: var(--icen-radius-md);
957
+ letter-spacing: 0;
958
+ }
959
+ :root .icen-btn-primary { --btn-border-hover: var(--icen-token-accent-strong); }
960
+ :root :is(.icen-btn-ghost,.icen-btn-link) { --btn-border-hover: transparent; }
961
+ :root .icen-btn-link { --btn-fg: var(--icen-token-accent-text); }
962
+ :root .icen-btn-primary:hover:not(:focus-visible) { box-shadow: none; }
963
+ :root .icen-btn:active:not(:disabled):not([aria-disabled="true"]):not([data-icen-disabled]):not(.is-loading) { transform: var(--icen-press-soft); }
964
+ :root .icen-btn-danger:hover { color: var(--icen-token-error); background: var(--icen-token-error-muted); }
965
+ :root .icen-segmented { padding: var(--icen-density-space-xs); gap: var(--icen-density-space-xs); }
966
+ :root .icen-segmented-item { border-radius: max(0px, calc(var(--icen-radius-md) - var(--icen-density-space-xs) - 1px)); }
967
+ :root :is(.icen-segmented-item.is-active,.icen-segmented-item[aria-checked="true"],.icen-toggle-group-btn.is-active) {
968
+ background: var(--icen-token-surface);
969
+ color: var(--icen-token-text);
970
+ box-shadow: var(--icen-token-shadow-card);
971
+ }
972
+ :root :is(.icen-menu,.icen-popover,.icen-select-panel) { border-radius: var(--icen-radius-lg); }
973
+ :root .icen-modal {
974
+ border-radius: var(--icen-radius-xl);
975
+ box-shadow: var(--icen-token-material-light), var(--icen-token-shadow-overlay);
976
+ }
977
+ :root :is(.icen-modal-backdrop,.icen-command-palette-backdrop) {
978
+ background: var(--icen-token-scrim);
979
+ backdrop-filter: none;
980
+ -webkit-backdrop-filter: none;
1682
981
  }
1683
-
1684
- .style-retro ::-webkit-scrollbar-track {
1685
- background: var(--token-bg-soft);
1686
- border: 1px solid var(--token-line);
982
+ :root .icen-card--elevated { box-shadow: var(--icen-token-shadow-card); }
983
+ :root .icen-card--interactive:hover { transform: none; border-color: var(--icen-token-line); }
984
+ :root .icen-card--interactive:focus-within { box-shadow: var(--icen-ring); }
985
+ :root .icen-switch-thumb { background: var(--icen-token-text-muted); }
986
+ :root .icen-switch[aria-checked="true"] .icen-switch-thumb { background: var(--icen-token-on-accent); }
987
+ :root .icen-input-wrap--sm { padding-inline: var(--icen-density-space-sm); }
988
+ /* 现代: small controls have a legible edge and a quiet, tactile surface. Keep
989
+ * these optical refinements local to the default primitive; other primitives
990
+ * supply their own surface physics without fighting a global component rule. */
991
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:not(.icen-btn-ghost):not(.icen-btn-link) {
992
+ box-shadow: inset 0 1px 0 color-mix(in srgb, var(--icen-token-top-highlight) 45%, transparent), 0 1px 2px color-mix(in srgb, var(--icen-design-shadow-color) calc(var(--icen-design-shadow-strength) * .35), transparent);
993
+ }
994
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:focus-visible {
995
+ box-shadow: var(--icen-ring);
996
+ }
997
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:active:not(:disabled):not([aria-disabled="true"]):not([data-icen-disabled]):not(.is-loading) {
998
+ box-shadow: var(--icen-token-shadow-inset);
999
+ }
1000
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) .icen-btn:active:focus-visible {
1001
+ box-shadow: var(--icen-token-shadow-inset), var(--icen-ring);
1002
+ }
1003
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) :is(.icen-input-wrap,.icen-textarea-wrap) {
1004
+ padding-inline: var(--icen-density-space-md);
1005
+ }
1006
+ :root:where(:not([data-icen-style]),[data-icen-style="modern"]) :is(.icen-input,.icen-textarea)::placeholder {
1007
+ color: var(--icen-token-text-faint);
1008
+ opacity: 1;
1009
+ }
1010
+ /* Data readability is explicit, never applied to every numeral in prose. */
1011
+ :root :is(.icen-numeric,.icen-table,.icen-datatable,.icen-stat-num) { font-variant-numeric: lining-nums tabular-nums; }
1012
+ /* Any translucent material has an opaque alternative, including native controls. */
1013
+ :root[data-icen-transparency="reduced"] :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
1014
+ background: var(--icen-token-surface);
1015
+ backdrop-filter: none;
1016
+ -webkit-backdrop-filter: none;
1687
1017
  }
1688
-
1689
- .style-retro ::-webkit-scrollbar-thumb {
1690
- background: var(--token-accent);
1691
- border: 1px solid var(--token-line-strong);
1692
- border-radius: 0;
1018
+ @media (prefers-reduced-transparency: reduce) {
1019
+ :root :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
1020
+ background: var(--icen-token-surface);
1021
+ backdrop-filter: none;
1022
+ -webkit-backdrop-filter: none;
1023
+ }
1024
+ }
1025
+ @media (prefers-reduced-motion: reduce) {
1026
+ :root *, :root *::before, :root *::after {
1027
+ animation-duration: .01ms !important; /* guard:allow-important accessibility override must beat component animation */
1028
+ transition-duration: .01ms !important; /* guard:allow-important accessibility override must beat component transition */
1029
+ scroll-behavior: auto !important; /* guard:allow-important reduced motion includes scrolling */
1030
+ }
1031
+ }
1032
+ @media (pointer: coarse) {
1033
+ :root :is(.icen-btn,.icen-segmented-item,.icen-menu-item,.icen-modal-close) { min-block-size: var(--icen-density-input-height-md); }
1034
+ /* Preserve the switch's visual geometry, expand its pointer target instead. */
1035
+ :root .icen-switch::before {
1036
+ content: '';
1037
+ position: absolute;
1038
+ inset-block: calc((100% - 44px) / 2);
1039
+ inset-inline: 0;
1040
+ }
1041
+ }
1042
+ @media (forced-colors: active) {
1043
+ :root :focus-visible { outline: 2px solid Highlight; outline-offset: 2px; }
1044
+ :root :is([data-icen-material],.icen-menu,.icen-popover,.icen-card--glass) {
1045
+ background: Canvas;
1046
+ color: CanvasText;
1047
+ border-color: CanvasText;
1048
+ box-shadow: none;
1049
+ backdrop-filter: none;
1050
+ -webkit-backdrop-filter: none;
1051
+ }
1052
+ :root .icen-segmented-item[aria-checked="true"] { outline: 2px solid Highlight; }
1053
+ }
1054
+
1055
+ /* Pixel adapters: inherit palette, replace surface physics. */
1056
+ :root[data-icen-style="pixel"] :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
1057
+ background: var(--icen-token-surface);
1058
+ border-color: var(--icen-token-line-strong);
1059
+ backdrop-filter: none;
1060
+ -webkit-backdrop-filter: none;
1693
1061
  }
1694
-
1695
- .style-retro ::-webkit-scrollbar-thumb:hover {
1696
- background: var(--token-accent-cold);
1062
+ :root[data-icen-style="pixel"] :is(.icen-btn,.icen-input-wrap,.icen-textarea-wrap,.icen-select-trigger,.icen-segmented,[data-icen-material],.icen-card,.icen-modal) {
1063
+ border-width: 2px;
1064
+ border-radius: var(--icen-radius-md);
1065
+ }
1066
+ :root[data-icen-style="pixel"] :is(.icen-btn,.icen-input-wrap,.icen-select-trigger) { box-shadow: var(--icen-token-shadow-card); }
1067
+ :root[data-icen-style="pixel"] :is(.icen-btn-ghost,.icen-btn-link) { box-shadow: none; }
1068
+ :root[data-icen-style="pixel"] .icen-btn:active:not(:disabled):not([aria-disabled="true"]) { box-shadow: none; }
1069
+ :root[data-icen-style="pixel"] .icen-btn:focus-visible { box-shadow: var(--icen-ring); }
1070
+ :root[data-icen-style="pixel"] .icen-input-wrap:focus-within { box-shadow: var(--icen-control-focus-shadow); }
1071
+ :root[data-icen-style="pixel"] :is(h1,h2,h3,h4,h5,h6) { font-weight: 400; letter-spacing: 0; }
1072
+ :root[data-icen-style="pixel"] h1 { font-size: 48px; }
1073
+ :root[data-icen-style="pixel"] :is(h2,h3) { font-size: 24px; }
1074
+ :root[data-icen-style="pixel"] :is(button,input,select,textarea) { font-weight: 400; }
1075
+ :root[data-icen-style="pixel"] .icen-segmented-item { border-radius: var(--icen-radius-md); }
1076
+ :root[data-icen-style="pixel"] :is(.icen-switch,.icen-switch-thumb) { border-radius: var(--icen-radius-md); }
1077
+ :root[data-icen-style="pixel"] :is(.icen-avatar,.icen-stat-icon) { border-radius: var(--icen-radius-md); }
1078
+ /* Halftone is reserved for selected/structural surfaces, never under long text. */
1079
+ :root[data-icen-style="pixel"] .icen-segmented {
1080
+ background-color: var(--icen-token-bg-soft);
1081
+ background-image: repeating-linear-gradient(135deg,transparent 0 2px,var(--icen-token-line-soft) 2px 3px,transparent 3px 5px);
1082
+ }
1083
+ :root[data-icen-style="pixel"] :is(.icen-toast,.icen-notification,.icen-tooltip,.icen-date-picker-panel,.icen-menu,.icen-popover) {
1084
+ border: 2px solid var(--icen-token-line-strong);
1085
+ box-shadow: var(--icen-token-shadow-elevated);
1086
+ }
1087
+ :root[data-icen-style="pixel"] :is(.icen-menu-item,.icen-select-option) { border-radius: var(--icen-radius-md); }
1088
+ :root[data-icen-style="pixel"] :is(.icen-menu-item,.icen-select-option).is-focused {
1089
+ outline: 2px solid var(--icen-token-accent);
1090
+ outline-offset: -2px;
1697
1091
  }
1698
-
1699
- .style-retro ::-webkit-scrollbar-button {
1700
- display: block;
1701
- width: var(--token-scrollbar-size);
1702
- height: var(--token-scrollbar-size);
1703
- background: var(--token-bg-soft);
1704
- border: 1px solid var(--token-line);
1092
+ :root[data-icen-style="pixel"] :is(.icen-progress-track,.icen-slider-track) {
1093
+ border: 1px solid var(--icen-token-line-strong);
1094
+ border-radius: var(--icen-radius-md);
1095
+ background-image: repeating-linear-gradient(90deg,transparent 0 3px,var(--icen-token-line-soft) 3px 4px);
1705
1096
  }
1706
-
1707
- .style-retro ::-webkit-scrollbar-button:hover {
1708
- background: var(--token-accent-subtle);
1097
+ /* Standalone outline, including when shadows disappear in forced colors. */
1098
+ :root[data-icen-style="pixel"] :focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 3px; }
1099
+ @media (max-width: 640px) {
1100
+ :root[data-icen-style="pixel"] h1 { font-size: 36px; }
1709
1101
  }
1710
1102
 
1711
- /* ══════════════════════════════════════════════════════════════
1712
- 光标 / caret
1713
- ══════════════════════════════════════════════════════════════ */
1714
-
1715
- .style-retro * {
1716
- caret-color: var(--token-accent);
1103
+ /* 中式 material adapter. DOM contract: html[data-icen-style="chinese"] with
1104
+ * existing ICEN components or [data-icen-material="content|chrome|floating"].
1105
+ * No additional wrappers, decorative pseudo-elements or JavaScript required.
1106
+ */
1107
+ :root[data-icen-style="chinese"] {
1108
+ --icen-press: scale(.995);
1109
+ --icen-press-soft: scale(.995);
1110
+ --icen-hover-border: var(--icen-token-line);
1111
+ --icen-hover-border-strong: var(--icen-token-line-strong);
1112
+ --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
1113
+ --icen-ring-soft: 0 0 0 3px var(--icen-token-accent-subtle);
1114
+ --icen-control-focus-shadow: var(--icen-ring-soft);
1115
+ --icen-control-focus-border: var(--icen-token-accent);
1116
+ }
1117
+ :root[data-icen-style="chinese"] :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
1118
+ background: var(--icen-token-surface);
1119
+ border-color: var(--icen-token-line);
1120
+ backdrop-filter: none;
1121
+ -webkit-backdrop-filter: none;
1717
1122
  }
1718
-
1719
- /* ══════════════════════════════════════════════════════════════
1720
- 悬停效果 — 像素高亮
1721
- ══════════════════════════════════════════════════════════════ */
1722
-
1723
- .style-retro a:hover,
1724
- .style-retro [role="link"]:hover {
1725
- text-decoration: underline;
1726
- text-decoration-style: dashed;
1727
- text-underline-offset: 3px;
1123
+ :root[data-icen-style="chinese"] :is(h1,h2,h3,h4,h5,h6,.icen-card-title,.icen-modal-title) {
1124
+ font-family: var(--icen-font-heading);
1125
+ font-weight: 500;
1126
+ letter-spacing: var(--icen-letter-spacing-heading);
1127
+ line-height: var(--icen-line-height-heading);
1728
1128
  }
1729
-
1730
- /* ══════════════════════════════════════════════════════════════
1731
- Markdown / 富文本 — 禁用圆角
1732
- ══════════════════════════════════════════════════════════════ */
1733
-
1734
- .style-retro .markdown-body img,
1735
- .style-retro .markdown-body blockquote,
1736
- .style-retro .markdown-body code,
1737
- .style-retro .markdown-body pre {
1738
- border-radius: 0;
1129
+ :root[data-icen-style="chinese"] :is(.icen-btn,.icen-page-tab,.icen-segmented-item) {
1130
+ font-family: var(--icen-font-body);
1131
+ letter-spacing: .025em;
1132
+ font-weight: 500;
1739
1133
  }
1740
-
1741
- /* ══════════════════════════════════════════════════════════════
1742
- RETRO 全局硬化 — 处理无法仅靠 token 表达的现代风残留
1743
- ══════════════════════════════════════════════════════════════ */
1744
-
1745
- /* 禁用现代毛玻璃,用实色面板替代 */
1746
- .style-retro .backdrop-blur-sm,
1747
- .style-retro .backdrop-blur-md,
1748
- .style-retro .backdrop-blur-xl,
1749
- .style-retro .backdrop-blur-2xl {
1134
+ :root[data-icen-style="chinese"] :is(.icen-card,.icen-panel,[data-icen-material="content"]) {
1135
+ border-color: var(--icen-token-line-soft);
1136
+ box-shadow: none;
1137
+ }
1138
+ :root[data-icen-style="chinese"] .icen-card--elevated { box-shadow: var(--icen-token-shadow-card); }
1139
+ :root[data-icen-style="chinese"] :is(.icen-card.is-selected,.icen-card--interactive:focus-within) { box-shadow: var(--icen-ring); }
1140
+ :root[data-icen-style="chinese"] .icen-panel-title {
1141
+ padding-block: var(--icen-density-space-md);
1142
+ color: var(--icen-token-text);
1143
+ letter-spacing: .06em;
1144
+ text-transform: none;
1145
+ }
1146
+ :root[data-icen-style="chinese"] :is(.icen-card-desc,.icen-modal-desc,.icen-panel-subtitle) { line-height: var(--icen-line-height-body); }
1147
+ :root[data-icen-style="chinese"] .icen-segmented {
1148
+ background: var(--icen-token-bg-soft);
1149
+ border-color: var(--icen-token-line-soft);
1150
+ }
1151
+ :root[data-icen-style="chinese"] :is(.icen-segmented-item.is-active,.icen-segmented-item[aria-checked="true"],.icen-toggle-group-btn.is-active) {
1152
+ box-shadow: inset 0 0 0 1px var(--icen-token-line), var(--icen-token-shadow-card);
1153
+ }
1154
+ /* A quiet ink rule makes navigation legible without changing its layout. */
1155
+ :root[data-icen-style="chinese"] .icen-tabs:not(.icen-tabs--cards):not(.icen-tabs--segment):not(.icen-tabs--vertical) .icen-page-tab { border-block-end-width: 1px; }
1156
+ :root[data-icen-style="chinese"] :is(.icen-btn,.icen-menu-item,.icen-select-option,.icen-segmented-item):focus-visible {
1157
+ outline: 2px solid var(--icen-token-accent);
1158
+ outline-offset: 3px;
1159
+ }
1160
+ @media (prefers-reduced-motion: reduce) {
1161
+ :root[data-icen-style="chinese"] { --icen-press: none; --icen-press-soft: none; }
1162
+ }
1163
+ @media (forced-colors: active) {
1164
+ :root[data-icen-style="chinese"] :is([data-icen-material],.icen-card,.icen-panel,.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-modal,.icen-nav) {
1165
+ background: Canvas;
1166
+ color: CanvasText;
1167
+ border-color: CanvasText;
1168
+ box-shadow: none;
1169
+ }
1170
+ :root[data-icen-style="chinese"] :focus-visible { outline: 2px solid Highlight; outline-offset: 3px; }
1171
+ :root[data-icen-style="chinese"] :is(.icen-card.is-selected,.icen-card--interactive:focus-within) { box-shadow: none; outline: 2px solid Highlight; outline-offset: 2px; }
1172
+ }
1173
+
1174
+ /* 苏式 material adapter. DOM contract: html[data-icen-style="soviet"] with
1175
+ * existing ICEN components or [data-icen-material="content|chrome|floating"].
1176
+ * Structural emphasis belongs to frame/header/action, not long-form text.
1177
+ */
1178
+ :root[data-icen-style="soviet"] {
1179
+ --icen-press: translateY(1px);
1180
+ --icen-press-soft: translateY(1px);
1181
+ --icen-hover-border: var(--icen-token-line-strong);
1182
+ --icen-hover-border-strong: var(--icen-token-text);
1183
+ --icen-ring: 0 0 0 2px var(--icen-token-surface), 0 0 0 4px var(--icen-token-accent);
1184
+ --icen-ring-soft: 0 0 0 2px var(--icen-token-accent-subtle);
1185
+ --icen-control-focus-shadow: inset 0 -2px 0 var(--icen-token-accent);
1186
+ --icen-control-focus-border: var(--icen-token-accent);
1187
+ }
1188
+ :root[data-icen-style="soviet"] :is([data-icen-material],.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-card--glass,.icen-nav) {
1189
+ background: var(--icen-token-surface);
1190
+ border-color: var(--icen-token-line-strong);
1750
1191
  backdrop-filter: none;
1751
1192
  -webkit-backdrop-filter: none;
1752
1193
  }
1753
-
1754
- /* 兜底:覆盖仍使用固定 Tailwind 圆角工具类的组件/页面元素。
1755
- 组件层已迁移到 radiusClass() 读取 --radius-*,但 feature 页面和
1756
- 第三方类名可能仍残留 rounded-*,这里做最后一层保险。 */
1757
- .style-retro .rounded-none { border-radius: 0; }
1758
- .style-retro .rounded-sm,
1759
- .style-retro .rounded,
1760
- .style-retro .rounded-md,
1761
- .style-retro .rounded-lg,
1762
- .style-retro .rounded-xl,
1763
- .style-retro .rounded-2xl,
1764
- .style-retro .rounded-3xl {
1765
- border-radius: var(--radius-md);
1766
- }
1767
- /* Note: we do NOT override .rounded-full globally. Components that should be
1768
- theme-aware use radiusClass('full') which reads --radius-full; elements that
1769
- are inherently circular (e.g. loading spinners) keep Tailwind's rounded-full. */
1770
-
1771
- /* 兜底:现代柔和阴影在 retro 下转为硬像素投影 */
1772
- .style-retro .shadow-sm,
1773
- .style-retro .shadow-md,
1774
- .style-retro .shadow-lg,
1775
- .style-retro .shadow-xl,
1776
- .style-retro .shadow-2xl {
1777
- box-shadow: var(--token-shadow-card);
1778
- }
1779
-
1780
- /* 非文本元素的硬像素焦点环 */
1781
- .style-retro :focus-visible:not(input):not(textarea):not(select):not([contenteditable="true"]) {
1782
- outline: 2px solid var(--token-accent);
1783
- outline-offset: -2px;
1194
+ :root[data-icen-style="soviet"] :is(h1,h2,h3,h4,h5,h6,.icen-card-title,.icen-modal-title) {
1195
+ font-family: var(--icen-font-heading);
1196
+ font-weight: 750;
1197
+ letter-spacing: var(--icen-letter-spacing-heading);
1198
+ line-height: var(--icen-line-height-heading);
1199
+ }
1200
+ /* Only display text is condensed; labels, forms and paragraphs stay comfortable. */
1201
+ :root[data-icen-style="soviet"] :is(h1,h2) { font-stretch: condensed; }
1202
+ :root[data-icen-style="soviet"] :is(.icen-btn,.icen-page-tab,.icen-panel-title,.icen-table th) {
1203
+ font-family: var(--icen-font-body);
1204
+ font-weight: 650;
1205
+ letter-spacing: .035em;
1206
+ }
1207
+ :root[data-icen-style="soviet"] :is(.icen-btn,.icen-input-wrap,.icen-textarea-wrap,.icen-select-trigger,.icen-segmented) { border-width: 2px; }
1208
+ :root[data-icen-style="soviet"] :is(.icen-btn-ghost,.icen-btn-link) { border-color: transparent; }
1209
+ :root[data-icen-style="soviet"] :is(.icen-card,.icen-panel,[data-icen-material="content"]) {
1210
+ border-color: var(--icen-token-line);
1211
+ border-block-start: 3px solid var(--icen-token-line-strong);
1784
1212
  box-shadow: none;
1785
- border-radius: var(--radius-md);
1786
1213
  }
1787
-
1788
- /* ══════════════════════════════════════════════════════════════
1789
- TERMINAL — 命令行 / CRT 终端(预留,可组合任意 dark preset)
1790
- ══════════════════════════════════════════════════════════════ */
1791
-
1792
- .style-terminal {
1793
- /* ── 字体 ── */
1794
- --font-body: ui-monospace, SFMono-Regular, "JetBrains Mono", "Courier New", "Noto Sans Mono CJK SC", "SimSun", monospace;
1795
- --font-mono: ui-monospace, SFMono-Regular, "JetBrains Mono", "Consolas", "Noto Sans Mono CJK SC", monospace;
1796
- --font-mono-paper: "JetBrains Mono", "Courier New", monospace;
1797
-
1798
- /* ── 圆角 ── */
1799
- --radius-xs: 0px;
1800
- --radius-sm: 0px;
1801
- --radius-md: 0px;
1802
- --radius-lg: 0px;
1803
- --radius-xl: 0px;
1804
- --radius-full: 0px;
1805
-
1806
- /* ── 滚动条 ── */
1807
- --token-scrollbar-size: 8px;
1808
-
1809
- /* ── 渲染 ── */
1810
- -webkit-font-smoothing: antialiased;
1811
- -moz-osx-font-smoothing: grayscale;
1214
+ :root[data-icen-style="soviet"] .icen-card--elevated { box-shadow: var(--icen-token-shadow-card); }
1215
+ :root[data-icen-style="soviet"] :is(.icen-card.is-selected,.icen-card--interactive:focus-within) { box-shadow: var(--icen-ring); }
1216
+ :root[data-icen-style="soviet"] .icen-panel-title {
1217
+ color: var(--icen-token-text);
1218
+ padding-block: var(--icen-density-space-md);
1219
+ border-block-end: 2px solid var(--icen-token-line);
1220
+ }
1221
+ :root[data-icen-style="soviet"] .icen-panel.is-collapsed .icen-panel-title { border-block-end-color: transparent; }
1222
+ :root[data-icen-style="soviet"] .icen-modal { border: 2px solid var(--icen-token-line-strong); }
1223
+ :root[data-icen-style="soviet"] :is(.icen-switch,.icen-switch-thumb) { border-radius: var(--icen-radius-sm); }
1224
+ :root[data-icen-style="soviet"] :is(.icen-segmented-item.is-active,.icen-segmented-item[aria-checked="true"],.icen-toggle-group-btn.is-active) {
1225
+ background: var(--icen-token-surface);
1226
+ box-shadow: inset 0 -3px 0 var(--icen-token-accent), inset 0 0 0 1px var(--icen-token-line);
1227
+ }
1228
+ :root[data-icen-style="soviet"] .icen-tabs:not(.icen-tabs--cards):not(.icen-tabs--segment):not(.icen-tabs--vertical) .icen-page-tab { border-block-end-width: 3px; }
1229
+ :root[data-icen-style="soviet"] :is(.icen-btn,.icen-menu-item,.icen-select-option,.icen-segmented-item):focus-visible {
1230
+ outline: 2px solid var(--icen-token-accent);
1231
+ outline-offset: 3px;
1232
+ }
1233
+ @media (prefers-reduced-motion: reduce) {
1234
+ :root[data-icen-style="soviet"] { --icen-press: none; --icen-press-soft: none; }
1235
+ }
1236
+ @media (forced-colors: active) {
1237
+ :root[data-icen-style="soviet"] :is([data-icen-material],.icen-card,.icen-panel,.icen-menu,.icen-popover,.icen-select-panel,.icen-date-picker-panel,.icen-autocomplete-panel,.icen-cascader-panel,.icen-tree-select-panel,.icen-mentions-panel,.icen-ai-composer-popup,.icen-command-palette,.icen-modal,.icen-nav) {
1238
+ background: Canvas;
1239
+ color: CanvasText;
1240
+ border-color: CanvasText;
1241
+ box-shadow: none;
1242
+ }
1243
+ :root[data-icen-style="soviet"] :is(.icen-segmented-item[aria-checked="true"],.icen-segmented-item.is-active,.icen-toggle-group-btn.is-active) { outline: 2px solid Highlight; outline-offset: -2px; }
1244
+ :root[data-icen-style="soviet"] :focus-visible { outline: 2px solid Highlight; outline-offset: 3px; }
1245
+ :root[data-icen-style="soviet"] :is(.icen-card.is-selected,.icen-card--interactive:focus-within) { box-shadow: none; outline: 2px solid Highlight; outline-offset: 2px; }
1246
+ }
1247
+
1248
+ /* Interface symbols and quiet actions. SVG is usable without this CSS; this file
1249
+ * adds optical alignment, fixed action hit areas and progressive disclosure.
1250
+ * data-icen-reveal on a labelled secondary action: parent hover/focus reveals it;
1251
+ * keyboard and coarse pointers always retain access. No layout shift on reveal. */
1252
+ .icen-symbol { display: inline-block; flex: none; vertical-align: middle; overflow: visible; }
1253
+ .icen-icon-action {
1254
+ display: inline-flex;
1255
+ align-items: center;
1256
+ justify-content: center;
1257
+ flex: 0 0 auto;
1258
+ inline-size: var(--icen-density-input-height-sm);
1259
+ block-size: var(--icen-density-input-height-sm);
1260
+ padding: 0;
1261
+ border: 0;
1262
+ border-radius: var(--icen-radius-sm);
1263
+ background: transparent;
1264
+ color: var(--icen-token-text-muted);
1265
+ cursor: pointer;
1266
+ transition: opacity var(--icen-tx-fast), background-color var(--icen-tx-fast), color var(--icen-tx-fast), transform var(--icen-tx-fast);
1267
+ }
1268
+ .icen-icon-action:hover { background: var(--icen-token-fill-1); color: var(--icen-token-text); }
1269
+ .icen-icon-action:active { transform: scale(.94); }
1270
+ .icen-icon-action:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 2px; }
1271
+ .icen-icon-action:disabled { opacity: var(--icen-disabled-opacity); pointer-events: none; }
1272
+ @media (hover: hover) and (pointer: fine) {
1273
+ .icen-icon-action[data-icen-reveal] { opacity: 0; }
1274
+ :hover > .icen-icon-action[data-icen-reveal],
1275
+ :focus-within > .icen-icon-action[data-icen-reveal],
1276
+ .icen-icon-action[data-icen-reveal]:focus-visible { opacity: 1; }
1277
+ }
1278
+ @media (pointer: coarse) {
1279
+ .icen-icon-action { min-inline-size: 44px; min-block-size: 44px; }
1280
+ }
1281
+ @media (prefers-reduced-motion: reduce) {
1282
+ .icen-icon-action { transition: none; }
1283
+ .icen-icon-action:active { transform: none; }
1284
+ }
1285
+
1286
+ :root[data-icen-style="pixel"] .icen-symbol { stroke-linecap: square; stroke-linejoin: miter; shape-rendering: crispEdges; }
1287
+
1288
+ /* Search action: enhanceSearchField(input) adds these classes to a dedicated
1289
+ wrapper and input, plus one labelled button with a decorative SVG.
1290
+ Zero specificity positioning preserves component sticky search headers. */
1291
+ :where(.icen-search-field) { position: relative; }
1292
+ .icen-search-input::-webkit-search-cancel-button,
1293
+ .icen-search-input::-webkit-search-decoration {
1294
+ -webkit-appearance: none;
1295
+ appearance: none;
1812
1296
  }
1813
-
1814
- .style-terminal body {
1815
- font-family: var(--font-body);
1816
- line-height: 1.4;
1297
+ .icen-search-clear {
1298
+ display: inline-flex;
1299
+ align-items: center;
1300
+ justify-content: center;
1301
+ inline-size: 24px;
1302
+ block-size: 24px;
1303
+ flex-shrink: 0;
1304
+ padding: 0;
1305
+ border: 0;
1306
+ border-radius: var(--icen-radius-sm);
1307
+ color: var(--icen-token-text-muted);
1308
+ background: transparent;
1309
+ cursor: pointer;
1310
+ transition: color var(--icen-tx-fast), background var(--icen-tx-fast);
1817
1311
  }
1312
+ .icen-search-clear > svg { inline-size: 16px; block-size: 16px; pointer-events: none; }
1313
+ .icen-search-clear:hover {
1314
+ color: var(--icen-token-text);
1315
+ background: var(--icen-token-surface-hover);
1316
+ }
1317
+ .icen-search-clear:focus-visible {
1318
+ outline: 2px solid var(--icen-token-accent);
1319
+ outline-offset: -2px;
1320
+ }
1321
+ @media (prefers-reduced-motion: reduce) {
1322
+ .icen-search-clear { transition: none; }
1323
+ }
1324
+
1325
+ /* Feedback actions keep their label's footprint while work is pending. */
1326
+ .icen-toast-action, .icen-notification-action { position: relative; }
1327
+ .icen-feedback-action-label { display: inline-block; }
1328
+ [aria-busy="true"] > .icen-feedback-action-label { opacity: 0; }
1329
+ .icen-feedback-action-spinner { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; pointer-events: none; }
1330
+ .icen-feedback-action-spinner > svg { inline-size: 16px; block-size: 16px; animation: icen-spin calc(var(--icen-duration-normal) * 4) linear infinite; }
1331
+ .icen-toast-action[aria-disabled="true"], .icen-notification-action[aria-disabled="true"] { cursor: progress; }
1332
+ .icen-toast-action[aria-disabled="true"]:not([aria-busy="true"]), .icen-notification-action[aria-disabled="true"]:not([aria-busy="true"]) { opacity: var(--icen-disabled-opacity); }
1333
+ .icen-feedback-error { display: block; margin-block-start: var(--icen-density-space-xs); color: var(--icen-token-error); font-size: var(--icen-density-font-size-sm); line-height: 1.5; }
1334
+ :root[data-icen-style="pixel"] .icen-feedback-action-spinner > svg { animation-timing-function: steps(8,end); }
1335
+ @media (prefers-reduced-motion: reduce) { .icen-feedback-action-spinner > svg { animation: none; } }
1336
+ .icen-suggestion-status { display: flex; align-items: center; gap: var(--icen-density-space-xs); padding: var(--icen-density-space-sm); color: var(--icen-token-text-muted); font-size: var(--icen-density-font-size-sm); line-height: var(--icen-line-height-body); }
1337
+ .icen-suggestion-symbol { display: inline-flex; align-items: center; justify-content: center; inline-size: 20px; block-size: 20px; flex: 0 0 20px; }
1338
+ .icen-suggestion-symbol > svg { inline-size: 16px; block-size: 16px; }
1339
+ .icen-suggestion-copy { flex: 1; min-inline-size: 0; overflow-wrap: anywhere; }
1340
+ .icen-suggestion-status.is-loading .icen-suggestion-symbol > svg { animation: icen-spin calc(var(--icen-duration-normal) * 4) linear infinite; }
1341
+ .icen-suggestion-retry { flex: 0 0 auto; padding-inline: var(--icen-density-space-sm); min-block-size: var(--icen-density-input-height-sm); border: 1px solid var(--icen-token-outline-soft); border-radius: var(--icen-radius-sm); background: var(--icen-token-fill-1); color: var(--icen-token-text); font: inherit; cursor: pointer; }
1342
+ .icen-suggestion-retry:focus-visible { outline: 2px solid var(--icen-token-accent); outline-offset: 1px; }
1343
+ @media (hover: hover) and (pointer: fine) { .icen-suggestion-retry:hover { background: var(--icen-token-fill-2); } }
1344
+ @media (pointer: coarse) { .icen-suggestion-retry { min-inline-size: 44px; min-block-size: 44px; } }
1345
+ :root[data-icen-style="pixel"] .icen-suggestion-status.is-loading .icen-suggestion-symbol > svg { animation-timing-function: steps(8,end); }
1346
+ @media (prefers-reduced-motion: reduce) { .icen-suggestion-status.is-loading .icen-suggestion-symbol > svg { animation: none; } }
1818
1347
 
1819
-
1820
- /* ── tokens/typography.css ── */
1821
1348
  /*
1822
- * @icen.ai/ui — Typography Tokens(icen canonical)
1823
- * 美学基调:等宽数字精密感 × 衬线书卷气(宋体标题)
1824
- * 默认(:root)即 icen 品牌形态;.style-modern 显式回退 system-ui 栈(见 style-profiles.css)
1825
- * 工具类:.font-math(数字密集区,"Numeric Math" 数学字体 + tabular-nums)
1349
+ * @icen.ai/ui — Component: input(wrapper 式输入框 / 多行 / 搜索)
1350
+ * 规格源自 opengal primitives/input.tsx;与 behaviors/input.ts 配套。
1351
+ *
1352
+ * 完整契约:
1353
+ * <div class="icen-input-wrap icen-control [--sm|--lg] [--search] [.is-error] [.is-disabled]">
1354
+ * <span class="icen-input-leading">…</span> 可选前缀(svg/icon/text)
1355
+ * <input class="icen-input" />
1356
+ * <button class="icen-input-clear" aria-label="清除">…</button> behavior 清空并聚焦
1357
+ * <button class="icen-input-pw-toggle" aria-label="切换可见性">…</button>
1358
+ * <span class="icen-input-trailing">…</span> 可选后缀(单位/字符计数等)
1359
+ * </div>
1360
+ *
1361
+ * 多行:<div class="icen-textarea-wrap icen-control" [.is-error|.is-disabled]><icen-textarea class="icen-textarea" data-icen-autosize></icen-textarea></div>
1362
+ *
1363
+ * --search 修饰:仅语义标记(让 behavior 知道这是搜索框,绑定 clear + Esc),
1364
+ * 不额外改样式;视觉上仍用 .icen-input-leading 放大镜。
1826
1365
  */
1827
1366
 
1828
- /* ── 数学/等宽数字字体(数字密集区的精密感) ── */
1829
- @font-face {
1830
- font-family: "Numeric Math";
1831
- src:
1832
- local("Cambria Math"),
1833
- local("STIX Two Math"),
1834
- local("Latin Modern Math"),
1835
- local("Asana Math");
1836
- unicode-range: U+0025-003A, U+00A5, U+2212, U+223C;
1367
+ /* ── 单行 ── */
1368
+ /* One surface recipe for composed and standalone fields. KB domain hooks share
1369
+ the same recipe; domain CSS owns width/layout, never typography or material. */
1370
+ .icen-input-wrap,
1371
+ .icen-input-control,
1372
+ .icen-kb-input,
1373
+ .icen-kb-retrieval-query,
1374
+ .icen-kb-hittest-input,
1375
+ .icen-kb-filter-field,
1376
+ .icen-kb-filter-value {
1377
+ box-sizing: border-box;
1378
+ min-inline-size: 0;
1379
+ block-size: var(--input-height, var(--icen-density-input-height-md));
1380
+ padding: 0 var(--input-padding-inline, var(--icen-density-space-sm));
1381
+ font-family: var(--icen-font-body);
1382
+ font-size: var(--input-font-size, var(--icen-density-font-size-md));
1383
+ line-height: 1.5;
1384
+ color: var(--icen-token-text);
1385
+ background: var(--icen-token-control);
1386
+ border: 1px solid var(--icen-token-outline-soft);
1387
+ border-radius: var(--icen-radius-md);
1388
+ box-shadow: var(--icen-token-shadow-inset);
1389
+ transition: border-color var(--icen-tx-fast), box-shadow var(--icen-tx-fast);
1390
+ }
1391
+ .icen-input-wrap {
1392
+ position: relative;
1393
+ display: flex;
1394
+ align-items: center;
1395
+ gap: var(--icen-density-space-xs);
1396
+ inline-size: 100%;
1837
1397
  }
1838
-
1839
- :root {
1840
- /* ── icen 品牌字体栈 ──
1841
- body/mono:IBM Plex Mono(未安装时回退系统等宽,行为与 accounts 一致,不打包 webfont)
1842
- heading:CJK 宋体系(页面标题/品牌名的书卷气) */
1843
- --font-body: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Consolas, 'Courier New', monospace;
1844
- --font-mono: var(--font-body);
1845
- --font-heading: 'Songti SC', 'STSong', 'Noto Serif SC', 'Source Han Serif SC', SimSun, serif;
1846
- --font-cjk: var(--font-heading);
1847
- --line-height-body: 1.7;
1848
- /* 独家定义(style-profiles.css 的 :root 不再重复;profile 差异化在各 .style-* 块覆盖) */
1849
- --line-height-heading: 1.2;
1398
+ :is(.icen-input-wrap,.icen-input-control,.icen-kb-input,.icen-kb-retrieval-query,.icen-kb-hittest-input,.icen-kb-filter-field,.icen-kb-filter-value):hover {
1399
+ border-color: var(--icen-hover-border);
1850
1400
  }
1851
-
1852
- /* ── 全局排版 ── */
1853
- body {
1854
- font-family: "Numeric Math", var(--font-body);
1855
- line-height: var(--line-height-body);
1856
- -webkit-font-smoothing: antialiased;
1857
- -moz-osx-font-smoothing: grayscale;
1858
- font-feature-settings: "rlig" 1, "calt" 1;
1859
- font-variant-numeric: lining-nums tabular-nums;
1401
+ :is(.icen-input-wrap,.icen-input-control,.icen-kb-input,.icen-kb-retrieval-query,.icen-kb-hittest-input,.icen-kb-filter-field,.icen-kb-filter-value):focus-within {
1402
+ outline: none;
1403
+ box-shadow: var(--icen-control-focus-shadow);
1404
+ border-color: var(--icen-control-focus-border);
1405
+ }
1406
+ .icen-input-wrap.is-error,
1407
+ .icen-input-wrap.is-error:focus-within {
1408
+ border-color: var(--icen-token-error);
1409
+ }
1410
+ .icen-input-wrap.is-error:focus-within {
1411
+ box-shadow: var(--icen-control-error-shadow);
1412
+ }
1413
+ .icen-input-wrap.is-disabled,
1414
+ .icen-input-wrap[aria-disabled='true'],
1415
+ .icen-input-wrap[data-icen-disabled] {
1416
+ opacity: var(--icen-disabled-opacity);
1417
+ background: var(--icen-token-bg-soft);
1418
+ cursor: not-allowed;
1419
+ pointer-events: none;
1420
+ }
1421
+ .icen-input-wrap.is-disabled .icen-input { cursor: not-allowed; }
1422
+
1423
+ /* 尺寸变体 */
1424
+ .icen-input-wrap--sm, .icen-input-control--sm,
1425
+ .icen-kb-input, .icen-kb-retrieval-query, .icen-kb-hittest-input, .icen-kb-filter-field, .icen-kb-filter-value {
1426
+ --input-height: var(--icen-density-input-height-sm);
1427
+ --input-padding-inline: max(8px, calc(var(--icen-density-space-sm) * 1.25));
1428
+ --input-font-size: var(--icen-density-font-size-sm);
1429
+ }
1430
+ .icen-input-wrap--lg, .icen-input-control--lg {
1431
+ --input-height: var(--icen-density-input-height-lg);
1432
+ --input-padding-inline: var(--icen-density-space-md);
1433
+ --input-font-size: var(--icen-density-font-size-lg);
1434
+ }
1435
+
1436
+ .icen-input {
1437
+ box-sizing: border-box;
1438
+ flex: 1;
1439
+ min-width: 0;
1440
+ padding: 0;
1441
+ background: transparent;
1442
+ border: none;
1443
+ outline: none;
1444
+ color: var(--icen-token-text);
1445
+ font: inherit;
1446
+ }
1447
+ .icen-input::placeholder {
1448
+ color: color-mix(in srgb, var(--icen-token-text-faint) 60%, transparent);
1449
+ }
1450
+ .icen-input:read-only {
1451
+ color: var(--icen-token-text-muted);
1452
+ cursor: default;
1453
+ }
1454
+ .icen-input::-webkit-search-cancel-button { -webkit-appearance: none; }
1455
+
1456
+ /* Composed searches use this same wrapper, font, inset and focus recipe. The
1457
+ parent search header owns only sticky placement and separation from results. */
1458
+ .icen-search-field > .icen-input-wrap { inline-size: 100%; }
1459
+ .icen-input-wrap > .icen-search-input {
1460
+ flex: 1;
1461
+ inline-size: 100%;
1462
+ min-inline-size: 0;
1463
+ block-size: auto;
1464
+ min-block-size: 0;
1465
+ padding: 0;
1466
+ border: 0;
1467
+ border-radius: 0;
1468
+ outline: none;
1469
+ box-shadow: none;
1470
+ background: transparent;
1471
+ color: var(--icen-token-text);
1472
+ font: inherit;
1473
+ }
1474
+ .icen-input-wrap > .icen-search-input:focus { border: 0; outline: none; box-shadow: none; }
1475
+ .icen-input-wrap > .icen-search-input::placeholder { color: var(--icen-token-text-muted); }
1476
+ @media (pointer: coarse) {
1477
+ .icen-input-wrap, .icen-input-control, .icen-kb-input, .icen-kb-retrieval-query, .icen-kb-hittest-input, .icen-kb-filter-field, .icen-kb-filter-value { font-size: max(16px, var(--input-font-size, var(--icen-density-font-size-md))); }
1478
+ .icen-input-wrap--sm { font-size: max(16px, var(--icen-density-font-size-sm)); }
1479
+ .icen-input-wrap--lg { font-size: max(16px, var(--icen-density-font-size-lg)); }
1480
+ .icen-input-clear, .icen-input-pw-toggle { min-inline-size: 44px; min-block-size: 44px; }
1481
+ .icen-input-wrap:has(.icen-input-clear:not([hidden]), .icen-input-pw-toggle) { min-block-size: 46px; }
1482
+ }
1483
+
1484
+ .icen-input-leading,
1485
+ .icen-input-trailing {
1486
+ display: inline-flex;
1487
+ align-items: center;
1488
+ flex-shrink: 0;
1489
+ color: var(--icen-token-text-faint);
1490
+ }
1491
+ .icen-input-leading svg, .icen-input-trailing svg { width: 14px; height: 14px; }
1492
+
1493
+ /* ── 前缀/后缀文字(单位、域名等)── */
1494
+ .icen-input-affix {
1495
+ display: inline-flex;
1496
+ align-items: center;
1497
+ flex-shrink: 0;
1498
+ padding: 0 var(--icen-density-space-xs);
1499
+ color: var(--icen-token-text-muted);
1500
+ font-size: 0.92em;
1501
+ background: var(--icen-token-fill-1);
1502
+ border-radius: var(--icen-radius-xs);
1503
+ }
1504
+
1505
+ .icen-input-clear,
1506
+ .icen-input-pw-toggle {
1507
+ display: inline-flex;
1508
+ align-items: center;
1509
+ justify-content: center;
1510
+ flex-shrink: 0;
1511
+ width: 22px; height: 22px;
1512
+ padding: 0;
1513
+ border: none;
1514
+ background: transparent;
1515
+ cursor: pointer;
1516
+ border-radius: var(--icen-radius-full);
1517
+ color: var(--icen-token-text-faint);
1518
+ transition:
1519
+ color var(--icen-tx-fast),
1520
+ background-color var(--icen-tx-fast);
1521
+ }
1522
+ .icen-input-clear:hover,
1523
+ .icen-input-pw-toggle:hover {
1524
+ color: var(--icen-token-text);
1525
+ background: var(--icen-token-surface-hover);
1526
+ }
1527
+ .icen-input-clear:focus-visible,
1528
+ .icen-input-pw-toggle:focus-visible {
1529
+ outline: none;
1530
+ box-shadow: var(--icen-ring);
1860
1531
  }
1532
+ .icen-input-clear svg, .icen-input-pw-toggle svg { width: 12px; height: 12px; }
1861
1533
 
1862
- h1, h2, h3, h4, h5, h6 {
1863
- font-family: var(--font-heading);
1864
- line-height: var(--line-height-heading);
1534
+ /* ── 多行:同一 wrapper 视觉,内部 textarea 裸奔 ── */
1535
+ .icen-textarea-wrap {
1536
+ position: relative;
1537
+ display: flex;
1538
+ width: 100%;
1539
+ background: var(--icen-token-control);
1540
+ border: 1px solid var(--icen-token-outline-soft);
1541
+ border-radius: var(--icen-radius-md);
1542
+ box-shadow: var(--icen-token-shadow-inset);
1543
+ transition: border-color var(--icen-tx-fast),
1544
+ box-shadow var(--icen-tx-fast);
1545
+ }
1546
+ .icen-textarea-wrap:hover {
1547
+ border-color: var(--icen-hover-border);
1865
1548
  }
1549
+ .icen-textarea-wrap:focus-within {
1550
+ box-shadow: var(--icen-control-focus-shadow);
1551
+ border-color: var(--icen-control-focus-border);
1552
+ }
1553
+ .icen-textarea-wrap.is-error,
1554
+ .icen-textarea-wrap.is-error:focus-within {
1555
+ border-color: var(--icen-token-error);
1556
+ box-shadow: var(--icen-control-error-shadow);
1557
+ }
1558
+ .icen-textarea-wrap.is-disabled,
1559
+ .icen-textarea-wrap[aria-disabled='true'],
1560
+ .icen-textarea-wrap[data-icen-disabled] {
1561
+ opacity: var(--icen-disabled-opacity);
1562
+ background: var(--icen-token-bg-soft);
1563
+ cursor: not-allowed;
1564
+ pointer-events: none;
1565
+ }
1566
+ .icen-textarea-wrap.is-disabled .icen-textarea { cursor: not-allowed; }
1567
+
1568
+ .icen-textarea {
1569
+ width: 100%;
1570
+ padding: var(--icen-density-space-sm) var(--icen-density-space-md);
1571
+ background: transparent;
1572
+ border: none;
1573
+ outline: none;
1574
+ resize: vertical;
1575
+ color: var(--icen-token-text);
1576
+ font: inherit;
1577
+ font-size: var(--icen-density-font-size-md);
1578
+ line-height: 1.5;
1579
+ min-height: calc(3 * 1.5em + 24px);
1580
+ }
1581
+ .icen-textarea::placeholder {
1582
+ color: color-mix(in srgb, var(--icen-token-text-faint) 60%, transparent);
1583
+ }
1584
+
1585
+ /* 字符计数(behavior 可挂到 .icen-input-wrap 或 .icen-textarea-wrap 内行内末端) */
1586
+ .icen-input-wrap--has-counter { padding-inline-end: calc(var(--icen-density-space-sm) + 48px); }
1587
+ .icen-input-wrap--has-counter .icen-input-counter {
1588
+ position: absolute;
1589
+ inset-inline-end: var(--icen-density-space-sm);
1590
+ top: 50%;
1591
+ transform: translateY(-50%);
1592
+ font-size: var(--icen-density-font-size-xs);
1593
+ color: var(--icen-token-text-faint);
1594
+ font-variant-numeric: tabular-nums;
1595
+ pointer-events: none;
1596
+ }
1597
+ .icen-input-counter {
1598
+ position: absolute;
1599
+ inset-inline-end: var(--icen-density-space-sm);
1600
+ bottom: var(--icen-density-space-xs);
1601
+ font-size: var(--icen-density-font-size-xs);
1602
+ color: var(--icen-token-text-faint);
1603
+ font-variant-numeric: tabular-nums;
1604
+ pointer-events: none;
1605
+ transition: color var(--icen-tx-fast);
1606
+ }
1607
+ .icen-input-counter.is-warn { color: var(--icen-token-warning); }
1608
+ .icen-input-counter.is-error { color: var(--icen-token-error); font-weight: 600; }
1609
+
1610
+ .icen-textarea-wrap .icen-textarea { padding-bottom: 24px; }
1611
+
1612
+ /* 有计数器时的 textarea 底部留空 */
1613
+ .icen-textarea-wrap .icen-input-counter {
1614
+ position: absolute;
1615
+ inset-inline-end: var(--icen-density-space-sm);
1616
+ bottom: var(--icen-density-space-xs);
1617
+ }
1618
+
1619
+ /* Standalone fields expose the same disabled/read-only/error feedback. */
1620
+ :is(.icen-input-control,.icen-kb-input,.icen-kb-retrieval-query,.icen-kb-hittest-input,.icen-kb-filter-field,.icen-kb-filter-value):disabled {
1621
+ opacity: var(--icen-disabled-opacity);cursor: not-allowed;background: var(--icen-token-bg-soft);
1622
+ }
1623
+ :is(.icen-input-control,.icen-kb-input,.icen-kb-retrieval-query,.icen-kb-hittest-input,.icen-kb-filter-field,.icen-kb-filter-value):read-only { color: var(--icen-token-text-muted); }
1624
+ .icen-input-control[aria-invalid='true'] { border-color: var(--icen-token-error); }
1866
1625
 
1867
- /* ── 数字密集区工具类 ── */
1868
- .font-math {
1869
- font-family: "Numeric Math", math, var(--font-body);
1870
- font-variant-numeric: lining-nums tabular-nums;
1871
1626
  }
1872
-