@icen.ai/ui 0.4.0 → 0.8.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 (155) hide show
  1. package/AGENTS.md +256 -0
  2. package/README.md +47 -13
  3. package/dist/base.css +31 -4
  4. package/dist/behaviors/accordion.d.mts +4 -0
  5. package/dist/behaviors/accordion.mjs +4 -3
  6. package/dist/behaviors/ai-chat.d.mts +57 -0
  7. package/dist/behaviors/ai-chat.mjs +557 -0
  8. package/dist/behaviors/ai-composer.d.mts +112 -0
  9. package/dist/behaviors/ai-composer.mjs +2032 -0
  10. package/dist/behaviors/ai-core.d.mts +151 -0
  11. package/dist/behaviors/ai-core.mjs +491 -0
  12. package/dist/behaviors/ai-diff.d.mts +53 -0
  13. package/dist/behaviors/ai-diff.mjs +282 -0
  14. package/dist/behaviors/ai-panel.d.mts +98 -0
  15. package/dist/behaviors/ai-panel.mjs +1012 -0
  16. package/dist/behaviors/ai-provider.d.mts +198 -0
  17. package/dist/behaviors/ai-provider.mjs +1055 -0
  18. package/dist/behaviors/ai-tool.d.mts +18 -0
  19. package/dist/behaviors/ai-tool.mjs +2125 -0
  20. package/dist/behaviors/ai-tools.d.mts +81 -0
  21. package/dist/behaviors/ai-tools.mjs +1658 -0
  22. package/dist/behaviors/back-top.d.mts +20 -0
  23. package/dist/behaviors/back-top.mjs +101 -0
  24. package/dist/behaviors/carousel.d.mts +4 -0
  25. package/dist/behaviors/carousel.mjs +34 -16
  26. package/dist/behaviors/charts.d.mts +250 -0
  27. package/dist/behaviors/charts.mjs +1301 -448
  28. package/dist/behaviors/command-palette.d.mts +8 -0
  29. package/dist/behaviors/command-palette.mjs +189 -0
  30. package/dist/behaviors/context-menu.d.mts +36 -0
  31. package/dist/behaviors/context-menu.mjs +6 -2
  32. package/dist/behaviors/copy.d.mts +4 -0
  33. package/dist/behaviors/copy.mjs +7 -6
  34. package/dist/behaviors/datatable.d.mts +78 -0
  35. package/dist/behaviors/datatable.mjs +54 -11
  36. package/dist/behaviors/date-picker.d.mts +4 -0
  37. package/dist/behaviors/date-picker.mjs +296 -0
  38. package/dist/behaviors/dropdown.d.mts +4 -0
  39. package/dist/behaviors/dropdown.mjs +7 -3
  40. package/dist/behaviors/input.d.mts +4 -0
  41. package/dist/behaviors/input.mjs +184 -8
  42. package/dist/behaviors/modal.d.mts +11 -0
  43. package/dist/behaviors/modal.mjs +11 -6
  44. package/dist/behaviors/nav.d.mts +7 -0
  45. package/dist/behaviors/nav.mjs +25 -9
  46. package/dist/behaviors/notification.d.mts +172 -0
  47. package/dist/behaviors/notification.mjs +908 -0
  48. package/dist/behaviors/popover.d.mts +46 -0
  49. package/dist/behaviors/popover.mjs +2 -1
  50. package/dist/behaviors/select.d.mts +4 -0
  51. package/dist/behaviors/select.mjs +268 -34
  52. package/dist/behaviors/sidebar.d.mts +4 -0
  53. package/dist/behaviors/sidebar.mjs +4 -3
  54. package/dist/behaviors/slider.d.mts +4 -0
  55. package/dist/behaviors/slider.mjs +4 -3
  56. package/dist/behaviors/split-pane.d.mts +4 -0
  57. package/dist/behaviors/split-pane.mjs +102 -0
  58. package/dist/behaviors/tabs.d.mts +8 -0
  59. package/dist/behaviors/tabs.mjs +44 -19
  60. package/dist/behaviors/tag-input.d.mts +4 -0
  61. package/dist/behaviors/tag-input.mjs +12 -3
  62. package/dist/behaviors/theme.d.mts +25 -0
  63. package/dist/behaviors/theme.mjs +3 -1
  64. package/dist/behaviors/toast.d.mts +26 -0
  65. package/dist/behaviors/toast.mjs +24 -18
  66. package/dist/behaviors/tree.d.mts +4 -0
  67. package/dist/behaviors/tree.mjs +4 -3
  68. package/dist/behaviors/upload.d.mts +4 -0
  69. package/dist/behaviors/upload.mjs +205 -17
  70. package/dist/components/ai-chat.css +1037 -0
  71. package/dist/components/ai-chat.mjs +3 -0
  72. package/dist/components/ai-composer.mjs +3 -0
  73. package/dist/components/ai-context.mjs +2 -0
  74. package/dist/components/ai-diff.css +311 -0
  75. package/dist/components/ai-diff.mjs +3 -0
  76. package/dist/components/ai-files.mjs +3 -0
  77. package/dist/components/ai-message.mjs +3 -0
  78. package/dist/components/ai-panel.css +682 -0
  79. package/dist/components/ai-reasoning.mjs +3 -0
  80. package/dist/components/ai-subagent.mjs +2 -0
  81. package/dist/components/ai-todo.mjs +2 -0
  82. package/dist/components/ai-tool-call.mjs +2 -0
  83. package/dist/components/ai-tool.css +532 -0
  84. package/dist/components/ai-usage.mjs +3 -0
  85. package/dist/components/back-top.css +88 -0
  86. package/dist/components/back-top.mjs +3 -0
  87. package/dist/components/badge.css +127 -0
  88. package/dist/components/badge.mjs +2 -0
  89. package/dist/components/breadcrumb.css +53 -0
  90. package/dist/components/btn.css +4 -7
  91. package/dist/components/card.css +66 -1
  92. package/dist/components/chart-bar.css +10 -0
  93. package/dist/components/chart-calendar.mjs +5 -0
  94. package/dist/components/chart-gauge.css +1 -1
  95. package/dist/components/chart-heatmap.css +40 -0
  96. package/dist/components/chart-scatter.css +24 -0
  97. package/dist/components/chart-scatter.mjs +4 -0
  98. package/dist/components/charts.css +86 -1
  99. package/dist/components/charts.mjs +1 -0
  100. package/dist/components/command-palette.css +246 -0
  101. package/dist/components/command-palette.mjs +3 -0
  102. package/dist/components/content.css +221 -8
  103. package/dist/components/copy.css +93 -0
  104. package/dist/components/copy.mjs +3 -0
  105. package/dist/components/datatable.css +4 -8
  106. package/dist/components/date-picker.css +240 -0
  107. package/dist/components/date-picker.mjs +3 -0
  108. package/dist/components/empty.css +69 -3
  109. package/dist/components/feedback.css +241 -10
  110. package/dist/components/form.css +129 -11
  111. package/dist/components/form.mjs +2 -0
  112. package/dist/components/input.css +25 -2
  113. package/dist/components/layout.css +36 -36
  114. package/dist/components/media.css +153 -6
  115. package/dist/components/menu.css +2 -2
  116. package/dist/components/modal.css +1 -1
  117. package/dist/components/nav.css +106 -2
  118. package/dist/components/notification.css +387 -0
  119. package/dist/components/notification.mjs +3 -0
  120. package/dist/components/pagination.css +1 -1
  121. package/dist/components/panel.css +104 -9
  122. package/dist/components/pill.css +82 -12
  123. package/dist/components/scroll-area.css +112 -0
  124. package/dist/components/scroll-area.mjs +2 -0
  125. package/dist/components/segmented.css +80 -5
  126. package/dist/components/segmented.mjs +1 -0
  127. package/dist/components/select.css +104 -17
  128. package/dist/components/sidebar.css +119 -1
  129. package/dist/components/slider.css +113 -0
  130. package/dist/components/split-pane.css +111 -0
  131. package/dist/components/split-pane.mjs +3 -0
  132. package/dist/components/stat.css +131 -12
  133. package/dist/components/steps.css +98 -1
  134. package/dist/components/switch.css +145 -7
  135. package/dist/components/table.css +111 -29
  136. package/dist/components/tabs.css +132 -22
  137. package/dist/components/tag-input.css +4 -4
  138. package/dist/components/tag.css +164 -0
  139. package/dist/components/tag.mjs +2 -0
  140. package/dist/components/toast.css +122 -5
  141. package/dist/components/toolbar.css +101 -0
  142. package/dist/components/toolbar.mjs +2 -0
  143. package/dist/components/tooltip.css +2 -2
  144. package/dist/components/upload.css +61 -4
  145. package/dist/index.d.mts +37 -0
  146. package/dist/index.mjs +9409 -929
  147. package/dist/registry.json +176 -4
  148. package/dist/retro-effects.css +21 -17
  149. package/dist/tokens/colors.css +4 -1
  150. package/dist/tokens/retro-effects.css +21 -17
  151. package/dist/tokens/style-profiles.css +21 -0
  152. package/dist/tokens.css +25 -1
  153. package/dist/ui.css +9616 -2839
  154. package/docs/spec/ai-native.md +659 -0
  155. package/package.json +15 -5
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icen.ai/ui",
3
- "version": "0.4.0",
3
+ "version": "0.8.0",
4
4
  "tokens": [
5
5
  "colors.css",
6
6
  "style-profiles.css",
@@ -11,6 +11,12 @@
11
11
  ],
