@zhang_jifan/fanui 2.1.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 (127) hide show
  1. package/ACCESSIBILITY.md +61 -0
  2. package/CHANGELOG.md +112 -0
  3. package/COMMERCIAL-LICENSE.md +71 -0
  4. package/DESIGN-SYSTEM.md +294 -0
  5. package/LICENSE +661 -0
  6. package/README.md +348 -0
  7. package/USAGE.md +1926 -0
  8. package/_index.scss +20 -0
  9. package/dist/fanui.cjs +15 -0
  10. package/dist/fanui.css +28209 -0
  11. package/dist/fanui.d.ts +353 -0
  12. package/dist/fanui.esm.js +71 -0
  13. package/dist/fanui.js +4782 -0
  14. package/dist/fanui.min.css +1 -0
  15. package/dist/fanui.mjs +71 -0
  16. package/dist/modules/fanui-advanced.css +830 -0
  17. package/dist/modules/fanui-advanced.min.css +129 -0
  18. package/dist/modules/fanui-alert.css +575 -0
  19. package/dist/modules/fanui-alert.min.css +122 -0
  20. package/dist/modules/fanui-badge.css +426 -0
  21. package/dist/modules/fanui-badge.min.css +77 -0
  22. package/dist/modules/fanui-base.css +1394 -0
  23. package/dist/modules/fanui-base.min.css +236 -0
  24. package/dist/modules/fanui-blog.css +762 -0
  25. package/dist/modules/fanui-blog.min.css +108 -0
  26. package/dist/modules/fanui-button.css +526 -0
  27. package/dist/modules/fanui-button.min.css +56 -0
  28. package/dist/modules/fanui-card.css +291 -0
  29. package/dist/modules/fanui-card.min.css +52 -0
  30. package/dist/modules/fanui-choice.css +539 -0
  31. package/dist/modules/fanui-choice.min.css +83 -0
  32. package/dist/modules/fanui-dashboard.css +1057 -0
  33. package/dist/modules/fanui-dashboard.min.css +160 -0
  34. package/dist/modules/fanui-data.css +687 -0
  35. package/dist/modules/fanui-data.min.css +125 -0
  36. package/dist/modules/fanui-feedback.css +432 -0
  37. package/dist/modules/fanui-feedback.min.css +79 -0
  38. package/dist/modules/fanui-form.css +779 -0
  39. package/dist/modules/fanui-form.min.css +123 -0
  40. package/dist/modules/fanui-glass.css +497 -0
  41. package/dist/modules/fanui-glass.min.css +46 -0
  42. package/dist/modules/fanui-input-plus.css +799 -0
  43. package/dist/modules/fanui-input-plus.min.css +124 -0
  44. package/dist/modules/fanui-interactive.css +960 -0
  45. package/dist/modules/fanui-interactive.min.css +138 -0
  46. package/dist/modules/fanui-layout.css +4399 -0
  47. package/dist/modules/fanui-layout.min.css +1172 -0
  48. package/dist/modules/fanui-marketing.css +1125 -0
  49. package/dist/modules/fanui-marketing.min.css +144 -0
  50. package/dist/modules/fanui-nav.css +458 -0
  51. package/dist/modules/fanui-nav.min.css +76 -0
  52. package/dist/modules/fanui-overlay.css +547 -0
  53. package/dist/modules/fanui-overlay.min.css +91 -0
  54. package/dist/modules/fanui-table.css +290 -0
  55. package/dist/modules/fanui-table.min.css +62 -0
  56. package/dist/modules/fanui-tabs.css +333 -0
  57. package/dist/modules/fanui-tabs.min.css +58 -0
  58. package/dist/modules/fanui-themes.css +2728 -0
  59. package/dist/modules/fanui-themes.min.css +40 -0
  60. package/dist/modules/fanui-tokens.css +587 -0
  61. package/dist/modules/fanui-tokens.min.css +3 -0
  62. package/dist/modules/fanui-utilities.css +6557 -0
  63. package/dist/modules/fanui-utilities.min.css +1762 -0
  64. package/dist/modules/sizes.json +103 -0
  65. package/docs/MIGRATION-v2.md +179 -0
  66. package/examples/01-script-tag.html +149 -0
  67. package/examples/02-react/README.md +39 -0
  68. package/examples/02-react/index.html +12 -0
  69. package/examples/02-react/package.json +20 -0
  70. package/examples/02-react/src/App.jsx +108 -0
  71. package/examples/02-react/src/main.jsx +13 -0
  72. package/examples/02-react/src/useFanUI.js +87 -0
  73. package/examples/02-react/vite.config.js +6 -0
  74. package/examples/03-vue3/README.md +67 -0
  75. package/examples/03-vue3/index.html +12 -0
  76. package/examples/03-vue3/package.json +19 -0
  77. package/examples/03-vue3/src/App.vue +93 -0
  78. package/examples/03-vue3/src/main.js +8 -0
  79. package/examples/03-vue3/src/useFanUI.js +85 -0
  80. package/examples/03-vue3/vite.config.js +6 -0
  81. package/examples/04-vue2-cdn.html +93 -0
  82. package/examples/README.md +34 -0
  83. package/package.json +127 -0
  84. package/src/_functions.scss +319 -0
  85. package/src/_mixins.scss +1202 -0
  86. package/src/_tokens.scss +180 -0
  87. package/src/_variables.scss +491 -0
  88. package/src/base/_animations.scss +210 -0
  89. package/src/base/_reset.scss +359 -0
  90. package/src/base/_rtl.scss +133 -0
  91. package/src/base/_typography.scss +353 -0
  92. package/src/components/_advanced.scss +763 -0
  93. package/src/components/_alert.scss +322 -0
  94. package/src/components/_badge.scss +279 -0
  95. package/src/components/_blog.scss +693 -0
  96. package/src/components/_button.scss +351 -0
  97. package/src/components/_capabilities.scss +463 -0
  98. package/src/components/_card.scss +281 -0
  99. package/src/components/_choice.scss +444 -0
  100. package/src/components/_dashboard.scss +950 -0
  101. package/src/components/_data.scss +618 -0
  102. package/src/components/_feedback.scss +403 -0
  103. package/src/components/_form.scss +408 -0
  104. package/src/components/_glass.scss +374 -0
  105. package/src/components/_input-plus.scss +730 -0
  106. package/src/components/_interactive.scss +885 -0
  107. package/src/components/_marketing.scss +982 -0
  108. package/src/components/_nav.scss +480 -0
  109. package/src/components/_overlay.scss +517 -0
  110. package/src/components/_table.scss +276 -0
  111. package/src/components/_tabs.scss +338 -0
  112. package/src/fanui.d.ts +353 -0
  113. package/src/fanui.js +4782 -0
  114. package/src/fanui.scss +79 -0
  115. package/src/glass/_switches.scss +36 -0
  116. package/src/glass/_tokens.scss +259 -0
  117. package/src/layout/_container.scss +111 -0
  118. package/src/layout/_flex.scss +164 -0
  119. package/src/layout/_grid.scss +180 -0
  120. package/src/themes/_accents.scss +201 -0
  121. package/src/themes/_palettes.scss +180 -0
  122. package/src/utilities/_borders.scss +104 -0
  123. package/src/utilities/_display.scss +145 -0
  124. package/src/utilities/_effects.scss +210 -0
  125. package/src/utilities/_sizing.scss +123 -0
  126. package/src/utilities/_spacing.scss +118 -0
  127. package/src/utilities/_texture.scss +323 -0
