@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
@@ -1,54 +1,5 @@
1
- /*
2
- * Icen Design System — 风格配置 (Style Profiles)
3
- *
4
- * 这是颜色主题之上的第二层抽象:
5
- * .style-modern → 默认现代风格(不覆盖)
6
- * .style-retro → 8-bit / 红白机 / 像素风
7
- * .style-terminal → 命令行 / CRT 终端(预留)
8
- *
9
- * 规则:
10
- * 1. 这些类挂在 <html> 上,与 .clay/.piano/.art/.vangogh/.ink/.retro 共存。
11
- * 2. 只覆盖与“风格”相关的变量:字体、圆角、阴影硬度、抗锯齿、图像渲染。
12
- * 3. 颜色仍由 preset 决定,保持正交。
13
- *
14
- * 注:选择器引用的是 base.css 的交互基元(.pressable / .control / .lift),
15
- * 而非源项目 opengal 的 .og-* 命名——切换 profile 时这些基元自动获得
16
- * 对应风格的几何/边框/阴影形态。
17
- */
18
-
19
- /* ══════════════════════════════════════════════════════════════
20
- 字体资源
21
- ══════════════════════════════════════════════════════════════ */
22
-
23
- /* Press Start 2P — 经典 8-bit 像素字体(西文) */
24
- @font-face {
25
- font-family: "Pixel Retro";
26
- src:
27
- local("Press Start 2P"),
28
- local("VT323"),
29
- url("https://fonts.gstatic.com/s/pressstart2p/v15/e3t4euO8T-267oIAQAu6jDQyK3nVivM.woff2") format("woff2");
30
- font-weight: 400;
31
- font-style: normal;
32
- font-display: swap;
33
- 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;
34
- }
35
-
36
- /* 中文像素风回退:无通用免费像素中文字体,使用系统等宽/宋体保持清晰 */
37
- @font-face {
38
- font-family: "Pixel CJK Fallback";
39
- src:
40
- local("Zpix"),
41
- local("SimSun"),
42
- local("Songti SC"),
43
- local("STSong"),
44
- local("Noto Serif SC"),
45
- local("PingFang SC"),
46
- local("Microsoft YaHei");
47
- font-weight: 400;
48
- font-style: normal;
49
- font-display: swap;
50
- }
51
-
1
+ @layer icen.tokens {
2
+ /* Shared fallback defaults. Built-in primitive recipes live in design/pixel/chinese/soviet.css. */
52
3
  :root {
53
4
  /* ══════════════════════════════════════════════════════════════
54
5
  风格底层 token(兜底值)
@@ -56,507 +7,45 @@
56
7
  ══════════════════════════════════════════════════════════════ */
57
8
 
58
9
  /* ── Density 密度 ── */
59
- --density-space-xs: 0.25rem;
60
- --density-space-sm: 0.5rem;
61
- --density-space-md: 0.75rem;
62
- --density-space-lg: 1rem;
63
- --density-space-xl: 1.5rem;
64
- --density-space-2xl: 2rem;
65
- --density-space-3xl: 3rem;
66
- --density-space-4xl: 4rem;
67
- --density-input-height-sm: 28px;
68
- --density-input-height-md: 36px;
69
- --density-input-height-lg: 44px;
70
- --density-font-size-2xs: 10px;
71
- --density-font-size-xs: 11px;
72
- --density-font-size-sm: 12px;
73
- --density-font-size-md: 13px;
74
- --density-font-size-lg: 14px;
75
- --density-font-size-xl: 18px;
76
- --density-font-size-2xl: 22px;
10
+ --icen-density-space-2xs: 0.125rem;
11
+ --icen-density-space-xs: 0.25rem;
12
+ --icen-density-space-sm: 0.5rem;
13
+ --icen-density-space-md: 0.75rem;
14
+ --icen-density-space-lg: 1rem;
15
+ --icen-density-space-xl: 1.5rem;
16
+ --icen-density-space-2xl: 2rem;
17
+ --icen-density-space-3xl: 3rem;
18
+ --icen-density-space-4xl: 4rem;
19
+ --icen-density-input-height-sm: 28px;
20
+ --icen-density-input-height-md: 36px;
21
+ --icen-density-input-height-lg: 44px;
22
+ --icen-density-font-size-2xs: 10px;
23
+ --icen-density-font-size-xs: 11px;
24
+ --icen-density-font-size-sm: 12px;
25
+ --icen-density-font-size-md: 13px;
26
+ --icen-density-font-size-lg: 14px;
27
+ --icen-density-font-size-xl: 18px;
28
+ --icen-density-font-size-2xl: 22px;
77
29
 
78
30
  /* ── Motion 动效 ── */
79
- --duration-instant: 0ms;
80
- --duration-fast: 150ms;
81
- --duration-normal: 200ms;
82
- --duration-slow: 300ms;
83
- --ease-linear: linear;
84
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
85
- --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
31
+ --icen-duration-instant: 0ms;
32
+ --icen-duration-fast: 150ms;
33
+ --icen-duration-normal: 200ms;
34
+ --icen-duration-slow: 300ms;
35
+ --icen-ease-linear: linear;
36
+ --icen-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
37
+ --icen-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
86
38
 
87
39
  /* ── Typography 字体 ──
88
- --line-height-heading 不在此定义:typography.css 独家拥有(icen 品牌 1.2),
40
+ --icen-line-height-heading 不在此定义:typography.css 独家拥有(icen 品牌 1.2),
89
41
  各 .style-* profile 需要差异化时在自己的块里覆盖。 */
90
- --font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
91
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
92
- --font-mono-paper: ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Courier New', monospace;
93
- --font-heading: var(--font-body);
94
- --letter-spacing-body: 0;
95
- --letter-spacing-heading: 0;
96
- --line-height-body: 1.5;
97
- }
98
-
99
- /* ══════════════════════════════════════════════════════════════
100
- MODERN — 默认现代风格(兜底值即为现代值,显式声明便于阅读)
101
- ══════════════════════════════════════════════════════════════ */
102
-
103
- .style-modern {
104
- /* ── Density ── */
105
- --density-space-xs: 0.25rem;
106
- --density-space-sm: 0.5rem;
107
- --density-space-md: 0.75rem;
108
- --density-space-lg: 1rem;
109
- --density-space-xl: 1.5rem;
110
- --density-space-2xl: 2rem;
111
- --density-space-3xl: 3rem;
112
- --density-space-4xl: 4rem;
113
- --density-input-height-sm: 28px;
114
- --density-input-height-md: 36px;
115
- --density-input-height-lg: 44px;
116
- --density-font-size-2xs: 10px;
117
- --density-font-size-xs: 11px;
118
- --density-font-size-sm: 12px;
119
- --density-font-size-md: 13px;
120
- --density-font-size-lg: 14px;
121
- --density-font-size-xl: 18px;
122
- --density-font-size-2xl: 22px;
123
-
124
- /* ── Motion ── */
125
- --duration-fast: 150ms;
126
- --duration-normal: 200ms;
127
- --duration-slow: 300ms;
128
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
129
-
130
- /* ── Typography ── */
131
- --font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
132
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
133
- --font-mono-paper: ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Courier New', monospace;
134
- --font-heading: var(--font-body);
135
- --letter-spacing-body: 0;
136
- --letter-spacing-heading: 0;
137
- --line-height-body: 1.5;
138
- --line-height-heading: 1.2;
139
- }
140
-
141
- /* ══════════════════════════════════════════════════════════════
142
- RETRO — 8-bit / 红白机 / 像素风
143
- ══════════════════════════════════════════════════════════════ */
144
-
145
- .style-retro {
146
- /* ── Density:像素风更紧凑 ── */
147
- --density-space-xs: 0.125rem;
148
- --density-space-sm: 0.25rem;
149
- --density-space-md: 0.5rem;
150
- --density-space-lg: 0.75rem;
151
- --density-space-xl: 1rem;
152
- --density-space-2xl: 1.5rem;
153
- --density-space-3xl: 2rem;
154
- --density-space-4xl: 3rem;
155
- --density-input-height-sm: 24px;
156
- --density-input-height-md: 32px;
157
- --density-input-height-lg: 40px;
158
- --density-font-size-2xs: 9px;
159
- --density-font-size-xs: 9px;
160
- --density-font-size-sm: 10px;
161
- --density-font-size-md: 11px;
162
- --density-font-size-lg: 12px;
163
- --density-font-size-xl: 14px;
164
- --density-font-size-2xl: 16px;
165
-
166
- /* ── Motion:像素风瞬间切换 ── */
167
- --duration-fast: 0ms;
168
- --duration-normal: 0ms;
169
- --duration-slow: 0ms;
170
- --ease-out: linear;
171
-
172
- /* ── Typography:像素字体 ── */
173
- --font-body: "Pixel Retro", "Pixel CJK Fallback", "Press Start 2P", "VT323", "SimSun", "Songti SC", "STSong", monospace;
174
- --font-mono: "Pixel Retro", "VT323", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
175
- --font-mono-paper: "Pixel Retro", "JetBrains Mono", "Courier New", monospace;
176
- --font-heading: "Pixel Retro", "Press Start 2P", "VT323", var(--font-body);
177
- --letter-spacing-body: 0.02em;
178
- --letter-spacing-heading: 0.04em;
179
- --line-height-body: 1.5;
180
- --line-height-heading: 1.2;
181
-
182
- /* ── 圆角:像素风几乎无圆角 ── */
183
- --radius-xs: 0px;
184
- --radius-sm: 0px;
185
- --radius-md: 2px;
186
- --radius-lg: 2px;
187
- --radius-xl: 2px;
188
- --radius-full: 0px;
189
-
190
- /* ── 滚动条 ── */
191
- --token-scrollbar-size: 10px;
192
-
193
- /* ── icen 原语覆盖:retro 的聚焦环/按下/悬停全部像素化 ── */
194
- --icen-ring: 2px solid var(--token-accent);
195
- --icen-ring-soft: 2px solid var(--token-accent);
196
- --icen-ring-error: 2px solid var(--token-error);
197
- --icen-ring-success: 2px solid var(--token-success);
198
- --icen-press: translate(2px, 2px);
199
- --icen-press-soft: translate(1px, 1px);
200
- --icen-hover-border: var(--token-accent);
201
- --icen-hover-border-strong: var(--token-accent);
202
- --icen-control-focus-shadow: inset 2px 2px 0 var(--token-line-soft), inset -1px -1px 0 var(--token-surface-strong);
203
- --icen-control-focus-border: var(--token-accent);
204
- --icen-control-error-shadow: inset 2px 2px 0 var(--token-line-soft), inset -1px -1px 0 var(--token-surface-strong);
205
-
206
- /* ── 渲染 ── */
207
- image-rendering: pixelated;
208
- -webkit-font-smoothing: none;
209
- -moz-osx-font-smoothing: unset;
210
- }
211
-
212
- /* 全局排版覆盖 */
213
- .style-retro body {
214
- font-family: "Numeric Math", var(--font-body);
215
- line-height: var(--line-height-body);
216
- letter-spacing: var(--letter-spacing-body);
217
- }
218
-
219
- /* 标题强化像素感 */
220
- .style-retro h1,
221
- .style-retro h2,
222
- .style-retro h3,
223
- .style-retro h4,
224
- .style-retro h5,
225
- .style-retro h6 {
226
- font-family: var(--font-heading);
227
- letter-spacing: var(--letter-spacing-heading);
228
- line-height: var(--line-height-heading);
229
- text-transform: uppercase;
230
- }
231
-
232
- /* ══════════════════════════════════════════════════════════════
233
- 按钮 / 可点击元素 — 8-bit 像素按钮
234
- base.css 的 .pressable / 原生 button / [role=button] / 复位按钮
235
- 注:聚焦环 / 按下形变 / 悬停边框 由 --icen-* 原语驱动,
236
- 在 .style-retro 块里已统一覆盖;这里只补"按钮的像素投影",
237
- 这是 .pressable::after 高光无法表达的形态。
238
- ══════════════════════════════════════════════════════════════ */
239
-
240
- .style-retro .pressable,
241
- .style-retro button,
242
- .style-retro [role="button"],
243
- .style-retro input[type="button"],
244
- .style-retro input[type="submit"],
245
- .style-retro input[type="reset"] {
246
- position: relative;
247
- border-radius: var(--radius-md);
248
- border: 2px solid var(--token-line-strong);
249
- box-shadow:
250
- inset -2px -2px 0 var(--token-line-soft),
251
- inset 2px 2px 0 var(--token-surface-strong),
252
- 2px 2px 0 var(--token-line);
253
- transition: all var(--duration-fast) var(--ease-out);
254
- }
255
-
256
- /* 禁用 .pressable::after 的现代渐变高光,retro 用硬投影表达层级 */
257
- .style-retro .pressable::after,
258
- .style-retro button::after {
259
- display: none;
260
- }
261
-
262
- /* 悬停:边框高亮(聚焦环由 --icen-ring 接管,不再硬覆盖 outline) */
263
- .style-retro .pressable:hover,
264
- .style-retro button:hover,
265
- .style-retro [role="button"]:hover {
266
- border-color: var(--token-accent);
267
- }
268
-
269
- /* 按下:内移 + 阴影消失(位移值由 --icen-press 驱动) */
270
- .style-retro .pressable:active,
271
- .style-retro button:active,
272
- .style-retro [role="button"]:active {
273
- box-shadow:
274
- inset -2px -2px 0 var(--token-line-soft),
275
- inset 2px 2px 0 var(--token-surface-strong);
276
- }
277
-
278
- /* 禁用状态 */
279
- .style-retro .pressable:where(:disabled, [aria-disabled="true"], [data-disabled]),
280
- .style-retro button:disabled {
281
- box-shadow: none;
282
- outline: none;
283
- }
284
-
285
- /* ══════════════════════════════════════════════════════════════
286
- 输入框 / 表单元素 — 像素输入框
287
- base.css 的 .control 是 wrapper 基元;原生 input/textarea/select 同样适用
288
- 注:聚焦阴影/边框已由 --icen-control-focus-* 接管,这里只补像素 inset 阴影
289
- ══════════════════════════════════════════════════════════════ */
290
-
291
- .style-retro .control,
292
- .style-retro input,
293
- .style-retro textarea,
294
- .style-retro select {
295
- border-radius: var(--radius-md);
296
- border: 2px solid var(--token-line);
297
- background: var(--token-bg);
298
- box-shadow:
299
- inset 2px 2px 0 var(--token-line-soft),
300
- inset -1px -1px 0 var(--token-surface-strong);
301
- transition: none;
302
- }
303
-
304
- /* 被 .control 容器包裹的输入框:自身边框透明化,
305
- 完全交给外层容器承担像素边框,避免常驻/聚焦状态出现双层内框。 */
306
- .style-retro .control input:not([type="checkbox"]):not([type="radio"]),
307
- .style-retro .control textarea,
308
- .style-retro .control select,
309
- .style-retro .control [contenteditable="true"] {
310
- border-color: transparent !important;
311
- box-shadow: none !important;
312
- background: transparent !important;
313
- }
314
-
315
- .style-retro input:hover,
316
- .style-retro textarea:hover,
317
- .style-retro select:hover,
318
- .style-retro .control:hover {
319
- border-color: var(--icen-hover-border);
320
- }
321
-
322
- /* 文本输入区自身无焦点环,完全交给外层容器;
323
- .control:focus-within 的 box-shadow / border 由 --icen-control-focus-* 自动驱动 */
324
- .style-retro input:focus,
325
- .style-retro textarea:focus,
326
- .style-retro select:focus,
327
- .style-retro input:focus-visible,
328
- .style-retro textarea:focus-visible,
329
- .style-retro select:focus-visible,
330
- .style-retro [contenteditable="true"]:focus,
331
- .style-retro [contenteditable="true"]:focus-visible {
332
- outline: none !important;
333
- box-shadow: none !important;
334
- border-color: transparent !important;
335
- }
336
-
337
- /* 占位符文字 */
338
- .style-retro input::placeholder,
339
- .style-retro textarea::placeholder {
340
- color: var(--token-text-faint);
341
- opacity: 0.7;
342
- }
343
-
344
- /* ══════════════════════════════════════════════════════════════
345
- 开关 / 复选框 — 像素开关
346
- ══════════════════════════════════════════════════════════════ */
347
-
348
- .style-retro input[type="checkbox"],
349
- .style-retro input[type="radio"] {
350
- appearance: none;
351
- width: 16px;
352
- height: 16px;
353
- border: 2px solid var(--token-line-strong);
354
- background: var(--token-bg);
355
- box-shadow:
356
- inset -2px -2px 0 var(--token-line-soft),
357
- inset 2px 2px 0 var(--token-surface-strong);
358
- cursor: pointer;
359
- }
360
-
361
- .style-retro input[type="checkbox"]:checked,
362
- .style-retro input[type="radio"]:checked {
363
- background: var(--token-accent);
364
- border-color: var(--token-accent);
365
- box-shadow:
366
- inset 2px 2px 0 color-mix(in srgb, var(--token-on-accent) 50%, transparent),
367
- inset -2px -2px 0 color-mix(in srgb, var(--token-accent-cold) 30%, transparent);
368
- }
369
-
370
- .style-retro input[type="checkbox"]:checked::after {
371
- content: "";
372
- display: block;
373
- width: 6px;
374
- height: 10px;
375
- margin: 1px 0 0 4px;
376
- border: solid var(--token-on-accent);
377
- border-width: 0 2px 2px 0;
378
- transform: rotate(45deg);
379
- }
380
-
381
- .style-retro input[type="radio"] {
382
- border-radius: 0;
383
- }
384
-
385
- .style-retro input[type="radio"]:checked::after {
386
- content: "";
387
- display: block;
388
- width: 6px;
389
- height: 6px;
390
- margin: 3px;
391
- background: var(--token-on-accent);
392
- }
393
-
394
- /* ══════════════════════════════════════════════════════════════
395
- 卡片 / 面板 / 表面 — 硬像素边框
396
- ══════════════════════════════════════════════════════════════ */
397
-
398
- .style-retro .surface-elevated,
399
- .style-retro [class*="shadow-[var(--token-shadow-card)"] {
400
- box-shadow:
401
- 2px 2px 0 var(--token-line);
402
- border-width: 2px;
403
- border-style: solid;
404
- border-color: var(--token-line-strong);
405
- }
406
-
407
- /* 禁用平滑悬停提升;.lift 在 retro 下用硬投影 + 边框色变化表达悬停 */
408
- .style-retro .lift:hover {
409
- transform: none;
410
- box-shadow:
411
- 2px 2px 0 var(--token-accent);
412
- border-color: var(--token-accent);
413
- }
414
-
415
- /* ══════════════════════════════════════════════════════════════
416
- 滚动条 — 方块像素滚动条
417
- ══════════════════════════════════════════════════════════════ */
418
-
419
- .style-retro * {
420
- scrollbar-width: thin;
421
- scrollbar-color: var(--token-accent) var(--token-bg-soft);
422
- }
423
-
424
- .style-retro ::-webkit-scrollbar {
425
- width: var(--token-scrollbar-size);
426
- height: var(--token-scrollbar-size);
427
- }
428
-
429
- .style-retro ::-webkit-scrollbar-track {
430
- background: var(--token-bg-soft);
431
- border: 1px solid var(--token-line);
432
- }
433
-
434
- .style-retro ::-webkit-scrollbar-thumb {
435
- background: var(--token-accent);
436
- border: 1px solid var(--token-line-strong);
437
- border-radius: 0;
438
- }
439
-
440
- .style-retro ::-webkit-scrollbar-thumb:hover {
441
- background: var(--token-accent-cold);
442
- }
443
-
444
- .style-retro ::-webkit-scrollbar-button {
445
- display: block;
446
- width: var(--token-scrollbar-size);
447
- height: var(--token-scrollbar-size);
448
- background: var(--token-bg-soft);
449
- border: 1px solid var(--token-line);
450
- }
451
-
452
- .style-retro ::-webkit-scrollbar-button:hover {
453
- background: var(--token-accent-subtle);
454
- }
455
-
456
- /* ══════════════════════════════════════════════════════════════
457
- 光标 / caret
458
- ══════════════════════════════════════════════════════════════ */
459
-
460
- .style-retro * {
461
- caret-color: var(--token-accent);
462
- }
463
-
464
- /* ══════════════════════════════════════════════════════════════
465
- 悬停效果 — 像素高亮
466
- ══════════════════════════════════════════════════════════════ */
467
-
468
- .style-retro a:hover,
469
- .style-retro [role="link"]:hover {
470
- text-decoration: underline;
471
- text-decoration-style: dashed;
472
- text-underline-offset: 3px;
473
- }
474
-
475
- /* ══════════════════════════════════════════════════════════════
476
- Markdown / 富文本 — 禁用圆角
477
- ══════════════════════════════════════════════════════════════ */
478
-
479
- .style-retro .markdown-body img,
480
- .style-retro .markdown-body blockquote,
481
- .style-retro .markdown-body code,
482
- .style-retro .markdown-body pre {
483
- border-radius: 0;
484
- }
485
-
486
- /* ══════════════════════════════════════════════════════════════
487
- RETRO 全局硬化 — 处理无法仅靠 token 表达的现代风残留
488
- ══════════════════════════════════════════════════════════════ */
489
-
490
- /* 禁用现代毛玻璃,用实色面板替代 */
491
- .style-retro .backdrop-blur-sm,
492
- .style-retro .backdrop-blur-md,
493
- .style-retro .backdrop-blur-xl,
494
- .style-retro .backdrop-blur-2xl {
495
- backdrop-filter: none;
496
- -webkit-backdrop-filter: none;
497
- }
498
-
499
- /* 兜底:覆盖仍使用固定 Tailwind 圆角工具类的组件/页面元素。
500
- 组件层已迁移到 radiusClass() 读取 --radius-*,但 feature 页面和
501
- 第三方类名可能仍残留 rounded-*,这里做最后一层保险。 */
502
- .style-retro .rounded-none { border-radius: 0; }
503
- .style-retro .rounded-sm,
504
- .style-retro .rounded,
505
- .style-retro .rounded-md,
506
- .style-retro .rounded-lg,
507
- .style-retro .rounded-xl,
508
- .style-retro .rounded-2xl,
509
- .style-retro .rounded-3xl {
510
- border-radius: var(--radius-md);
511
- }
512
- /* Note: we do NOT override .rounded-full globally. Components that should be
513
- theme-aware use radiusClass('full') which reads --radius-full; elements that
514
- are inherently circular (e.g. loading spinners) keep Tailwind's rounded-full. */
515
-
516
- /* 兜底:现代柔和阴影在 retro 下转为硬像素投影 */
517
- .style-retro .shadow-sm,
518
- .style-retro .shadow-md,
519
- .style-retro .shadow-lg,
520
- .style-retro .shadow-xl,
521
- .style-retro .shadow-2xl {
522
- box-shadow: var(--token-shadow-card);
523
- }
524
-
525
- /* 非文本元素的硬像素焦点环 */
526
- .style-retro :focus-visible:not(input):not(textarea):not(select):not([contenteditable="true"]) {
527
- outline: 2px solid var(--token-accent);
528
- outline-offset: -2px;
529
- box-shadow: none;
530
- border-radius: var(--radius-md);
531
- }
532
-
533
- /* ══════════════════════════════════════════════════════════════
534
- TERMINAL — 命令行 / CRT 终端(预留,可组合任意 dark preset)
535
- ══════════════════════════════════════════════════════════════ */
536
-
537
- .style-terminal {
538
- /* ── 字体 ── */
539
- --font-body: ui-monospace, SFMono-Regular, "JetBrains Mono", "Courier New", "Noto Sans Mono CJK SC", "SimSun", monospace;
540
- --font-mono: ui-monospace, SFMono-Regular, "JetBrains Mono", "Consolas", "Noto Sans Mono CJK SC", monospace;
541
- --font-mono-paper: "JetBrains Mono", "Courier New", monospace;
542
-
543
- /* ── 圆角 ── */
544
- --radius-xs: 0px;
545
- --radius-sm: 0px;
546
- --radius-md: 0px;
547
- --radius-lg: 0px;
548
- --radius-xl: 0px;
549
- --radius-full: 0px;
550
-
551
- /* ── 滚动条 ── */
552
- --token-scrollbar-size: 8px;
553
-
554
- /* ── 渲染 ── */
555
- -webkit-font-smoothing: antialiased;
556
- -moz-osx-font-smoothing: grayscale;
42
+ --icen-font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
43
+ --icen-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
44
+ --icen-font-mono-paper: ui-monospace, SFMono-Regular, 'JetBrains Mono', 'Courier New', monospace;
45
+ --icen-font-heading: var(--icen-font-body);
46
+ --icen-letter-spacing-body: 0;
47
+ --icen-letter-spacing-heading: 0;
48
+ --icen-line-height-body: 1.5;
557
49
  }
558
50
 
559
- .style-terminal body {
560
- font-family: var(--font-body);
561
- line-height: 1.4;
562
51
  }