12
12
  "base": "base.css",
13
13
  "components": [
14
+ "ai-chat",
15
+ "ai-diff",
16
+ "ai-panel",
17
+ "ai-tool",
18
+ "back-top",
19
+ "badge",
14
20
  "breadcrumb",
15
21
  "btn",
16
22
  "card",
@@ -21,11 +27,15 @@
21
27
  "chart-line",
22
28
  "chart-pie",
23
29
  "chart-radar",
30
+ "chart-scatter",
24
31
  "chart-sparkline",
25
32
  "chart-stack",
26
33
  "charts",
34
+ "command-palette",
27
35
  "content",
36
+ "copy",
28
37
  "datatable",
38
+ "date-picker",
29
39
  "empty",
30
40
  "feedback",
31
41
  "form",
@@ -35,39 +45,57 @@
35
45
  "menu",
36
46
  "modal",
37
47
  "nav",
48
+ "notification",
38
49
  "pagination",
39
50
  "panel",
40
51
  "pill",
41
52
  "popover",
53
+ "scroll-area",
42
54
  "segmented",
43
55
  "select",
44
56
  "sidebar",
45
57
  "slider",
58
+ "split-pane",
46
59
  "stat",
47
60
  "steps",
48
61
  "switch",
49
62
  "table",
50
63
  "tabs",
51
64
  "tag-input",
65
+ "tag",
52
66
  "toast",
67
+ "toolbar",
53
68
  "tooltip",
54
69
  "upload"
55
70
  ],
