@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,830 @@
1
+ /* fanUI v2.1.0 · module: advanced(独立产物,自带令牌) */
2
+ @charset "UTF-8";
3
+ .fanui-loading-bar {
4
+ position: fixed;
5
+ top: 0;
6
+ left: 0;
7
+ right: 0;
8
+ z-index: var(--fanui-z-toast, 1090);
9
+ height: 3px;
10
+ pointer-events: none;
11
+ opacity: 0;
12
+ background-color: transparent;
13
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
14
+ }
15
+ .fanui-loading-bar__inner {
16
+ height: 100%;
17
+ width: var(--fanui-loading-progress, 0%);
18
+ border-radius: 0 9999px 9999px 0;
19
+ background-image: linear-gradient(90deg, var(--fanui-primary), var(--fanui-accent-vivid));
20
+ box-shadow: 0 0 8px var(--fanui-primary-ring);
21
+ transition: width 240ms cubic-bezier(0, 0, 0.2, 1) 0s;
22
+ }
23
+ .fanui-loading-bar.is-loading {
24
+ opacity: 1;
25
+ }
26
+ .fanui-loading-bar--indeterminate .fanui-loading-bar__inner {
27
+ width: 40% !important;
28
+ animation: fanui-loading-slide 1.1s var(--fanui-ease-in-out, ease-in-out) infinite;
29
+ }
30
+
31
+ @keyframes fanui-loading-slide {
32
+ 0% {
33
+ margin-inline-start: -40%;
34
+ }
35
+ 100% {
36
+ margin-inline-start: 100%;
37
+ }
38
+ }
39
+ .fanui-cascader__panel, .fanui-datepanel,
40
+ .fanui-timepanel,
41
+ .fanui-colorpanel {
42
+ position: absolute;
43
+ z-index: var(--fanui-z-popover, 1070);
44
+ min-width: 260px;
45
+ padding: var(--fanui-space-3);
46
+ background-color: var(--fanui-color-overlay);
47
+ border: 1px solid var(--fanui-color-border);
48
+ border-radius: var(--fanui-radius-lg);
49
+ box-shadow: var(--fanui-shadow-xl);
50
+ opacity: 0;
51
+ visibility: hidden;
52
+ transform: translateY(-4px) scale(0.98);
53
+ transform-origin: top left;
54
+ transition: opacity 150ms cubic-bezier(0, 0, 0.2, 1) 0s, visibility 150ms cubic-bezier(0, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0, 0, 0.2, 1) 0s;
55
+ }
56
+ .is-open.fanui-cascader__panel, .is-open.fanui-datepanel,
57
+ .is-open.fanui-timepanel,
58
+ .is-open.fanui-colorpanel {
59
+ opacity: 1;
60
+ visibility: visible;
61
+ transform: translateY(0) scale(1);
62
+ }
63
+
64
+ .fanui-datepanel {
65
+ width: 292px;
66
+ }
67
+ .fanui-datepanel__head {
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: space-between;
71
+ gap: var(--fanui-space-2);
72
+ margin-bottom: var(--fanui-space-2);
73
+ }
74
+ .fanui-datepanel__title {
75
+ flex: 1 1 auto;
76
+ text-align: center;
77
+ font-size: var(--fanui-font-size-sm);
78
+ font-weight: var(--fanui-font-weight-semibold);
79
+ color: var(--fanui-color-text-strong);
80
+ }
81
+ .fanui-datepanel__nav {
82
+ display: grid;
83
+ place-items: center;
84
+ width: 28px;
85
+ height: 28px;
86
+ flex: 0 0 auto;
87
+ border: 0;
88
+ border-radius: var(--fanui-radius-sm);
89
+ background-color: transparent;
90
+ color: var(--fanui-color-text-muted);
91
+ cursor: pointer;
92
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
93
+ }
94
+ .fanui-datepanel__nav:hover {
95
+ background-color: var(--fanui-color-hover);
96
+ color: var(--fanui-color-text-strong);
97
+ }
98
+ .fanui-datepanel__nav:focus-visible {
99
+ outline: 0;
100
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
101
+ }
102
+ @media (forced-colors: active) {
103
+ .fanui-datepanel__nav:focus-visible {
104
+ outline: 2px solid transparent;
105
+ outline-offset: 2px;
106
+ }
107
+ }
108
+ .fanui-datepanel__nav:disabled {
109
+ opacity: 0.35;
110
+ pointer-events: none;
111
+ }
112
+ .fanui-datepanel__week, .fanui-datepanel__grid {
113
+ display: grid;
114
+ grid-template-columns: repeat(7, 1fr);
115
+ gap: 2px;
116
+ }
117
+ .fanui-datepanel__week > span {
118
+ padding: 4px 0;
119
+ text-align: center;
120
+ font-size: var(--fanui-font-size-xs);
121
+ font-weight: var(--fanui-font-weight-semibold);
122
+ color: var(--fanui-color-text-subtle);
123
+ }
124
+ .fanui-datepanel__day {
125
+ display: grid;
126
+ place-items: center;
127
+ aspect-ratio: 1;
128
+ border: 0;
129
+ border-radius: var(--fanui-radius-sm);
130
+ background-color: transparent;
131
+ font-size: var(--fanui-font-size-sm);
132
+ font-variant-numeric: tabular-nums;
133
+ color: var(--fanui-color-text);
134
+ cursor: pointer;
135
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
136
+ }
137
+ .fanui-datepanel__day:hover {
138
+ background-color: var(--fanui-color-hover);
139
+ }
140
+ .fanui-datepanel__day:focus-visible {
141
+ outline: 0;
142
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
143
+ }
144
+ @media (forced-colors: active) {
145
+ .fanui-datepanel__day:focus-visible {
146
+ outline: 2px solid transparent;
147
+ outline-offset: 2px;
148
+ }
149
+ }
150
+ .fanui-datepanel__day.is-other {
151
+ color: var(--fanui-color-text-subtle);
152
+ opacity: 0.55;
153
+ }
154
+ .fanui-datepanel__day.is-today {
155
+ color: var(--fanui-primary);
156
+ font-weight: var(--fanui-font-weight-bold);
157
+ box-shadow: inset 0 0 0 1px var(--fanui-primary-border);
158
+ }
159
+ .fanui-datepanel__day.is-selected {
160
+ color: var(--fanui-primary-fg);
161
+ background-color: var(--fanui-primary);
162
+ font-weight: var(--fanui-font-weight-semibold);
163
+ }
164
+ .fanui-datepanel__day.is-in-range {
165
+ color: var(--fanui-primary-ink);
166
+ background-color: var(--fanui-primary-soft);
167
+ border-radius: 0;
168
+ }
169
+ .fanui-datepanel__day:disabled {
170
+ color: var(--fanui-color-text-subtle);
171
+ opacity: 0.35;
172
+ text-decoration: line-through;
173
+ pointer-events: none;
174
+ }
175
+ .fanui-datepanel__quick {
176
+ display: flex;
177
+ flex-wrap: wrap;
178
+ gap: 6px;
179
+ margin-top: var(--fanui-space-2);
180
+ padding-top: var(--fanui-space-2);
181
+ border-top: 1px solid var(--fanui-color-border-subtle);
182
+ }
183
+ .fanui-datepanel__quick button {
184
+ padding: 3px 10px;
185
+ border: 1px solid var(--fanui-color-border);
186
+ border-radius: var(--fanui-radius-full);
187
+ background-color: transparent;
188
+ font-size: var(--fanui-font-size-xs);
189
+ color: var(--fanui-color-text-muted);
190
+ cursor: pointer;
191
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, border-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
192
+ }
193
+ .fanui-datepanel__quick button:hover {
194
+ color: var(--fanui-primary);
195
+ border-color: var(--fanui-primary-border);
196
+ background-color: var(--fanui-primary-soft);
197
+ }
198
+ .fanui-datepanel__foot {
199
+ display: flex;
200
+ justify-content: space-between;
201
+ margin-top: var(--fanui-space-2);
202
+ font-size: var(--fanui-font-size-xs);
203
+ color: var(--fanui-color-text-subtle);
204
+ }
205
+
206
+ .fanui-timepanel {
207
+ width: 160px;
208
+ max-height: 280px;
209
+ overflow-y: auto;
210
+ scrollbar-width: thin;
211
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
212
+ }
213
+ .fanui-timepanel::-webkit-scrollbar {
214
+ width: 6px;
215
+ height: 6px;
216
+ }
217
+ .fanui-timepanel::-webkit-scrollbar-track {
218
+ background: transparent;
219
+ }
220
+ .fanui-timepanel::-webkit-scrollbar-thumb {
221
+ background: rgba(100, 116, 139, 0.45);
222
+ border-radius: 9999px;
223
+ }
224
+ .fanui-timepanel::-webkit-scrollbar-thumb:hover {
225
+ background: rgba(100, 116, 139, 0.7);
226
+ }
227
+ .fanui-timepanel__opt {
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: space-between;
231
+ width: 100%;
232
+ padding: 7px 12px;
233
+ border: 0;
234
+ border-radius: var(--fanui-radius-sm);
235
+ background-color: transparent;
236
+ font-size: var(--fanui-font-size-sm);
237
+ font-variant-numeric: tabular-nums;
238
+ color: var(--fanui-color-text);
239
+ cursor: pointer;
240
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
241
+ }
242
+ .fanui-timepanel__opt:hover {
243
+ background-color: var(--fanui-color-hover);
244
+ }
245
+ .fanui-timepanel__opt:focus-visible {
246
+ outline: 0;
247
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
248
+ }
249
+ @media (forced-colors: active) {
250
+ .fanui-timepanel__opt:focus-visible {
251
+ outline: 2px solid transparent;
252
+ outline-offset: 2px;
253
+ }
254
+ }
255
+ .fanui-timepanel__opt.is-selected {
256
+ color: var(--fanui-primary-fg);
257
+ background-color: var(--fanui-primary);
258
+ font-weight: var(--fanui-font-weight-semibold);
259
+ }
260
+ .fanui-timepanel__opt.is-selected::after {
261
+ content: "✓";
262
+ font-size: 12px;
263
+ }
264
+ .fanui-timepanel__empty {
265
+ padding: var(--fanui-space-4);
266
+ text-align: center;
267
+ font-size: var(--fanui-font-size-xs);
268
+ color: var(--fanui-color-text-subtle);
269
+ }
270
+
271
+ .fanui-colorpanel {
272
+ width: 264px;
273
+ }
274
+ .fanui-colorpanel__preview {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: var(--fanui-space-3);
278
+ margin-bottom: var(--fanui-space-3);
279
+ }
280
+ .fanui-colorpanel__swatch {
281
+ width: 44px;
282
+ height: 44px;
283
+ flex: 0 0 auto;
284
+ border-radius: var(--fanui-radius-md);
285
+ border: 1px solid var(--fanui-color-border);
286
+ box-shadow: inset 0 0 0 2px var(--fanui-color-surface);
287
+ }
288
+ .fanui-colorpanel__value {
289
+ flex: 1 1 auto;
290
+ min-width: 0;
291
+ padding: 7px 10px;
292
+ border: 1px solid var(--fanui-color-border);
293
+ border-radius: var(--fanui-radius-md);
294
+ background-color: var(--fanui-color-surface-sunken);
295
+ font-family: var(--fanui-font-mono);
296
+ font-size: var(--fanui-font-size-sm);
297
+ color: var(--fanui-color-text);
298
+ text-transform: uppercase;
299
+ }
300
+ .fanui-colorpanel__slider {
301
+ width: 100%;
302
+ margin: 0 0 var(--fanui-space-2);
303
+ accent-color: var(--fanui-primary);
304
+ cursor: pointer;
305
+ }
306
+ .fanui-colorpanel__row {
307
+ display: flex;
308
+ align-items: center;
309
+ gap: var(--fanui-space-2);
310
+ margin-bottom: var(--fanui-space-2);
311
+ font-size: var(--fanui-font-size-xs);
312
+ color: var(--fanui-color-text-subtle);
313
+ }
314
+ .fanui-colorpanel__row label {
315
+ flex: 0 0 32px;
316
+ }
317
+ .fanui-colorpanel__palette {
318
+ display: grid;
319
+ grid-template-columns: repeat(8, 1fr);
320
+ gap: 6px;
321
+ margin-top: var(--fanui-space-3);
322
+ padding-top: var(--fanui-space-3);
323
+ border-top: 1px solid var(--fanui-color-border-subtle);
324
+ }
325
+ .fanui-colorpanel__palette button {
326
+ aspect-ratio: 1;
327
+ border: 0;
328
+ border-radius: var(--fanui-radius-sm);
329
+ cursor: pointer;
330
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
331
+ }
332
+ .fanui-colorpanel__palette button:hover {
333
+ transform: scale(1.12);
334
+ box-shadow: var(--fanui-shadow-md);
335
+ }
336
+ .fanui-colorpanel__palette button.is-selected {
337
+ box-shadow: 0 0 0 2px var(--fanui-color-surface), 0 0 0 4px var(--fanui-primary);
338
+ }
339
+ .fanui-colorpanel__palette button:focus-visible {
340
+ outline: 0;
341
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
342
+ }
343
+ @media (forced-colors: active) {
344
+ .fanui-colorpanel__palette button:focus-visible {
345
+ outline: 2px solid transparent;
346
+ outline-offset: 2px;
347
+ }
348
+ }
349
+ .fanui-colorpanel__actions {
350
+ display: flex;
351
+ justify-content: space-between;
352
+ gap: var(--fanui-space-2);
353
+ margin-top: var(--fanui-space-3);
354
+ }
355
+
356
+ .fanui-cascader {
357
+ position: relative;
358
+ display: inline-flex;
359
+ width: 100%;
360
+ }
361
+ .fanui-cascader__trigger {
362
+ display: flex;
363
+ align-items: center;
364
+ justify-content: space-between;
365
+ gap: var(--fanui-space-2);
366
+ width: 100%;
367
+ padding: 8px 12px;
368
+ border: 1px solid var(--fanui-color-border);
369
+ border-radius: var(--fanui-radius-md);
370
+ background-color: var(--fanui-color-surface);
371
+ font-size: var(--fanui-font-size-sm);
372
+ color: var(--fanui-color-text);
373
+ cursor: pointer;
374
+ text-align: start;
375
+ transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
376
+ }
377
+ .fanui-cascader__trigger:hover {
378
+ border-color: var(--fanui-primary-border);
379
+ }
380
+ .fanui-cascader__trigger:focus-visible {
381
+ outline: 0;
382
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
383
+ }
384
+ @media (forced-colors: active) {
385
+ .fanui-cascader__trigger:focus-visible {
386
+ outline: 2px solid transparent;
387
+ outline-offset: 2px;
388
+ }
389
+ }
390
+ .fanui-cascader__trigger.is-active {
391
+ border-color: var(--fanui-primary);
392
+ }
393
+ .fanui-cascader__trigger .fanui-cascader__placeholder {
394
+ color: var(--fanui-color-text-subtle);
395
+ }
396
+ .fanui-cascader__trigger .fanui-cascader__caret {
397
+ color: var(--fanui-color-text-subtle);
398
+ font-size: 10px;
399
+ }
400
+ .fanui-cascader__panel {
401
+ display: none;
402
+ width: max-content;
403
+ max-width: min(560px, 92vw);
404
+ }
405
+ .fanui-cascader__panel.is-open {
406
+ display: flex;
407
+ }
408
+ .fanui-cascader__panel.is-searching {
409
+ display: block;
410
+ }
411
+ .fanui-cascader__search {
412
+ width: 100%;
413
+ padding: 7px 10px;
414
+ margin-bottom: var(--fanui-space-2);
415
+ border: 1px solid var(--fanui-color-border);
416
+ border-radius: var(--fanui-radius-sm);
417
+ background-color: var(--fanui-color-surface-sunken);
418
+ font-size: var(--fanui-font-size-sm);
419
+ color: var(--fanui-color-text);
420
+ }
421
+ .fanui-cascader__cols {
422
+ display: flex;
423
+ max-height: 280px;
424
+ }
425
+ .fanui-cascader__col {
426
+ flex: 0 0 auto;
427
+ width: 180px;
428
+ max-height: 280px;
429
+ overflow-y: auto;
430
+ padding: 4px;
431
+ border-inline-end: 1px solid var(--fanui-color-border-subtle);
432
+ scrollbar-width: thin;
433
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
434
+ }
435
+ .fanui-cascader__col::-webkit-scrollbar {
436
+ width: 6px;
437
+ height: 6px;
438
+ }
439
+ .fanui-cascader__col::-webkit-scrollbar-track {
440
+ background: transparent;
441
+ }
442
+ .fanui-cascader__col::-webkit-scrollbar-thumb {
443
+ background: rgba(100, 116, 139, 0.45);
444
+ border-radius: 9999px;
445
+ }
446
+ .fanui-cascader__col::-webkit-scrollbar-thumb:hover {
447
+ background: rgba(100, 116, 139, 0.7);
448
+ }
449
+ .fanui-cascader__col:last-child {
450
+ border-inline-end: 0;
451
+ }
452
+ .fanui-cascader__opt {
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: space-between;
456
+ gap: 6px;
457
+ width: 100%;
458
+ padding: 7px 10px;
459
+ border: 0;
460
+ border-radius: var(--fanui-radius-sm);
461
+ background-color: transparent;
462
+ font-size: var(--fanui-font-size-sm);
463
+ text-align: start;
464
+ color: var(--fanui-color-text);
465
+ cursor: pointer;
466
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
467
+ }
468
+ .fanui-cascader__opt:hover {
469
+ background-color: var(--fanui-color-hover);
470
+ }
471
+ .fanui-cascader__opt:focus-visible {
472
+ outline: 0;
473
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
474
+ }
475
+ @media (forced-colors: active) {
476
+ .fanui-cascader__opt:focus-visible {
477
+ outline: 2px solid transparent;
478
+ outline-offset: 2px;
479
+ }
480
+ }
481
+ .fanui-cascader__opt.is-active {
482
+ color: var(--fanui-primary-ink);
483
+ background-color: var(--fanui-primary-soft);
484
+ font-weight: var(--fanui-font-weight-semibold);
485
+ }
486
+ .fanui-cascader__opt .fanui-cascader__arrow {
487
+ font-size: 10px;
488
+ color: var(--fanui-color-text-subtle);
489
+ }
490
+ .fanui-cascader__breadcrumb {
491
+ display: flex;
492
+ flex-wrap: wrap;
493
+ align-items: center;
494
+ gap: 4px;
495
+ margin-top: var(--fanui-space-2);
496
+ padding-top: var(--fanui-space-2);
497
+ border-top: 1px solid var(--fanui-color-border-subtle);
498
+ font-size: var(--fanui-font-size-xs);
499
+ color: var(--fanui-color-text-subtle);
500
+ }
501
+ .fanui-cascader__breadcrumb b {
502
+ color: var(--fanui-color-text-strong);
503
+ font-weight: var(--fanui-font-weight-semibold);
504
+ }
505
+
506
+ .fanui-tree {
507
+ margin: 0;
508
+ padding: 0;
509
+ list-style: none;
510
+ font-size: var(--fanui-font-size-sm);
511
+ color: var(--fanui-color-text);
512
+ }
513
+ .fanui-tree ul {
514
+ margin: 0;
515
+ padding: 0 0 0 20px;
516
+ list-style: none;
517
+ }
518
+ .fanui-tree li {
519
+ position: relative;
520
+ }
521
+ .fanui-tree__row {
522
+ display: flex;
523
+ align-items: center;
524
+ gap: 6px;
525
+ padding: 5px 8px;
526
+ border-radius: var(--fanui-radius-sm);
527
+ cursor: pointer;
528
+ user-select: none;
529
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
530
+ }
531
+ .fanui-tree__row:hover {
532
+ background-color: var(--fanui-color-hover);
533
+ }
534
+ .fanui-tree__row.is-selected {
535
+ color: var(--fanui-primary-ink);
536
+ background-color: var(--fanui-primary-soft);
537
+ }
538
+ .fanui-tree__caret {
539
+ display: grid;
540
+ place-items: center;
541
+ width: 18px;
542
+ height: 18px;
543
+ flex: 0 0 auto;
544
+ border: 0;
545
+ border-radius: var(--fanui-radius-sm);
546
+ background-color: transparent;
547
+ color: var(--fanui-color-text-subtle);
548
+ font-size: 9px;
549
+ cursor: pointer;
550
+ transition: transform 0.15s var(--fanui-ease-out, ease-out);
551
+ visibility: hidden;
552
+ }
553
+ .fanui-tree__caret.is-expandable {
554
+ visibility: visible;
555
+ }
556
+ .fanui-tree__caret.is-open {
557
+ transform: rotate(90deg);
558
+ }
559
+ .fanui-tree__caret:focus-visible {
560
+ outline: 0;
561
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
562
+ }
563
+ @media (forced-colors: active) {
564
+ .fanui-tree__caret:focus-visible {
565
+ outline: 2px solid transparent;
566
+ outline-offset: 2px;
567
+ }
568
+ }
569
+ .fanui-tree__check {
570
+ flex: 0 0 auto;
571
+ width: 15px;
572
+ height: 15px;
573
+ accent-color: var(--fanui-primary);
574
+ cursor: pointer;
575
+ }
576
+ .fanui-tree__icon {
577
+ flex: 0 0 auto;
578
+ color: var(--fanui-primary);
579
+ font-size: 13px;
580
+ }
581
+ .fanui-tree__label {
582
+ flex: 1 1 auto;
583
+ min-width: 0;
584
+ overflow: hidden;
585
+ text-overflow: ellipsis;
586
+ white-space: nowrap;
587
+ }
588
+ .fanui-tree__badge {
589
+ flex: 0 0 auto;
590
+ padding: 1px 7px;
591
+ font-size: 10px;
592
+ color: var(--fanui-color-text-subtle);
593
+ background-color: var(--fanui-color-surface-sunken);
594
+ border-radius: var(--fanui-radius-full);
595
+ }
596
+ .fanui-tree li.is-collapsed > ul {
597
+ display: none;
598
+ }
599
+ .fanui-tree__check:indeterminate {
600
+ opacity: 1;
601
+ }
602
+
603
+ .fanui-transfer {
604
+ display: grid;
605
+ grid-template-columns: 1fr auto 1fr;
606
+ gap: var(--fanui-space-3);
607
+ align-items: center;
608
+ width: 100%;
609
+ }
610
+ @media (max-width: 767.95px) {
611
+ .fanui-transfer {
612
+ grid-template-columns: 1fr;
613
+ justify-items: center;
614
+ }
615
+ }
616
+ .fanui-transfer__panel {
617
+ display: flex;
618
+ flex-direction: column;
619
+ width: 100%;
620
+ min-width: 220px;
621
+ border: 1px solid var(--fanui-color-border);
622
+ border-radius: var(--fanui-radius-lg);
623
+ background-color: var(--fanui-color-surface);
624
+ overflow: hidden;
625
+ }
626
+ .fanui-transfer__head {
627
+ display: flex;
628
+ align-items: center;
629
+ justify-content: space-between;
630
+ gap: var(--fanui-space-2);
631
+ padding: var(--fanui-space-2) var(--fanui-space-3);
632
+ border-bottom: 1px solid var(--fanui-color-border-subtle);
633
+ background-color: var(--fanui-color-surface-sunken);
634
+ font-size: var(--fanui-font-size-xs);
635
+ color: var(--fanui-color-text-muted);
636
+ }
637
+ .fanui-transfer__title {
638
+ font-weight: var(--fanui-font-weight-semibold);
639
+ color: var(--fanui-color-text-strong);
640
+ }
641
+ .fanui-transfer__search {
642
+ width: 100%;
643
+ padding: 7px 10px;
644
+ border: 0;
645
+ border-bottom: 1px solid var(--fanui-color-border-subtle);
646
+ background-color: var(--fanui-color-surface);
647
+ font-size: var(--fanui-font-size-xs);
648
+ color: var(--fanui-color-text);
649
+ }
650
+ .fanui-transfer__list {
651
+ max-height: 260px;
652
+ overflow-y: auto;
653
+ margin: 0;
654
+ padding: 4px;
655
+ list-style: none;
656
+ scrollbar-width: thin;
657
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
658
+ }
659
+ .fanui-transfer__list::-webkit-scrollbar {
660
+ width: 6px;
661
+ height: 6px;
662
+ }
663
+ .fanui-transfer__list::-webkit-scrollbar-track {
664
+ background: transparent;
665
+ }
666
+ .fanui-transfer__list::-webkit-scrollbar-thumb {
667
+ background: rgba(100, 116, 139, 0.45);
668
+ border-radius: 9999px;
669
+ }
670
+ .fanui-transfer__list::-webkit-scrollbar-thumb:hover {
671
+ background: rgba(100, 116, 139, 0.7);
672
+ }
673
+ .fanui-transfer__opt {
674
+ display: flex;
675
+ align-items: center;
676
+ gap: 8px;
677
+ padding: 6px 8px;
678
+ border-radius: var(--fanui-radius-sm);
679
+ cursor: pointer;
680
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
681
+ }
682
+ .fanui-transfer__opt:hover {
683
+ background-color: var(--fanui-color-hover);
684
+ }
685
+ .fanui-transfer__opt.is-selected {
686
+ background-color: var(--fanui-primary-soft);
687
+ }
688
+ .fanui-transfer__opt.is-disabled {
689
+ pointer-events: none;
690
+ background-color: var(--fanui-color-disabled-bg);
691
+ color: var(--fanui-color-disabled-text);
692
+ }
693
+ .fanui-transfer__opt.is-disabled .fanui-transfer__opt-label,
694
+ .fanui-transfer__opt.is-disabled .fanui-transfer__opt-tag {
695
+ color: var(--fanui-color-disabled-text);
696
+ }
697
+ .fanui-transfer__opt-check {
698
+ accent-color: var(--fanui-primary);
699
+ flex: 0 0 auto;
700
+ }
701
+ .fanui-transfer__opt-label {
702
+ flex: 1 1 auto;
703
+ min-width: 0;
704
+ overflow: hidden;
705
+ text-overflow: ellipsis;
706
+ white-space: nowrap;
707
+ }
708
+ .fanui-transfer__opt-tag {
709
+ flex: 0 0 auto;
710
+ font-size: 10px;
711
+ color: var(--fanui-color-text-subtle);
712
+ }
713
+ .fanui-transfer__empty {
714
+ padding: var(--fanui-space-5) var(--fanui-space-3);
715
+ text-align: center;
716
+ font-size: var(--fanui-font-size-xs);
717
+ color: var(--fanui-color-text-subtle);
718
+ }
719
+ .fanui-transfer__actions {
720
+ display: flex;
721
+ flex-direction: column;
722
+ gap: var(--fanui-space-2);
723
+ }
724
+ @media (max-width: 767.95px) {
725
+ .fanui-transfer__actions {
726
+ flex-direction: row;
727
+ }
728
+ }
729
+ .fanui-transfer__btn {
730
+ display: grid;
731
+ place-items: center;
732
+ width: 36px;
733
+ height: 36px;
734
+ border: 1px solid var(--fanui-color-border);
735
+ border-radius: var(--fanui-radius-md);
736
+ background-color: var(--fanui-color-surface);
737
+ color: var(--fanui-color-text-muted);
738
+ font-size: 14px;
739
+ cursor: pointer;
740
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, border-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
741
+ }
742
+ .fanui-transfer__btn:hover:not(:disabled) {
743
+ color: var(--fanui-primary-fg);
744
+ background-color: var(--fanui-primary);
745
+ border-color: var(--fanui-primary);
746
+ }
747
+ .fanui-transfer__btn:disabled {
748
+ opacity: 0.4;
749
+ pointer-events: none;
750
+ }
751
+ .fanui-transfer__btn:focus-visible {
752
+ outline: 0;
753
+ box-shadow: 0 0 0 var(--fanui-focus-ring-offset, 1px) var(--fanui-color-surface, #fff), 0 0 0 calc(var(--fanui-focus-ring-offset, 1px) + var(--fanui-focus-ring-width, 3px)) var(--fanui-focus-ring-color, rgba(14, 116, 144, 0.3));
754
+ }
755
+ @media (forced-colors: active) {
756
+ .fanui-transfer__btn:focus-visible {
757
+ outline: 2px solid transparent;
758
+ outline-offset: 2px;
759
+ }
760
+ }
761
+
762
+ .fanui-cluster {
763
+ display: flex;
764
+ flex-wrap: wrap;
765
+ align-items: center;
766
+ gap: var(--fanui-cluster-gap, var(--fanui-space-3));
767
+ margin-inline: calc(var(--fanui-cluster-gap, var(--fanui-space-3)) * -0.5);
768
+ }
769
+ .fanui-cluster > * {
770
+ margin-inline: calc(var(--fanui-cluster-gap, var(--fanui-space-3)) * 0.5);
771
+ }
772
+ .fanui-cluster--center {
773
+ justify-content: center;
774
+ }
775
+ .fanui-cluster--between {
776
+ justify-content: space-between;
777
+ }
778
+ .fanui-cluster--end {
779
+ justify-content: flex-end;
780
+ }
781
+ .fanui-cluster--tight {
782
+ --fanui-cluster-gap: var(--fanui-space-2);
783
+ }
784
+ .fanui-cluster--loose {
785
+ --fanui-cluster-gap: var(--fanui-space-5);
786
+ }
787
+
788
+ .fanui-logo-cloud {
789
+ display: grid;
790
+ grid-template-columns: repeat(auto-fit, minmax(var(--fanui-logo-min, 150px), 1fr));
791
+ gap: var(--fanui-space-4);
792
+ align-items: stretch;
793
+ }
794
+ .fanui-logo-cloud__item {
795
+ display: grid;
796
+ place-items: center;
797
+ min-height: 72px;
798
+ padding: var(--fanui-space-4);
799
+ border: 1px solid var(--fanui-color-border-subtle);
800
+ border-radius: var(--fanui-radius-lg);
801
+ background-color: var(--fanui-color-surface);
802
+ font-weight: var(--fanui-font-weight-bold);
803
+ letter-spacing: var(--fanui-tracking-wide);
804
+ color: var(--fanui-color-text-subtle);
805
+ transition: filter 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
806
+ }
807
+ .fanui-logo-cloud__item img {
808
+ max-height: 32px;
809
+ max-width: 100%;
810
+ object-fit: contain;
811
+ opacity: 0.62;
812
+ filter: grayscale(1);
813
+ transition: filter 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
814
+ }
815
+ .fanui-logo-cloud__item:hover {
816
+ color: var(--fanui-primary);
817
+ transform: translateY(-2px);
818
+ box-shadow: var(--fanui-shadow-md);
819
+ }
820
+ .fanui-logo-cloud__item:hover img {
821
+ opacity: 1;
822
+ filter: none;
823
+ }
824
+
825
+ @media (prefers-reduced-motion: reduce) {
826
+ .fanui-loading-bar--indeterminate .fanui-loading-bar__inner {
827
+ animation: none;
828
+ width: 100% !important;
829
+ }
830
+ }