@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,255 +0,0 @@
1
- /*
2
- * @icen.ai/ui — Retro 效果层(按需引入)
3
- *
4
- * 与 tokens.css 不同,本文件 **不** 进 tokens.css 拼合,需显式 import:
5
- * import '@icen.ai/ui/retro-effects.css';
6
- *
7
- * 仅在 <html class="style-retro">(或叠加 .dark)激活时生效,对其它风格无副作用:
8
- * - CRT 扫描线 + 暗角 + 颗粒噪点
9
- * - 游走扫描光
10
- * - RGB 色散 / 霓虹发光(暗色)
11
- * - 像素边框 / 像素按钮 / 像素分隔线工具类
12
- * - 开机自检 / 打字机光标 / 页面闪白动画
13
- *
14
- * 作用域约定:效果类(扫描线/噪点/光标/开机行/闪白)均收在 .style-retro 下;
15
- * 像素工具类(.retro-pixel-border / .retro-pixel-button / .retro-pixel-rule)
16
- * 有意保持全局可用——它们是纯几何装饰,任何风格都可取用。
17
- * z-index 统一走 base.css 的 --z-fx 标尺(效果层,tooltip 之上)。
18
- *
19
- * 所有动画尊重 prefers-reduced-motion:在 reduce 下由 base.css 的全局兜底降为 0.01ms。
20
- */
21
-
22
- /* ══════════════════════════════════════════════════════════════
23
- CRT 显示器效果
24
- ══════════════════════════════════════════════════════════════ */
25
-
26
- /* CRT 扫描线 overlay */
27
- .style-retro body::before {
28
- content: "";
29
- position: fixed;
30
- inset: 0;
31
- pointer-events: none;
32
- z-index: calc(var(--z-fx) - 1);
33
- opacity: 0.14;
34
- background:
35
- repeating-linear-gradient(
36
- 0deg,
37
- transparent,
38
- transparent 2px,
39
- rgba(0, 0, 0, 0.35) 2px,
40
- rgba(0, 0, 0, 0.35) 4px
41
- );
42
- mix-blend-mode: multiply;
43
- }
44
-
45
- .style-retro.dark body::before {
46
- opacity: 0.22;
47
- mix-blend-mode: screen;
48
- }
49
-
50
- /* CRT 暗角 + 轻微曲面 */
51
- .style-retro body::after {
52
- content: "";
53
- position: fixed;
54
- inset: 0;
55
- pointer-events: none;
56
- z-index: calc(var(--z-fx) - 2);
57
- background:
58
- radial-gradient(
59
- ellipse at center,
60
- transparent 55%,
61
- rgba(0, 0, 0, 0.18) 100%
62
- );
63
- opacity: 0.55;
64
- }
65
-
66
- /* CRT 颗粒噪点 */
67
- @keyframes retro-grain {
68
- 0%, 100% { background-position: 0 0; }
69
- 10% { background-position: -5% -10%; }
70
- 20% { background-position: -15% 5%; }
71
- 30% { background-position: 7% -25%; }
72
- 40% { background-position: -5% 25%; }
73
- 50% { background-position: -15% 10%; }
74
- 60% { background-position: 15% 0%; }
75
- 70% { background-position: 0% 15%; }
76
- 80% { background-position: 3% 35%; }
77
- 90% { background-position: -10% 10%; }
78
- }
79
-
80
- .style-retro .retro-crt-grain {
81
- position: fixed;
82
- inset: 0;
83
- pointer-events: none;
84
- z-index: calc(var(--z-fx) - 3);
85
- opacity: 0.06;
86
- background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");
87
- animation: retro-grain 0.5s steps(10) infinite;
88
- }
89
-
90
- /* ══════════════════════════════════════════════════════════════
91
- 全局动画关键帧 + 游走扫描光
92
- ══════════════════════════════════════════════════════════════ */
93
-
94
- @keyframes retro-blink {
95
- 0%, 49% { opacity: 1; }
96
- 50%, 100% { opacity: 0; }
97
- }
98
-
99
- @keyframes retro-scanline-slide {
100
- 0% { transform: translateY(-100%); }
101
- 100% { transform: translateY(100vh); }
102
- }
103
-
104
- /* 游走的扫描线(偶尔闪过)—— 仅 .style-retro 下生效 */
105
- .style-retro .retro-scanline-beam {
106
- position: fixed;
107
- left: 0;
108
- right: 0;
109
- height: 4px;
110
- background: linear-gradient(
111
- 180deg,
112
- transparent,
113
- color-mix(in srgb, var(--token-accent) 30%, transparent),
114
- transparent
115
- );
116
- pointer-events: none;
117
- z-index: calc(var(--z-fx) - 4);
118
- opacity: 0.4;
119
- animation: retro-scanline-slide 4s linear infinite;
120
- }
121
-
122
- /* ══════════════════════════════════════════════════════════════
123
- 开机自检 / 打字机效果
124
- ══════════════════════════════════════════════════════════════ */
125
-
126
- @keyframes retro-boot-text {
127
- 0% { opacity: 0; transform: translateY(4px); }
128
- 10% { opacity: 1; transform: translateY(0); }
129
- 90% { opacity: 1; transform: translateY(0); }
130
- 100% { opacity: 0; transform: translateY(-4px); }
131
- }
132
-
133
- .style-retro .retro-boot-line {
134
- opacity: 0;
135
- animation: retro-boot-text 0.3s steps(1) forwards;
136
- }
137
-
138
- .style-retro .retro-boot-line:nth-child(1) { animation-delay: 0.1s; }
139
- .style-retro .retro-boot-line:nth-child(2) { animation-delay: 0.25s; }
140
- .style-retro .retro-boot-line:nth-child(3) { animation-delay: 0.4s; }
141
- .style-retro .retro-boot-line:nth-child(4) { animation-delay: 0.55s; }
142
- .style-retro .retro-boot-line:nth-child(5) { animation-delay: 0.7s; }
143
-
144
- /* 打字机光标 */
145
- .style-retro .retro-cursor::after {
146
- content: "█";
147
- display: inline-block;
148
- margin-left: 2px;
149
- color: var(--token-accent);
150
- animation: retro-blink 1s step-end infinite;
151
- }
152
-
153
- /* ══════════════════════════════════════════════════════════════
154
- RGB 色散 / 霓虹发光(暗色下尤其出彩)
155
- ══════════════════════════════════════════════════════════════ */
156
-
157
- .style-retro.dark .retro-glow {
158
- text-shadow:
159
- -1px 0 0 rgba(255, 0, 0, 0.4),
160
- 1px 0 0 rgba(0, 255, 255, 0.4),
161
- 0 0 2px var(--token-accent),
162
- 0 0 8px var(--token-accent);
163
- }
164
-
165
- .style-retro.dark .retro-glow-cold {
166
- text-shadow:
167
- -1px 0 0 rgba(255, 0, 0, 0.4),
168
- 1px 0 0 rgba(0, 255, 255, 0.4),
169
- 0 0 2px var(--token-accent-cold),
170
- 0 0 8px var(--token-accent-cold);
171
- }
172
-
173
- /* 亮色模式下发光退化为单层硬投影,保持像素感而不刺眼 */
174
- .style-retro:not(.dark) .retro-glow {
175
- text-shadow:
176
- 1px 1px 0 color-mix(in srgb, var(--token-accent) 30%, transparent);
177
- }
178
-
179
- /* ══════════════════════════════════════════════════════════════
180
- 像素边框工具类(任意风格下可用,但与 retro 最契合)
181
- ══════════════════════════════════════════════════════════════ */
182
-
183
- .retro-pixel-border {
184
- border: 2px solid var(--token-line);
185
- box-shadow:
186
- 2px 2px 0 var(--token-line-strong),
187
- inset 2px 2px 0 var(--token-surface-strong),
188
- inset -2px -2px 0 var(--token-line-soft);
189
- }
190
-
191
- .retro-pixel-border-accent {
192
- border: 2px solid var(--token-accent);
193
- box-shadow:
194
- 2px 2px 0 var(--token-accent-cold),
195
- inset 2px 2px 0 color-mix(in srgb, var(--token-accent) 20%, transparent),
196
- inset -2px -2px 0 color-mix(in srgb, var(--token-accent) 40%, transparent);
197
- }
198
-
199
- /* 像素按钮:硬投影 + 按下内移 */
200
- .retro-pixel-button {
201
- position: relative;
202
- border: 2px solid var(--token-line-strong);
203
- box-shadow:
204
- inset -2px -2px 0 var(--token-line-soft),
205
- inset 2px 2px 0 var(--token-surface-strong),
206
- 2px 2px 0 var(--token-line);
207
- transition: none;
208
- }
209
-
210
- .retro-pixel-button:active {
211
- transform: translate(2px, 2px);
212
- box-shadow:
213
- inset -2px -2px 0 var(--token-line-soft),
214
- inset 2px 2px 0 var(--token-surface-strong);
215
- }
216
-
217
- /* ══════════════════════════════════════════════════════════════
218
- 选中文字 / 像素分隔线
219
- ══════════════════════════════════════════════════════════════ */
220
-
221
- .style-retro ::selection {
222
- background: var(--token-accent);
223
- color: var(--token-on-accent);
224
- }
225
-
226
- .retro-pixel-rule {
227
- height: 0;
228
- border: 0;
229
- border-top: 2px dashed var(--token-line);
230
- image-rendering: pixelated;
231
- }
232
-
233
- /* ══════════════════════════════════════════════════════════════
234
- 页面切换 / 闪白效果
235
- ══════════════════════════════════════════════════════════════ */
236
-
237
- @keyframes retro-flash {
238
- 0% { opacity: 0; }
239
- 10% { opacity: 0.8; }
240
- 100% { opacity: 0; }
241
- }
242
-
243
- .style-retro .retro-page-flash {
244
- position: fixed;
245
- inset: 0;
246
- pointer-events: none;
247
- z-index: var(--z-fx);
248
- background: var(--token-bg);
249
- opacity: 0;
250
- }
251
-
252
- /* 状态类遵循全库 .is-* 规范 */
253
- .style-retro .retro-page-flash.is-active {
254
- animation: retro-flash 0.2s steps(3) forwards;
255
- }
@@ -1,255 +0,0 @@
1
- /*
2
- * @icen.ai/ui — Retro 效果层(按需引入)
3
- *
4
- * 与 tokens.css 不同,本文件 **不** 进 tokens.css 拼合,需显式 import:
5
- * import '@icen.ai/ui/retro-effects.css';
6
- *
7
- * 仅在 <html class="style-retro">(或叠加 .dark)激活时生效,对其它风格无副作用:
8
- * - CRT 扫描线 + 暗角 + 颗粒噪点
9
- * - 游走扫描光
10
- * - RGB 色散 / 霓虹发光(暗色)
11
- * - 像素边框 / 像素按钮 / 像素分隔线工具类
12
- * - 开机自检 / 打字机光标 / 页面闪白动画
13
- *
14
- * 作用域约定:效果类(扫描线/噪点/光标/开机行/闪白)均收在 .style-retro 下;
15
- * 像素工具类(.retro-pixel-border / .retro-pixel-button / .retro-pixel-rule)
16
- * 有意保持全局可用——它们是纯几何装饰,任何风格都可取用。
17
- * z-index 统一走 base.css 的 --z-fx 标尺(效果层,tooltip 之上)。
18
- *
19
- * 所有动画尊重 prefers-reduced-motion:在 reduce 下由 base.css 的全局兜底降为 0.01ms。
20
- */
21
-
22
- /* ══════════════════════════════════════════════════════════════
23
- CRT 显示器效果
24
- ══════════════════════════════════════════════════════════════ */
25
-
26
- /* CRT 扫描线 overlay */
27
- .style-retro body::before {
28
- content: "";
29
- position: fixed;
30
- inset: 0;
31
- pointer-events: none;
32
- z-index: calc(var(--z-fx) - 1);
33
- opacity: 0.14;
34
- background:
35
- repeating-linear-gradient(
36
- 0deg,
37
- transparent,
38
- transparent 2px,
39
- rgba(0, 0, 0, 0.35) 2px,
40
- rgba(0, 0, 0, 0.35) 4px
41
- );
42
- mix-blend-mode: multiply;
43
- }
44
-
45
- .style-retro.dark body::before {
46
- opacity: 0.22;
47
- mix-blend-mode: screen;
48
- }
49
-
50
- /* CRT 暗角 + 轻微曲面 */
51
- .style-retro body::after {
52
- content: "";
53
- position: fixed;
54
- inset: 0;
55
- pointer-events: none;
56
- z-index: calc(var(--z-fx) - 2);
57
- background:
58
- radial-gradient(
59
- ellipse at center,
60
- transparent 55%,
61
- rgba(0, 0, 0, 0.18) 100%
62
- );
63
- opacity: 0.55;
64
- }
65
-
66
- /* CRT 颗粒噪点 */
67
- @keyframes retro-grain {
68
- 0%, 100% { background-position: 0 0; }
69
- 10% { background-position: -5% -10%; }
70
- 20% { background-position: -15% 5%; }
71
- 30% { background-position: 7% -25%; }
72
- 40% { background-position: -5% 25%; }
73
- 50% { background-position: -15% 10%; }
74
- 60% { background-position: 15% 0%; }
75
- 70% { background-position: 0% 15%; }
76
- 80% { background-position: 3% 35%; }
77
- 90% { background-position: -10% 10%; }
78
- }
79
-
80
- .style-retro .retro-crt-grain {
81
- position: fixed;
82
- inset: 0;
83
- pointer-events: none;
84
- z-index: calc(var(--z-fx) - 3);
85
- opacity: 0.06;
86
- background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");
87
- animation: retro-grain 0.5s steps(10) infinite;
88
- }
89
-
90
- /* ══════════════════════════════════════════════════════════════
91
- 全局动画关键帧 + 游走扫描光
92
- ══════════════════════════════════════════════════════════════ */
93
-
94
- @keyframes retro-blink {
95
- 0%, 49% { opacity: 1; }
96
- 50%, 100% { opacity: 0; }
97
- }
98
-
99
- @keyframes retro-scanline-slide {
100
- 0% { transform: translateY(-100%); }
101
- 100% { transform: translateY(100vh); }
102
- }
103
-
104
- /* 游走的扫描线(偶尔闪过)—— 仅 .style-retro 下生效 */
105
- .style-retro .retro-scanline-beam {
106
- position: fixed;
107
- left: 0;
108
- right: 0;
109
- height: 4px;
110
- background: linear-gradient(
111
- 180deg,
112
- transparent,
113
- color-mix(in srgb, var(--token-accent) 30%, transparent),
114
- transparent
115
- );
116
- pointer-events: none;
117
- z-index: calc(var(--z-fx) - 4);
118
- opacity: 0.4;
119
- animation: retro-scanline-slide 4s linear infinite;
120
- }
121
-
122
- /* ══════════════════════════════════════════════════════════════
123
- 开机自检 / 打字机效果
124
- ══════════════════════════════════════════════════════════════ */
125
-
126
- @keyframes retro-boot-text {
127
- 0% { opacity: 0; transform: translateY(4px); }
128
- 10% { opacity: 1; transform: translateY(0); }
129
- 90% { opacity: 1; transform: translateY(0); }
130
- 100% { opacity: 0; transform: translateY(-4px); }
131
- }
132
-
133
- .style-retro .retro-boot-line {
134
- opacity: 0;
135
- animation: retro-boot-text 0.3s steps(1) forwards;
136
- }
137
-
138
- .style-retro .retro-boot-line:nth-child(1) { animation-delay: 0.1s; }
139
- .style-retro .retro-boot-line:nth-child(2) { animation-delay: 0.25s; }
140
- .style-retro .retro-boot-line:nth-child(3) { animation-delay: 0.4s; }
141
- .style-retro .retro-boot-line:nth-child(4) { animation-delay: 0.55s; }
142
- .style-retro .retro-boot-line:nth-child(5) { animation-delay: 0.7s; }
143
-
144
- /* 打字机光标 */
145
- .style-retro .retro-cursor::after {
146
- content: "█";
147
- display: inline-block;
148
- margin-left: 2px;
149
- color: var(--token-accent);
150
- animation: retro-blink 1s step-end infinite;
151
- }
152
-
153
- /* ══════════════════════════════════════════════════════════════
154
- RGB 色散 / 霓虹发光(暗色下尤其出彩)
155
- ══════════════════════════════════════════════════════════════ */
156
-
157
- .style-retro.dark .retro-glow {
158
- text-shadow:
159
- -1px 0 0 rgba(255, 0, 0, 0.4),
160
- 1px 0 0 rgba(0, 255, 255, 0.4),
161
- 0 0 2px var(--token-accent),
162
- 0 0 8px var(--token-accent);
163
- }
164
-
165
- .style-retro.dark .retro-glow-cold {
166
- text-shadow:
167
- -1px 0 0 rgba(255, 0, 0, 0.4),
168
- 1px 0 0 rgba(0, 255, 255, 0.4),
169
- 0 0 2px var(--token-accent-cold),
170
- 0 0 8px var(--token-accent-cold);
171
- }
172
-
173
- /* 亮色模式下发光退化为单层硬投影,保持像素感而不刺眼 */
174
- .style-retro:not(.dark) .retro-glow {
175
- text-shadow:
176
- 1px 1px 0 color-mix(in srgb, var(--token-accent) 30%, transparent);
177
- }
178
-
179
- /* ══════════════════════════════════════════════════════════════
180
- 像素边框工具类(任意风格下可用,但与 retro 最契合)
181
- ══════════════════════════════════════════════════════════════ */
182
-
183
- .retro-pixel-border {
184
- border: 2px solid var(--token-line);
185
- box-shadow:
186
- 2px 2px 0 var(--token-line-strong),
187
- inset 2px 2px 0 var(--token-surface-strong),
188
- inset -2px -2px 0 var(--token-line-soft);
189
- }
190
-
191
- .retro-pixel-border-accent {
192
- border: 2px solid var(--token-accent);
193
- box-shadow:
194
- 2px 2px 0 var(--token-accent-cold),
195
- inset 2px 2px 0 color-mix(in srgb, var(--token-accent) 20%, transparent),
196
- inset -2px -2px 0 color-mix(in srgb, var(--token-accent) 40%, transparent);
197
- }
198
-
199
- /* 像素按钮:硬投影 + 按下内移 */
200
- .retro-pixel-button {
201
- position: relative;
202
- border: 2px solid var(--token-line-strong);
203
- box-shadow:
204
- inset -2px -2px 0 var(--token-line-soft),
205
- inset 2px 2px 0 var(--token-surface-strong),
206
- 2px 2px 0 var(--token-line);
207
- transition: none;
208
- }
209
-
210
- .retro-pixel-button:active {
211
- transform: translate(2px, 2px);
212
- box-shadow:
213
- inset -2px -2px 0 var(--token-line-soft),
214
- inset 2px 2px 0 var(--token-surface-strong);
215
- }
216
-
217
- /* ══════════════════════════════════════════════════════════════
218
- 选中文字 / 像素分隔线
219
- ══════════════════════════════════════════════════════════════ */
220
-
221
- .style-retro ::selection {
222
- background: var(--token-accent);
223
- color: var(--token-on-accent);
224
- }
225
-
226
- .retro-pixel-rule {
227
- height: 0;
228
- border: 0;
229
- border-top: 2px dashed var(--token-line);
230
- image-rendering: pixelated;
231
- }
232
-
233
- /* ══════════════════════════════════════════════════════════════
234
- 页面切换 / 闪白效果
235
- ══════════════════════════════════════════════════════════════ */
236
-
237
- @keyframes retro-flash {
238
- 0% { opacity: 0; }
239
- 10% { opacity: 0.8; }
240
- 100% { opacity: 0; }
241
- }
242
-
243
- .style-retro .retro-page-flash {
244
- position: fixed;
245
- inset: 0;
246
- pointer-events: none;
247
- z-index: var(--z-fx);
248
- background: var(--token-bg);
249
- opacity: 0;
250
- }
251
-
252
- /* 状态类遵循全库 .is-* 规范 */
253
- .style-retro .retro-page-flash.is-active {
254
- animation: retro-flash 0.2s steps(3) forwards;
255
- }