56
71
  "behaviors": [
57
72
  "accordion",
73
+ "ai-chat",
74
+ "ai-composer",
75
+ "ai-core",
76
+ "ai-diff",
77
+ "ai-panel",
78
+ "ai-provider",
79
+ "ai-tool",
80
+ "ai-tools",
81
+ "back-top",
58
82
  "carousel",
59
83
  "charts",
84
+ "command-palette",
60
85
  "context-menu",
61
86
  "copy",
62
87
  "datatable",
88
+ "date-picker",
63
89
  "dropdown",
64
90
  "input",
65
91
  "modal",
66
92
  "nav",
93
+ "notification",
67
94
  "popover",
68
95
  "select",
69
96
  "sidebar",
70
97
  "slider",
98
+ "split-pane",
71
99
  "tabs",
72
100
  "tag-input",
73
101
  "theme",
@@ -85,6 +113,9 @@
85
113
  "pill": {
86
114
  "css": "pill.css"
87
115
  },
116
+ "tag": {
117
+ "css": "tag.css"
118
+ },
88
119
  "tabs": {
89
120
  "css": "tabs.css",
90
121
  "behavior": "tabs",
@@ -100,6 +131,17 @@
100
131
  "toast"
101
132
  ]
102
133
  },
134
+ "toolbar": {
135
+ "css": "toolbar.css"
136
+ },
137
+ "split-pane": {
138
+ "css": "split-pane.css",
139
+ "behavior": "split-pane",
140
+ "init": "initSplitPane"
141
+ },
142
+ "form": {
143
+ "css": "form.css"
144
+ },
103
145
  "input": {
104
146
  "css": "input.css",
105
147
  "behavior": "input",
@@ -124,13 +166,22 @@
124
166
  "css": "switch.css"
125
167
  },
126
168
  "segmented": {
127
- "css": "segmented.css"
169
+ "css": "segmented.css",
170
+ "behavior": "input",
171
+ "exports": [
172
+ "initInput"
173
+ ]
128
174
  },
129
175
  "upload": {
130
176
  "css": "upload.css",
131
177
  "behavior": "upload",
132
178
  "init": "initUpload"
133
179
  },
180
+ "date-picker": {
181
+ "css": "date-picker.css",
182
+ "behavior": "date-picker",
183
+ "init": "initDatePicker"
184
+ },
134
185
  "modal": {
135
186
  "css": "modal.css",
136
187
  "behavior": "modal",
@@ -158,6 +209,11 @@
158
209
  "tooltip": {
159
210
  "css": "tooltip.css"
160
211
  },
212
+ "command-palette": {
213
+ "css": "command-palette.css",
214
+ "behavior": "command-palette",
215
+ "init": "initCommandPalette"
216
+ },
161
217
  "card": {
162
218
  "css": "card.css"
163
219
  },
@@ -200,6 +256,12 @@
200
256
  "behavior": "carousel",
201
257
  "init": "initCarousel"
202
258
  },