@@ -0,0 +1,323 @@
1
+ // =============================================================================
2
+ // fanUI · 纹理与氛围工具 (Texture & Ambience)
3
+ // -----------------------------------------------------------------------------
4
+ // 官网、博客、登录页、数据大屏的"高级感"多来自背景与氛围层。
5
+ // 这里把常用的氛围手法封装为可组合的工具类,全部使用主题色令牌,
6
+ // 因此换主题色后极光、网格、辉光会整体换色,而不是留下一堆写死的紫蓝渐变。
7
+ //
8
+ // .fanui-bg-aurora / --mesh / --dots / --grid-fade / --noise / --conic
9
+ // .fanui-glow / .fanui-glow--brand / .fanui-glow--accent
10
+ // .fanui-text-brand / .fanui-text-aurora
11
+ // .fanui-border-gradient / .fanui-divider-gradient
12
+ // .fanui-mask-fade-y / --x / --circle
13
+ // .fanui-shimmer / .fanui-grain
14
+ // =============================================================================
15
+
16
+ @use "sass:map";
17
+ @use "../functions" as fn;
18
+ @use "../variables" as v;
19
+ @use "../mixins" as mx;
20
+
21
+ // -----------------------------------------------------------------------------
22
+ // 1. 背景氛围
23
+ // -----------------------------------------------------------------------------
24
+
25
+ .fanui-bg-aurora {
26
+ position: relative;
27
+ isolation: isolate;
28
+ background-color: fn.fanui-var("color-bg");
29
+
30
+ &::before {
31
+ content: "";
32
+ position: absolute;
33
+ inset: -25% -15%;
34
+ z-index: -1;
35
+ pointer-events: none;
36
+ background:
37
+ radial-gradient(40% 44% at 22% 28%, var(--fanui-brand-aura-a), transparent 62%),
38
+ radial-gradient(36% 40% at 78% 20%, var(--fanui-brand-aura-b), transparent 60%),
39
+ radial-gradient(46% 46% at 50% 88%, fn.fanui-var("primary-soft"), transparent 66%);
40
+ filter: blur(32px);
41
+ animation: fanui-aurora-drift 26s ease-in-out infinite alternate;
42
+ }
43
+
44
+ @media (prefers-reduced-motion: reduce) {
45
+ &::before { animation: none; }
46
+ }
47
+ }
48
+
49
+ @keyframes fanui-aurora-drift {
50
+ 0% { transform: translate3d(0, 0, 0) scale(1); }
51
+ 50% { transform: translate3d(2%, -2%, 0) scale(1.06); }
52
+ 100% { transform: translate3d(-2%, 2%, 0) scale(1.02); }
53
+ }
54
+
55
+ .fanui-bg-mesh {
56
+ background-color: fn.fanui-var("color-bg");
57
+ background-image:
58
+ radial-gradient(at 12% 18%, var(--fanui-brand-aura-a) 0px, transparent 52%),
59
+ radial-gradient(at 82% 12%, var(--fanui-brand-aura-b) 0px, transparent 48%),
60
+ radial-gradient(at 70% 82%, fn.fanui-var("primary-soft") 0px, transparent 46%),
61
+ radial-gradient(at 24% 84%, fn.fanui-var("accent-soft") 0px, transparent 44%);
62
+ }
63
+
64
+ .fanui-bg-dots {
65
+ background-image: radial-gradient(fn.fanui-alpha(#64748b, 0.22) 1px, transparent 1px);
66
+ background-size: var(--fanui-dots-size, 18px) var(--fanui-dots-size, 18px);
67
+ }
68
+
69
+ .fanui-bg-grid-fade {
70
+ position: relative;
71
+
72
+ &::before {
73
+ content: "";
74
+ position: absolute;
75
+ inset: 0;
76
+ pointer-events: none;
77
+ background-image:
78
+ linear-gradient(fn.fanui-alpha(#64748b, 0.10) 1px, transparent 1px),
79
+ linear-gradient(90deg, fn.fanui-alpha(#64748b, 0.10) 1px, transparent 1px);
80
+ background-size: var(--fanui-grid-size, 56px) var(--fanui-grid-size, 56px);
81
+ -webkit-mask-image: radial-gradient(60% 60% at 50% 30%, #000, transparent 100%);
82
+ mask-image: radial-gradient(60% 60% at 50% 30%, #000, transparent 100%);
83
+ }
84
+ }
85
+
86
+ .fanui-bg-conic {
87
+ background-image: conic-gradient(
88
+ from 210deg at 50% 50%,
89
+ fn.fanui-var("primary-soft"),
90
+ fn.fanui-var("accent-soft"),
91
+ fn.fanui-var("primary-soft")
92
+ );
93
+ }
94
+
95
+ // 细颗粒噪点:用内联 SVG feTurbulence,零外部资源
96
+ .fanui-bg-noise,
97
+ .fanui-grain {
98
+ position: relative;
99
+
100
+ &::after {
101
+ content: "";
102
+ position: absolute;
103
+ inset: 0;
104
+ pointer-events: none;
105
+ z-index: 0;
106
+ opacity: var(--fanui-noise-opacity, 0.035);
107
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E");
108
+ }
109
+ }
110
+
111
+ // -----------------------------------------------------------------------------
112
+ // 2. 辉光
113
+ // -----------------------------------------------------------------------------
114
+
115
+ .fanui-glow {
116
+ position: relative;
117
+ isolation: isolate;
118
+
119
+ &::before {
120
+ content: "";
121
+ position: absolute;
122
+ inset: -40%;
123
+ z-index: -1;
124
+ pointer-events: none;
125
+ background: radial-gradient(closest-side, var(--fanui-glow-color, var(--fanui-brand-aura-a)), transparent 100%);
126
+ filter: blur(var(--fanui-glow-blur, 24px));
127
+ }
128
+
129
+ &--brand { --fanui-glow-color: var(--fanui-brand-aura-a); }
130
+ &--accent { --fanui-glow-color: var(--fanui-brand-aura-b); }
131
+ &--success { --fanui-glow-color: fn.fanui-var("success-glow"); }
132
+ &--danger { --fanui-glow-color: fn.fanui-var("danger-glow"); }
133
+ &--soft { --fanui-glow-blur: 40px; opacity: 0.7; }
134
+ }
135
+
136
+ // -----------------------------------------------------------------------------
137
+ // 3. 文字
138
+ // -----------------------------------------------------------------------------
139
+
140
+ .fanui-text-brand {
141
+ @include mx.fanui-text-gradient(var(--fanui-brand-grad-a), var(--fanui-brand-grad-b), 100deg);
142
+ }
143
+
144
+ .fanui-text-aurora {
145
+ background-image: linear-gradient(
146
+ 100deg,
147
+ var(--fanui-brand-grad-a),
148
+ var(--fanui-brand-grad-b),
149
+ var(--fanui-brand-grad-a)
150
+ );
151
+ background-size: 220% 100%;
152
+ -webkit-background-clip: text;
153
+ background-clip: text;
154
+ color: transparent;
155
+ -webkit-text-fill-color: transparent;
156
+ animation: fanui-text-aurora 8s linear infinite;
157
+
158
+ @media (prefers-reduced-motion: reduce) { animation: none; }
159
+ }
160
+
161
+ @keyframes fanui-text-aurora {
162
+ from { background-position: 0% 50%; }
163
+ to { background-position: 200% 50%; }
164
+ }
165
+
166
+ // 骨架屏流光文字(加载中的标题占位)
167
+ .fanui-shimmer {
168
+ background-image: linear-gradient(
169
+ 90deg,
170
+ fn.fanui-var("color-surface-sunken") 0%,
171
+ fn.fanui-var("color-hover") 50%,
172
+ fn.fanui-var("color-surface-sunken") 100%
173
+ );
174
+ background-size: 200% 100%;
175
+ animation: fanui-shimmer 1.6s linear infinite;
176
+ border-radius: fn.fanui-var("radius-sm");
177
+ color: transparent;
178
+
179
+ @media (prefers-reduced-motion: reduce) { animation: none; }
180
+ }
181
+
182
+ @keyframes fanui-shimmer {
183
+ from { background-position: 200% 0; }
184
+ to { background-position: -200% 0; }
185
+ }
186
+
187
+ // -----------------------------------------------------------------------------
188
+ // 4. 渐变描边 / 分隔线
189
+ // -----------------------------------------------------------------------------
190
+
191
+ .fanui-border-gradient {
192
+ position: relative;
193
+ border: 0;
194
+
195
+ &::before {
196
+ content: "";
197
+ position: absolute;
198
+ inset: 0;
199
+ border-radius: inherit;
200
+ padding: var(--fanui-border-width, 1px);
201
+ pointer-events: none;
202
+ background: linear-gradient(
203
+ var(--fanui-border-angle, 135deg),
204
+ var(--fanui-brand-grad-a),
205
+ var(--fanui-brand-grad-b)
206
+ );
207
+ -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
208
+ mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
209
+ -webkit-mask-composite: xor;
210
+ mask-composite: exclude;
211
+ }
212
+
213
+ &--strong::before { padding: 2px; }
214
+ &--soft::before {
215
+ background: linear-gradient(
216
+ 135deg,
217
+ fn.fanui-var("primary-border"),
218
+ fn.fanui-var("accent-border")
219
+ );
220
+ }
221
+ }
222
+
223
+ .fanui-divider-gradient {
224
+ height: 1px;
225
+ border: 0;
226
+ margin-block: fn.fanui-var("space-6");
227
+ background: linear-gradient(
228
+ 90deg,
229
+ transparent,
230
+ fn.fanui-var("primary-border"),
231
+ fn.fanui-var("accent-border"),
232
+ transparent
233
+ );
234
+ }
235
+
236
+ // 带文字的居中分隔线
237
+ .fanui-divider-text {
238
+ display: flex;
239
+ align-items: center;
240
+ gap: fn.fanui-var("space-3");
241
+ margin-block: fn.fanui-var("space-6");
242
+ font-size: fn.fanui-var("font-size-xs");
243
+ color: fn.fanui-var("color-text-subtle");
244
+
245
+ &::before,
246
+ &::after {
247
+ content: "";
248
+ flex: 1 1 auto;
249
+ height: 1px;
250
+ background-color: fn.fanui-var("color-border");
251
+ }
252
+ }
253
+
254
+ // -----------------------------------------------------------------------------
255
+ // 5. 遮罩渐隐
256
+ // -----------------------------------------------------------------------------
257
+
258
+ .fanui-mask-fade-b {
259
+ -webkit-mask-image: linear-gradient(180deg, #000 55%, transparent 100%);
260
+ mask-image: linear-gradient(180deg, #000 55%, transparent 100%);
261
+ }
262
+
263
+ .fanui-mask-fade-t {
264
+ -webkit-mask-image: linear-gradient(0deg, #000 55%, transparent 100%);
265
+ mask-image: linear-gradient(0deg, #000 55%, transparent 100%);
266
+ }
267
+
268
+ .fanui-mask-fade-x {
269
+ -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
270
+ mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent);
271
+ }
272
+
273
+ .fanui-mask-fade-circle {
274
+ -webkit-mask-image: radial-gradient(closest-side, #000 60%, transparent 100%);
275
+ mask-image: radial-gradient(closest-side, #000 60%, transparent 100%);
276
+ }
277
+
278
+ // -----------------------------------------------------------------------------
279
+ // 6. 点击水波纹(配合 FanUI.ripple() 使用;无 JS 时静默不生效)
280
+ // -----------------------------------------------------------------------------
281
+
282
+ .fanui-ripple-host {
283
+ position: relative;
284
+ overflow: hidden;
285
+
286
+ --fanui-ripple-color: #{fn.fanui-alpha(#ffffff, 0.45)};
287
+ }
288
+
289
+ .fanui-ripple {
290
+ position: absolute;
291
+ border-radius: fn.fanui-var("radius-full");
292
+ transform: translate(-50%, -50%) scale(0);
293
+ background-color: var(--fanui-ripple-color);
294
+ pointer-events: none;
295
+ animation: fanui-ripple 620ms v.$fanui-ease-out forwards;
296
+ }
297
+
298
+ @keyframes fanui-ripple {
299
+ to {
300
+ transform: translate(-50%, -50%) scale(1);
301
+ opacity: 0;
302
+ }
303
+ }
304
+
305
+ // -----------------------------------------------------------------------------
306
+ // 7. 玻璃噪点(让大面积玻璃不至于"太干净"而显得廉价)
307
+ // -----------------------------------------------------------------------------
308
+
309
+ .fanui-glass-noise {
310
+ position: relative;
311
+
312
+ &::after {
313
+ content: "";
314
+ position: absolute;
315
+ inset: 0;
316
+ z-index: 2;
317
+ pointer-events: none;
318
+ border-radius: inherit;
319
+ opacity: 0.03;
320
+ mix-blend-mode: overlay;
321
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)'/%3E%3C/svg%3E");
322
+ }
323
+ }