259
+ "badge": {
260
+ "css": "badge.css"
261
+ },
262
+ "scroll-area": {
263
+ "css": "scroll-area.css"
264
+ },
203
265
  "table": {
204
266
  "css": "table.css"
205
267
  },
@@ -224,7 +286,8 @@
224
286
  "chart-area.css",
225
287
  "chart-stack.css",
226
288
  "chart-gauge.css",
227
- "chart-sparkline.css"
289
+ "chart-sparkline.css",
290
+ "chart-scatter.css"
228
291
  ],
229
292
  "behavior": "charts",
230
293
  "exports": [
@@ -237,7 +300,13 @@
237
300
  "renderRadar",
238
301
  "renderHeatmap",
239
302
  "renderSparkline",
240
- "renderGauge"
303
+ "renderGauge",
304
+ "renderCalendar",
305
+ "renderScatter",
306
+ "renderChart",
307
+ "normalizeChartSpec",
308
+ "inferChartType",
309
+ "chartFormatValue"
241
310
  ]
242
311
  },
243
312
  "chart-line": {
@@ -331,6 +400,27 @@
331
400
  "renderSparkline"
332
401
  ]
333
402
  },
403
+ "chart-scatter": {
404
+ "css": "chart-scatter.css",
405
+ "extraCss": [
406
+ "charts.css"
407
+ ],
408
+ "behavior": "charts",
409
+ "exports": [
410
+ "renderScatter"
411
+ ]
412
+ },
413
+ "chart-calendar": {
414
+ "css": "chart-calendar.css",
415
+ "extraCss": [
416
+ "charts.css",
417
+ "chart-heatmap.css"
418
+ ],
419
+ "behavior": "charts",
420
+ "exports": [
421
+ "renderCalendar"
422
+ ]
423
+ },
334
424
  "alert": {
335
425
  "css": "feedback.css"
336
426
  },
@@ -346,6 +436,19 @@
346
436
  "skeleton": {
347
437
  "css": "feedback.css"
348
438
  },
439
+ "copy": {
440
+ "css": "copy.css",
441
+ "behavior": "copy",
442
+ "init": "initCopy"
443
+ },
444
+ "notification": {
445
+ "css": "notification.css",
446
+ "behavior": "notification",
447
+ "init": "initNotification",
448
+ "exports": [
449
+ "notify"
450
+ ]
451
+ },
349
452
  "nav": {
350
453
  "css": "nav.css",
351
454
  "behavior": "nav",
@@ -365,8 +468,77 @@
365
468
  "steps": {
366
469
  "css": "steps.css"
367
470
  },
471
+ "back-top": {
472
+ "css": "back-top.css",
473
+ "behavior": "back-top",
474
+ "init": "initBackTop"
475
+ },
368
476
  "layout": {
369
477
  "css": "layout.css"
478
+ },
479
+ "ai-chat": {
480
+ "css": "ai-chat.css",
481
+ "behavior": "ai-chat",
482
+ "init": "initAiChat"
483
+ },
484
+ "ai-message": {
485
+ "css": "ai-chat.css",
486
+ "behavior": "ai-chat",
487
+ "exports": [
488
+ "renderAiMessage",
489
+ "createAiStream",
490
+ "initAiChat"
491
+ ]
492
+ },
493
+ "ai-reasoning": {
494
+ "css": "ai-chat.css",
495
+ "behavior": "ai-chat",
496
+ "exports": [
497
+ "createAiStream",
498
+ "initAiChat"
499
+ ]
500
+ },
501
+ "ai-composer": {
502
+ "css": "ai-chat.css",
503
+ "behavior": "ai-composer",
504
+ "init": "initAiComposer"
505
+ },
506
+ "ai-tool-call": {
507
+ "css": "ai-tool-call.css",
508
+ "init": "initAiTool"
509
+ },
510
+ "ai-subagent": {
511
+ "css": "ai-tool.css",
512
+ "init": "initAiSubagent"
513
+ },
514
+ "ai-diff": {
515
+ "css": "ai-diff.css",
516
+ "behavior": "ai-diff",
517
+ "init": "initAiDiff"
518
+ },
519
+ "ai-files": {
520
+ "css": "ai-diff.css",
521
+ "behavior": "ai-diff",
522
+ "exports": [
523
+ "renderAiDiff"
524
+ ]
525
+ },
526
+ "ai-todo": {
527
+ "css": "ai-panel.css",
528
+ "init": "initAiTodo"
529
+ },
530
+ "ai-context": {
531
+ "css": "ai-panel.css",
532
+ "init": "initAiContext"
533
+ },
534
+ "ai-usage": {
535
+ "css": "ai-panel.css",
536
+ "behavior": "ai-panel",
537
+ "exports": [
538
+ "renderAiUsage",
539
+ "renderAiUsageRing",
540
+ "renderAiAudit"
541
+ ]
370
542
  }
371
543
  }
372
544
  }
@@ -11,6 +11,11 @@
11
11
  * - 像素边框 / 像素按钮 / 像素分隔线工具类
12
12
  * - 开机自检 / 打字机光标 / 页面闪白动画
13
13
  *
14
+ * 作用域约定:效果类(扫描线/噪点/光标/开机行/闪白)均收在 .style-retro 下;
15
+ * 像素工具类(.retro-pixel-border / .retro-pixel-button / .retro-pixel-rule)
16
+ * 有意保持全局可用——它们是纯几何装饰,任何风格都可取用。
17
+ * z-index 统一走 base.css 的 --z-fx 标尺(效果层,tooltip 之上)。
18
+ *
14
19
  * 所有动画尊重 prefers-reduced-motion:在 reduce 下由 base.css 的全局兜底降为 0.01ms。
15
20
  */
16
21
 
@@ -24,7 +29,7 @@
24
29
  position: fixed;
25
30
  inset: 0;
26
31
  pointer-events: none;
27
- z-index: 9999;
32
+ z-index: calc(var(--z-fx) - 1);
28
33
  opacity: 0.14;
29
34
  background:
30
35
  repeating-linear-gradient(
@@ -48,7 +53,7 @@
48
53
  position: fixed;
49
54
  inset: 0;
50
55
  pointer-events: none;
51
- z-index: 9998;
56
+ z-index: calc(var(--z-fx) - 2);
52
57
  background:
53
58
  radial-gradient(
54
59
  ellipse at center,
@@ -90,7 +95,7 @@
90
95
  position: fixed;
91
96
  inset: 0;
92
97
  pointer-events: none;
93
- z-index: 9997;
98
+ z-index: calc(var(--z-fx) - 3);
94
99
  opacity: 0.06;
95
100
  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");
96
101
  animation: retro-grain 0.5s steps(10) infinite;
@@ -110,9 +115,8 @@
110
115
  100% { transform: translateY(100vh); }
111
116
  }
112
117
 
113
- /* 游走的扫描线(偶尔闪过)—— 挂到 .style-retro 下的显式节点 */
114
- .style-retro .retro-scanline-beam,
115
- .retro-scanline-beam {
118
+ /* 游走的扫描线(偶尔闪过)—— 仅 .style-retro 下生效 */
119
+ .style-retro .retro-scanline-beam {
116
120
  position: fixed;
117
121
  left: 0;
118
122
  right: 0;
@@ -124,7 +128,7 @@
124
128
  transparent
125
129
  );
126
130
  pointer-events: none;
127
- z-index: 9996;
131
+ z-index: calc(var(--z-fx) - 4);
128
132
  opacity: 0.4;
129
133
  animation: retro-scanline-slide 4s linear infinite;
130
134
  }
@@ -140,19 +144,19 @@
140
144
  100% { opacity: 0; transform: translateY(-4px); }
141
145
  }
142
146
 
143
- .retro-boot-line {
147
+ .style-retro .retro-boot-line {
144
148
  opacity: 0;
145
149
  animation: retro-boot-text 0.3s steps(1) forwards;
146
150
  }
147
151
 
148
- .retro-boot-line:nth-child(1) { animation-delay: 0.1s; }
149
- .retro-boot-line:nth-child(2) { animation-delay: 0.25s; }
150
- .retro-boot-line:nth-child(3) { animation-delay: 0.4s; }
151
- .retro-boot-line:nth-child(4) { animation-delay: 0.55s; }
152
- .retro-boot-line:nth-child(5) { animation-delay: 0.7s; }
152
+ .style-retro .retro-boot-line:nth-child(1) { animation-delay: 0.1s; }
153
+ .style-retro .retro-boot-line:nth-child(2) { animation-delay: 0.25s; }
154
+ .style-retro .retro-boot-line:nth-child(3) { animation-delay: 0.4s; }
155
+ .style-retro .retro-boot-line:nth-child(4) { animation-delay: 0.55s; }
156
+ .style-retro .retro-boot-line:nth-child(5) { animation-delay: 0.7s; }
153
157
 
154
158
  /* 打字机光标 */
155
- .retro-cursor::after {
159
+ .style-retro .retro-cursor::after {
156
160
  content: "█";
157
161
  display: inline-block;
158
162
  margin-left: 2px;
@@ -250,15 +254,15 @@
250
254
  100% { opacity: 0; }
251
255
  }
252
256
 
253
- .retro-page-flash {
257
+ .style-retro .retro-page-flash {
254
258
  position: fixed;
255
259
  inset: 0;
256
260
  pointer-events: none;
257
- z-index: 10000;
261
+ z-index: var(--z-fx);
258
262
  background: var(--token-bg);
259
263
  opacity: 0;
260
264
  }
261
265
 
262
- .retro-page-flash.active {
266
+ .style-retro .retro-page-flash.active {
263
267
  animation: retro-flash 0.2s steps(3) forwards;
264
268
  }
@@ -504,6 +504,8 @@
504
504
  --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
505
505
  --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
506
506
  --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
507
+ /* 睡莲粉 accent 上的文字色:深绿灰(白字在 #d59ab1 上对比度不达标) */
508
+ --token-on-accent: #26302b;
507
509
 
508
510
  --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.18), 0 8px 22px rgba(0,0,0,.24);
509
511
  --token-shadow-overlay: 0 2px 5px rgba(0,0,0,.24), 0 14px 36px rgba(0,0,0,.32);
@@ -841,7 +843,8 @@
841
843
  --token-accent-glow: color-mix(in srgb, var(--token-accent) 6%, transparent);
842
844
  --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
843
845
  --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
844
- --token-on-accent: #ffffff;
846
+ /* 松烟绿 accent 上的文字色:深墨(白字在 #7AA87E 上对比度不达标) */
847
+ --token-on-accent: #1a2018;
845
848
 
846
849
  --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.2), 0 4px 14px rgba(0,0,0,.22);
847
850
  --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.28), 0 10px 30px rgba(0,0,0,.34);
@@ -11,6 +11,11 @@
11
11
  * - 像素边框 / 像素按钮 / 像素分隔线工具类
12
12
  * - 开机自检 / 打字机光标 / 页面闪白动画
13
13
  *
14
+ * 作用域约定:效果类(扫描线/噪点/光标/开机行/闪白)均收在 .style-retro 下;
15
+ * 像素工具类(.retro-pixel-border / .retro-pixel-button / .retro-pixel-rule)
16
+ * 有意保持全局可用——它们是纯几何装饰,任何风格都可取用。
17
+ * z-index 统一走 base.css 的 --z-fx 标尺(效果层,tooltip 之上)。
18
+ *
14
19
  * 所有动画尊重 prefers-reduced-motion:在 reduce 下由 base.css 的全局兜底降为 0.01ms。
15
20
  */
16
21
 
@@ -24,7 +29,7 @@
24
29
  position: fixed;
25
30
  inset: 0;
26
31
  pointer-events: none;
27
- z-index: 9999;
32
+ z-index: calc(var(--z-fx) - 1);
28
33
  opacity: 0.14;
29
34
  background:
30
35
  repeating-linear-gradient(
@@ -48,7 +53,7 @@
48
53
  position: fixed;
49
54
  inset: 0;
50
55
  pointer-events: none;
51
- z-index: 9998;
56
+ z-index: calc(var(--z-fx) - 2);
52
57
  background:
53
58
  radial-gradient(
54
59
  ellipse at center,
@@ -90,7 +95,7 @@
90
95
  position: fixed;
91
96
  inset: 0;
92
97
  pointer-events: none;
93
- z-index: 9997;
98
+ z-index: calc(var(--z-fx) - 3);
94
99
  opacity: 0.06;
95
100
  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");
96
101
  animation: retro-grain 0.5s steps(10) infinite;
@@ -110,9 +115,8 @@
110
115
  100% { transform: translateY(100vh); }
111
116
  }
112
117
 
113
- /* 游走的扫描线(偶尔闪过)—— 挂到 .style-retro 下的显式节点 */
114
- .style-retro .retro-scanline-beam,
115
- .retro-scanline-beam {
118
+ /* 游走的扫描线(偶尔闪过)—— 仅 .style-retro 下生效 */
119
+ .style-retro .retro-scanline-beam {
116
120
  position: fixed;
117
121
  left: 0;
118
122
  right: 0;
@@ -124,7 +128,7 @@
124
128
  transparent
125
129
  );
126
130
  pointer-events: none;
127
- z-index: 9996;
131
+ z-index: calc(var(--z-fx) - 4);
128
132
  opacity: 0.4;
129
133
  animation: retro-scanline-slide 4s linear infinite;
130
134
  }
@@ -140,19 +144,19 @@
140
144
  100% { opacity: 0; transform: translateY(-4px); }
141
145
  }
142
146
 
143
- .retro-boot-line {
147
+ .style-retro .retro-boot-line {
144
148
  opacity: 0;
145
149
  animation: retro-boot-text 0.3s steps(1) forwards;
146
150
  }
147
151
 
148
- .retro-boot-line:nth-child(1) { animation-delay: 0.1s; }
149
- .retro-boot-line:nth-child(2) { animation-delay: 0.25s; }
150
- .retro-boot-line:nth-child(3) { animation-delay: 0.4s; }
151
- .retro-boot-line:nth-child(4) { animation-delay: 0.55s; }
152
- .retro-boot-line:nth-child(5) { animation-delay: 0.7s; }
152
+ .style-retro .retro-boot-line:nth-child(1) { animation-delay: 0.1s; }
153
+ .style-retro .retro-boot-line:nth-child(2) { animation-delay: 0.25s; }
154
+ .style-retro .retro-boot-line:nth-child(3) { animation-delay: 0.4s; }
155
+ .style-retro .retro-boot-line:nth-child(4) { animation-delay: 0.55s; }
156
+ .style-retro .retro-boot-line:nth-child(5) { animation-delay: 0.7s; }
153
157
 
154
158
  /* 打字机光标 */
155
- .retro-cursor::after {
159
+ .style-retro .retro-cursor::after {
156
160
  content: "█";
157
161
  display: inline-block;
158
162
  margin-left: 2px;
@@ -250,15 +254,15 @@
250
254
  100% { opacity: 0; }
251
255
  }
252
256
 
253
- .retro-page-flash {
257
+ .style-retro .retro-page-flash {
254
258
  position: fixed;
255
259
  inset: 0;
256
260
  pointer-events: none;
257
- z-index: 10000;
261
+ z-index: var(--z-fx);
258
262
  background: var(--token-bg);
259
263
  opacity: 0;
260
264
  }
261
265
 
262
- .retro-page-flash.active {
266
+ .style-retro .retro-page-flash.active {
263
267
  animation: retro-flash 0.2s steps(3) forwards;
264
268
  }
@@ -60,13 +60,20 @@
60
60
  --density-space-sm: 0.5rem;
61
61
  --density-space-md: 0.75rem;
62
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;
63
67
  --density-input-height-sm: 28px;
64
68
  --density-input-height-md: 36px;
65
69
  --density-input-height-lg: 44px;
70
+ --density-font-size-2xs: 10px;
66
71
  --density-font-size-xs: 11px;
67
72
  --density-font-size-sm: 12px;
68
73
  --density-font-size-md: 13px;
69
74
  --density-font-size-lg: 14px;
75
+ --density-font-size-xl: 18px;
76
+ --density-font-size-2xl: 22px;
70
77
 
71
78
  /* ── Motion 动效 ── */
72
79
  --duration-instant: 0ms;
@@ -98,13 +105,20 @@
98
105
  --density-space-sm: 0.5rem;
99
106
  --density-space-md: 0.75rem;
100
107
  --density-space-lg: 1rem;
108
+ --density-space-xl: 1.5rem;
109
+ --density-space-2xl: 2rem;
110
+ --density-space-3xl: 3rem;
111
+ --density-space-4xl: 4rem;
101
112
  --density-input-height-sm: 28px;
102
113
  --density-input-height-md: 36px;
103
114
  --density-input-height-lg: 44px;
115
+ --density-font-size-2xs: 10px;
104
116
  --density-font-size-xs: 11px;
105
117
  --density-font-size-sm: 12px;
106
118
  --density-font-size-md: 13px;
107
119
  --density-font-size-lg: 14px;
120
+ --density-font-size-xl: 18px;
121
+ --density-font-size-2xl: 22px;
108
122
 
109
123
  /* ── Motion ── */
110
124
  --duration-fast: 150ms;
@@ -133,13 +147,20 @@
133
147
  --density-space-sm: 0.25rem;
134
148
  --density-space-md: 0.5rem;
135
149
  --density-space-lg: 0.75rem;
150
+ --density-space-xl: 1rem;
151
+ --density-space-2xl: 1.5rem;
152
+ --density-space-3xl: 2rem;
153
+ --density-space-4xl: 3rem;
136
154
  --density-input-height-sm: 24px;
137
155
  --density-input-height-md: 32px;
138
156
  --density-input-height-lg: 40px;
157
+ --density-font-size-2xs: 9px;
139
158
  --density-font-size-xs: 9px;
140
159
  --density-font-size-sm: 10px;
141
160
  --density-font-size-md: 11px;
142
161
  --density-font-size-lg: 12px;
162
+ --density-font-size-xl: 14px;
163
+ --density-font-size-2xl: 16px;
143
164
 
144
165
  /* ── Motion:像素风瞬间切换 ── */
145
166
  --duration-fast: 0ms;
package/dist/tokens.css CHANGED
@@ -507,6 +507,8 @@
507
507
  --token-accent-glow: color-mix(in srgb, var(--token-accent) 8%, transparent);
508
508
  --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
509
509
  --token-overlay-bg: color-mix(in srgb, var(--token-bg) 92%, transparent);
510
+ /* 睡莲粉 accent 上的文字色:深绿灰(白字在 #d59ab1 上对比度不达标) */
511
+ --token-on-accent: #26302b;
510
512
 
511
513
  --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.18), 0 8px 22px rgba(0,0,0,.24);
512
514
  --token-shadow-overlay: 0 2px 5px rgba(0,0,0,.24), 0 14px 36px rgba(0,0,0,.32);
@@ -844,7 +846,8 @@
844
846
  --token-accent-glow: color-mix(in srgb, var(--token-accent) 6%, transparent);
845
847
  --token-line-dashed: color-mix(in srgb, var(--token-line-soft) 60%, transparent);
846
848
  --token-overlay-bg: color-mix(in srgb, var(--token-bg) 94%, transparent);
847
- --token-on-accent: #ffffff;
849
+ /* 松烟绿 accent 上的文字色:深墨(白字在 #7AA87E 上对比度不达标) */
850
+ --token-on-accent: #1a2018;
848
851
 
849
852
  --token-shadow-elevated: 0 1px 2px rgba(0,0,0,.2), 0 4px 14px rgba(0,0,0,.22);
850
853
  --token-shadow-overlay: 0 2px 4px rgba(0,0,0,.28), 0 10px 30px rgba(0,0,0,.34);
@@ -1312,13 +1315,20 @@
1312
1315
  --density-space-sm: 0.5rem;
1313
1316
  --density-space-md: 0.75rem;
1314
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;
1315
1322
  --density-input-height-sm: 28px;
1316
1323
  --density-input-height-md: 36px;
1317
1324
  --density-input-height-lg: 44px;
1325
+ --density-font-size-2xs: 10px;
1318
1326
  --density-font-size-xs: 11px;
1319
1327
  --density-font-size-sm: 12px;
1320
1328
  --density-font-size-md: 13px;
1321
1329
  --density-font-size-lg: 14px;
1330
+ --density-font-size-xl: 18px;
1331
+ --density-font-size-2xl: 22px;
1322
1332
 
1323
1333
  /* ── Motion 动效 ── */
1324
1334
  --duration-instant: 0ms;
@@ -1350,13 +1360,20 @@
1350
1360
  --density-space-sm: 0.5rem;
1351
1361
  --density-space-md: 0.75rem;
1352
1362
  --density-space-lg: 1rem;
1363
+ --density-space-xl: 1.5rem;
1364
+ --density-space-2xl: 2rem;
1365
+ --density-space-3xl: 3rem;
1366
+ --density-space-4xl: 4rem;
1353
1367
  --density-input-height-sm: 28px;
1354
1368
  --density-input-height-md: 36px;
1355
1369
  --density-input-height-lg: 44px;
1370
+ --density-font-size-2xs: 10px;
1356
1371
  --density-font-size-xs: 11px;
1357
1372
  --density-font-size-sm: 12px;
1358
1373
  --density-font-size-md: 13px;
1359
1374
  --density-font-size-lg: 14px;
1375
+ --density-font-size-xl: 18px;
1376
+ --density-font-size-2xl: 22px;
1360
1377
 
1361
1378
  /* ── Motion ── */
1362
1379
  --duration-fast: 150ms;
@@ -1385,13 +1402,20 @@
1385
1402
  --density-space-sm: 0.25rem;
1386
1403
  --density-space-md: 0.5rem;
1387
1404
  --density-space-lg: 0.75rem;
1405
+ --density-space-xl: 1rem;
1406
+ --density-space-2xl: 1.5rem;
1407
+ --density-space-3xl: 2rem;
1408
+ --density-space-4xl: 3rem;
1388
1409
  --density-input-height-sm: 24px;
1389
1410
  --density-input-height-md: 32px;
1390
1411
  --density-input-height-lg: 40px;
1412
+ --density-font-size-2xs: 9px;
1391
1413
  --density-font-size-xs: 9px;
1392
1414
  --density-font-size-sm: 10px;
1393
1415
  --density-font-size-md: 11px;
1394
1416
  --density-font-size-lg: 12px;
1417
+ --density-font-size-xl: 14px;
1418
+ --density-font-size-2xl: 16px;
1395
1419
 
1396
1420
  /* ── Motion:像素风瞬间切换 ── */
1397
1421
  --duration-fast: 0ms;