@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,799 @@
1
+ /* fanUI v2.1.0 · module: input-plus(独立产物,自带令牌) */
2
+ @charset "UTF-8";
3
+ .fanui-slider {
4
+ --fanui-slider-fill: 50%;
5
+ --fanui-slider-track: var(--fanui-color-border);
6
+ --fanui-slider-thumb: #ffffff;
7
+ --fanui-slider-size: 6px;
8
+ --fanui-slider-thumb-size: 18px;
9
+ display: block;
10
+ width: 100%;
11
+ margin: 0;
12
+ padding: 0;
13
+ background: transparent;
14
+ appearance: none;
15
+ -webkit-appearance: none;
16
+ cursor: pointer;
17
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
18
+ }
19
+ .fanui-slider:focus-visible {
20
+ outline: none;
21
+ }
22
+ .fanui-slider:focus-visible::-webkit-slider-thumb {
23
+ outline: 0;
24
+ 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));
25
+ }
26
+ @media (forced-colors: active) {
27
+ .fanui-slider:focus-visible::-webkit-slider-thumb {
28
+ outline: 2px solid transparent;
29
+ outline-offset: 2px;
30
+ }
31
+ }
32
+ .fanui-slider:focus-visible::-moz-range-thumb {
33
+ outline: 0;
34
+ 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));
35
+ }
36
+ @media (forced-colors: active) {
37
+ .fanui-slider:focus-visible::-moz-range-thumb {
38
+ outline: 2px solid transparent;
39
+ outline-offset: 2px;
40
+ }
41
+ }
42
+ .fanui-slider::-webkit-slider-runnable-track {
43
+ height: var(--fanui-slider-size);
44
+ border-radius: var(--fanui-radius-full);
45
+ background-image: linear-gradient(to right, var(--fanui-primary) 0%, var(--fanui-primary-vivid) var(--fanui-slider-fill), var(--fanui-slider-track) var(--fanui-slider-fill), var(--fanui-slider-track) 100%);
46
+ }
47
+ .fanui-slider::-moz-range-track {
48
+ height: var(--fanui-slider-size);
49
+ border-radius: var(--fanui-radius-full);
50
+ background-color: var(--fanui-slider-track);
51
+ }
52
+ .fanui-slider::-moz-range-progress {
53
+ height: var(--fanui-slider-size);
54
+ border-radius: var(--fanui-radius-full);
55
+ background-image: linear-gradient(to right, var(--fanui-primary), var(--fanui-primary-vivid));
56
+ }
57
+ .fanui-slider::-webkit-slider-thumb {
58
+ width: var(--fanui-slider-thumb-size);
59
+ height: var(--fanui-slider-thumb-size);
60
+ margin-top: calc((var(--fanui-slider-size) - var(--fanui-slider-thumb-size)) / 2);
61
+ border: 2px solid var(--fanui-primary);
62
+ border-radius: var(--fanui-radius-full);
63
+ background-color: var(--fanui-slider-thumb);
64
+ box-shadow: 0 1px 4px rgba(2, 6, 23, 0.22);
65
+ appearance: none;
66
+ -webkit-appearance: none;
67
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
68
+ }
69
+ .fanui-slider::-moz-range-thumb {
70
+ width: var(--fanui-slider-thumb-size);
71
+ height: var(--fanui-slider-thumb-size);
72
+ border: 2px solid var(--fanui-primary);
73
+ border-radius: var(--fanui-radius-full);
74
+ background-color: var(--fanui-slider-thumb);
75
+ box-shadow: 0 1px 4px rgba(2, 6, 23, 0.22);
76
+ }
77
+ .fanui-slider:hover::-webkit-slider-thumb {
78
+ transform: scale(1.12);
79
+ }
80
+ .fanui-slider:active::-webkit-slider-thumb {
81
+ transform: scale(1.2);
82
+ }
83
+ .fanui-slider:disabled {
84
+ opacity: 0.5;
85
+ cursor: not-allowed;
86
+ }
87
+ .fanui-slider:disabled::-webkit-slider-thumb {
88
+ border-color: var(--fanui-color-border-strong);
89
+ }
90
+ .fanui-slider--sm {
91
+ --fanui-slider-size: 4px;
92
+ --fanui-slider-thumb-size: 14px;
93
+ }
94
+ .fanui-slider--lg {
95
+ --fanui-slider-size: 8px;
96
+ --fanui-slider-thumb-size: 24px;
97
+ }
98
+
99
+ .fanui-slider-field {
100
+ position: relative;
101
+ display: flex;
102
+ align-items: center;
103
+ gap: var(--fanui-space-3);
104
+ padding-top: var(--fanui-space-5);
105
+ }
106
+ .fanui-slider-field .fanui-slider {
107
+ flex: 1 1 auto;
108
+ min-width: 0;
109
+ }
110
+ .fanui-slider-field__bubble {
111
+ position: absolute;
112
+ top: 0;
113
+ left: var(--fanui-slider-fill, 50%);
114
+ transform: translateX(-50%);
115
+ padding: 1px 7px;
116
+ font-size: var(--fanui-font-size-xs);
117
+ font-variant-numeric: tabular-nums;
118
+ color: var(--fanui-primary-fg);
119
+ background-color: var(--fanui-primary);
120
+ border-radius: var(--fanui-radius-sm);
121
+ white-space: nowrap;
122
+ pointer-events: none;
123
+ }
124
+ .fanui-slider-field__value {
125
+ min-width: 3.5em;
126
+ font-size: var(--fanui-font-size-sm);
127
+ font-variant-numeric: tabular-nums;
128
+ text-align: end;
129
+ color: var(--fanui-color-text-muted);
130
+ }
131
+ .fanui-slider-field__marks {
132
+ display: flex;
133
+ justify-content: space-between;
134
+ margin-top: var(--fanui-space-1);
135
+ font-size: var(--fanui-font-size-xs);
136
+ color: var(--fanui-color-text-subtle);
137
+ }
138
+
139
+ .fanui-slider-range {
140
+ position: relative;
141
+ height: var(--fanui-slider-thumb-size, 18px);
142
+ }
143
+ .fanui-slider-range .fanui-slider {
144
+ position: absolute;
145
+ inset: 0;
146
+ width: 100%;
147
+ pointer-events: none;
148
+ }
149
+ .fanui-slider-range .fanui-slider::-webkit-slider-thumb {
150
+ pointer-events: auto;
151
+ }
152
+ .fanui-slider-range .fanui-slider::-moz-range-thumb {
153
+ pointer-events: auto;
154
+ }
155
+ .fanui-slider-range__rail {
156
+ position: absolute;
157
+ top: 50%;
158
+ left: 0;
159
+ right: 0;
160
+ height: var(--fanui-slider-size, 6px);
161
+ transform: translateY(-50%);
162
+ border-radius: var(--fanui-radius-full);
163
+ background-color: var(--fanui-color-border);
164
+ }
165
+ .fanui-slider-range__fill {
166
+ position: absolute;
167
+ top: 50%;
168
+ height: var(--fanui-slider-size, 6px);
169
+ transform: translateY(-50%);
170
+ border-radius: var(--fanui-radius-full);
171
+ background-image: linear-gradient(to right, var(--fanui-primary), var(--fanui-primary-vivid));
172
+ }
173
+
174
+ .fanui-rate {
175
+ display: inline-flex;
176
+ flex-direction: row-reverse;
177
+ justify-content: flex-end;
178
+ gap: 2px;
179
+ font-size: 22px;
180
+ line-height: 1;
181
+ }
182
+ .fanui-rate__input {
183
+ position: absolute !important;
184
+ width: 1px !important;
185
+ height: 1px !important;
186
+ padding: 0 !important;
187
+ margin: -1px !important;
188
+ overflow: hidden !important;
189
+ clip: rect(0, 0, 0, 0) !important;
190
+ white-space: nowrap !important;
191
+ border: 0 !important;
192
+ }
193
+ .fanui-rate__input:focus-visible ~ .fanui-rate__star {
194
+ outline: 2px solid var(--fanui-primary-ring);
195
+ outline-offset: 2px;
196
+ }
197
+ .fanui-rate__star {
198
+ color: var(--fanui-color-border-strong);
199
+ cursor: pointer;
200
+ user-select: none;
201
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
202
+ }
203
+ .fanui-rate__star::before {
204
+ content: "★";
205
+ }
206
+ .fanui-rate__star:hover {
207
+ transform: scale(1.15);
208
+ }
209
+ .fanui-rate__input:checked ~ .fanui-rate__star {
210
+ color: var(--fanui-warning-vivid);
211
+ }
212
+ .fanui-rate__star:hover, .fanui-rate__star:hover ~ .fanui-rate__star {
213
+ color: var(--fanui-warning);
214
+ }
215
+ .fanui-rate--primary .fanui-rate__input:checked ~ .fanui-rate__star {
216
+ color: var(--fanui-primary);
217
+ }
218
+ .fanui-rate--primary .fanui-rate__star:hover,
219
+ .fanui-rate--primary .fanui-rate__star:hover ~ .fanui-rate__star {
220
+ color: var(--fanui-primary-hover);
221
+ }
222
+ .fanui-rate--sm {
223
+ font-size: 16px;
224
+ }
225
+ .fanui-rate--lg {
226
+ font-size: 30px;
227
+ }
228
+ .fanui-rate--readonly .fanui-rate__star {
229
+ cursor: default;
230
+ pointer-events: none;
231
+ }
232
+ .fanui-rate--readonly .fanui-rate__star:hover {
233
+ transform: none;
234
+ }
235
+ .fanui-rate__value {
236
+ margin-inline-start: var(--fanui-space-2);
237
+ font-size: var(--fanui-font-size-sm);
238
+ color: var(--fanui-color-text-muted);
239
+ align-self: center;
240
+ }
241
+ .fanui-rate__desc {
242
+ margin-inline-start: var(--fanui-space-2);
243
+ font-size: var(--fanui-font-size-xs);
244
+ color: var(--fanui-color-text-subtle);
245
+ align-self: center;
246
+ }
247
+
248
+ .fanui-upload {
249
+ display: flex;
250
+ flex-direction: column;
251
+ gap: var(--fanui-space-3);
252
+ }
253
+ .fanui-upload__drop {
254
+ position: relative;
255
+ display: flex;
256
+ flex-direction: column;
257
+ align-items: center;
258
+ justify-content: center;
259
+ gap: var(--fanui-space-2);
260
+ padding: var(--fanui-space-8) var(--fanui-space-4);
261
+ text-align: center;
262
+ border: 2px dashed var(--fanui-color-border-strong);
263
+ border-radius: var(--fanui-radius-lg);
264
+ background-color: var(--fanui-color-surface-sunken);
265
+ color: var(--fanui-color-text-muted);
266
+ cursor: pointer;
267
+ transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
268
+ }
269
+ .fanui-upload__drop input[type=file] {
270
+ position: absolute !important;
271
+ width: 1px !important;
272
+ height: 1px !important;
273
+ padding: 0 !important;
274
+ margin: -1px !important;
275
+ overflow: hidden !important;
276
+ clip: rect(0, 0, 0, 0) !important;
277
+ white-space: nowrap !important;
278
+ border: 0 !important;
279
+ }
280
+ .fanui-upload__drop:hover, .fanui-upload__drop.is-dragover {
281
+ border-color: var(--fanui-primary);
282
+ background-color: var(--fanui-primary-soft);
283
+ color: var(--fanui-primary-ink);
284
+ }
285
+ .fanui-upload__drop.is-dragover {
286
+ transform: scale(1.01);
287
+ box-shadow: 0 0 0 4px var(--fanui-primary-ring);
288
+ }
289
+ .fanui-upload__icon {
290
+ display: grid;
291
+ place-items: center;
292
+ width: 44px;
293
+ height: 44px;
294
+ border-radius: var(--fanui-radius-full);
295
+ background-color: var(--fanui-primary-soft);
296
+ color: var(--fanui-primary);
297
+ font-size: var(--fanui-font-size-xl);
298
+ }
299
+ .fanui-upload__hint {
300
+ font-size: var(--fanui-font-size-xs);
301
+ color: var(--fanui-color-text-subtle);
302
+ }
303
+ .fanui-upload__list {
304
+ display: flex;
305
+ flex-direction: column;
306
+ gap: var(--fanui-space-2);
307
+ margin: 0;
308
+ padding: 0;
309
+ list-style: none;
310
+ }
311
+ .fanui-upload__item {
312
+ display: flex;
313
+ align-items: center;
314
+ gap: var(--fanui-space-3);
315
+ padding: var(--fanui-space-2) var(--fanui-space-3);
316
+ border: 1px solid var(--fanui-color-border);
317
+ border-radius: var(--fanui-radius-md);
318
+ background-color: var(--fanui-color-surface);
319
+ transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
320
+ }
321
+ .fanui-upload__item:hover {
322
+ border-color: var(--fanui-color-border-strong);
323
+ }
324
+ .fanui-upload__item.is-error {
325
+ border-color: var(--fanui-danger-border);
326
+ background-color: var(--fanui-danger-soft);
327
+ }
328
+ .fanui-upload__item.is-done .fanui-upload__item__state {
329
+ color: var(--fanui-success);
330
+ }
331
+ .fanui-upload__thumb {
332
+ display: grid;
333
+ place-items: center;
334
+ width: 36px;
335
+ height: 36px;
336
+ flex: 0 0 auto;
337
+ border-radius: var(--fanui-radius-sm);
338
+ background-color: var(--fanui-color-surface-sunken);
339
+ color: var(--fanui-color-text-muted);
340
+ overflow: hidden;
341
+ }
342
+ .fanui-upload__thumb img {
343
+ width: 100%;
344
+ height: 100%;
345
+ object-fit: cover;
346
+ }
347
+ .fanui-upload__meta {
348
+ flex: 1 1 auto;
349
+ min-width: 0;
350
+ }
351
+ .fanui-upload__name {
352
+ display: block;
353
+ font-size: var(--fanui-font-size-sm);
354
+ color: var(--fanui-color-text);
355
+ overflow: hidden;
356
+ text-overflow: ellipsis;
357
+ white-space: nowrap;
358
+ }
359
+ .fanui-upload__size {
360
+ font-size: var(--fanui-font-size-xs);
361
+ color: var(--fanui-color-text-subtle);
362
+ font-variant-numeric: tabular-nums;
363
+ }
364
+ .fanui-upload__state {
365
+ color: var(--fanui-color-text-muted);
366
+ flex: 0 0 auto;
367
+ }
368
+
369
+ .fanui-tag-input {
370
+ display: flex;
371
+ flex-wrap: wrap;
372
+ align-items: center;
373
+ gap: var(--fanui-space-1);
374
+ min-height: var(--fanui-control-h);
375
+ padding: 5px 8px;
376
+ border: 1px solid var(--fanui-color-border);
377
+ border-radius: var(--fanui-control-radius);
378
+ background-color: var(--fanui-color-surface);
379
+ cursor: text;
380
+ 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;
381
+ }
382
+ .fanui-tag-input:hover {
383
+ border-color: var(--fanui-color-border-strong);
384
+ }
385
+ .fanui-tag-input:focus-within {
386
+ border-color: var(--fanui-primary);
387
+ outline: 0;
388
+ 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));
389
+ }
390
+ @media (forced-colors: active) {
391
+ .fanui-tag-input:focus-within {
392
+ outline: 2px solid transparent;
393
+ outline-offset: 2px;
394
+ }
395
+ }
396
+ .fanui-tag-input__tag {
397
+ display: inline-flex;
398
+ align-items: center;
399
+ gap: 4px;
400
+ max-width: 100%;
401
+ padding: 2px 4px 2px 8px;
402
+ font-size: var(--fanui-font-size-xs);
403
+ line-height: 1.5;
404
+ color: var(--fanui-primary-ink);
405
+ background-color: var(--fanui-primary-soft);
406
+ border: 1px solid var(--fanui-primary-border);
407
+ border-radius: var(--fanui-radius-full);
408
+ animation: fanui-tag-pop 180ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
409
+ }
410
+ .fanui-tag-input__tag span {
411
+ overflow: hidden;
412
+ text-overflow: ellipsis;
413
+ white-space: nowrap;
414
+ max-width: 12em;
415
+ }
416
+ .fanui-tag-input__remove {
417
+ display: grid;
418
+ place-items: center;
419
+ width: 16px;
420
+ height: 16px;
421
+ padding: 0;
422
+ border: 0;
423
+ border-radius: var(--fanui-radius-full);
424
+ background: transparent;
425
+ color: currentColor;
426
+ cursor: pointer;
427
+ opacity: 0.65;
428
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
429
+ }
430
+ .fanui-tag-input__remove::before {
431
+ content: "×";
432
+ font-size: 14px;
433
+ line-height: 1;
434
+ }
435
+ .fanui-tag-input__remove:hover {
436
+ opacity: 1;
437
+ background-color: rgba(2, 6, 23, 0.08);
438
+ }
439
+ .fanui-tag-input__field {
440
+ flex: 1 1 6em;
441
+ min-width: 6em;
442
+ padding: 2px 4px;
443
+ border: 0;
444
+ background: transparent;
445
+ font: inherit;
446
+ font-size: var(--fanui-font-size-base);
447
+ color: var(--fanui-color-text);
448
+ }
449
+ .fanui-tag-input__field:focus {
450
+ outline: none;
451
+ }
452
+ .fanui-tag-input__field::placeholder {
453
+ color: var(--fanui-color-text-subtle);
454
+ }
455
+ .fanui-tag-input__suggest {
456
+ position: absolute;
457
+ z-index: var(--fanui-z-dropdown);
458
+ margin-top: var(--fanui-space-1);
459
+ padding: var(--fanui-space-1);
460
+ min-width: 180px;
461
+ border: 1px solid var(--fanui-color-border);
462
+ border-radius: var(--fanui-radius-md);
463
+ background-color: var(--fanui-color-overlay);
464
+ box-shadow: var(--fanui-shadow-lg);
465
+ }
466
+ .fanui-tag-input__suggest button {
467
+ display: block;
468
+ width: 100%;
469
+ padding: 6px 10px;
470
+ border: 0;
471
+ border-radius: var(--fanui-radius-sm);
472
+ background: transparent;
473
+ font: inherit;
474
+ font-size: var(--fanui-font-size-sm);
475
+ text-align: start;
476
+ color: var(--fanui-color-text);
477
+ cursor: pointer;
478
+ }
479
+ .fanui-tag-input__suggest button:hover {
480
+ background-color: var(--fanui-color-hover);
481
+ }
482
+ .fanui-tag-input__suggest button.is-active {
483
+ background-color: var(--fanui-primary-soft);
484
+ color: var(--fanui-primary-ink);
485
+ }
486
+
487
+ @keyframes fanui-tag-pop {
488
+ from {
489
+ opacity: 0;
490
+ transform: scale(0.86);
491
+ }
492
+ to {
493
+ opacity: 1;
494
+ transform: scale(1);
495
+ }
496
+ }
497
+ .fanui-stepper {
498
+ display: inline-flex;
499
+ align-items: stretch;
500
+ border: 1px solid var(--fanui-color-border);
501
+ border-radius: var(--fanui-control-radius);
502
+ background-color: var(--fanui-color-surface);
503
+ overflow: hidden;
504
+ 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;
505
+ }
506
+ .fanui-stepper:focus-within {
507
+ border-color: var(--fanui-primary);
508
+ outline: 0;
509
+ 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));
510
+ }
511
+ @media (forced-colors: active) {
512
+ .fanui-stepper:focus-within {
513
+ outline: 2px solid transparent;
514
+ outline-offset: 2px;
515
+ }
516
+ }
517
+ .fanui-stepper__btn {
518
+ display: grid;
519
+ place-items: center;
520
+ width: calc(var(--fanui-control-h) + 4px);
521
+ border: 0;
522
+ background: transparent;
523
+ color: var(--fanui-color-text-muted);
524
+ font-size: 16px;
525
+ line-height: 1;
526
+ cursor: pointer;
527
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
528
+ }
529
+ .fanui-stepper__btn:hover:not(:disabled) {
530
+ background-color: var(--fanui-primary-soft);
531
+ color: var(--fanui-primary-ink);
532
+ }
533
+ .fanui-stepper__btn:disabled {
534
+ opacity: 0.4;
535
+ cursor: not-allowed;
536
+ }
537
+ .fanui-stepper__input {
538
+ width: 3.6em;
539
+ min-height: var(--fanui-control-h);
540
+ padding: 0 4px;
541
+ border: 0;
542
+ border-inline: 1px solid var(--fanui-color-border-subtle);
543
+ background: transparent;
544
+ font: inherit;
545
+ font-size: var(--fanui-font-size-base);
546
+ font-variant-numeric: tabular-nums;
547
+ text-align: center;
548
+ color: var(--fanui-color-text);
549
+ }
550
+ .fanui-stepper__input:focus {
551
+ outline: none;
552
+ }
553
+ .fanui-stepper__input::-webkit-outer-spin-button, .fanui-stepper__input::-webkit-inner-spin-button {
554
+ appearance: none;
555
+ margin: 0;
556
+ }
557
+ .fanui-stepper--sm {
558
+ --fanui-control-h: 28px;
559
+ }
560
+ .fanui-stepper--lg {
561
+ --fanui-control-h: 40px;
562
+ }
563
+
564
+ .fanui-pin {
565
+ display: inline-flex;
566
+ gap: var(--fanui-space-2);
567
+ }
568
+ .fanui-pin__cell {
569
+ width: 44px;
570
+ height: 52px;
571
+ padding: 0;
572
+ border: 1px solid var(--fanui-color-border);
573
+ border-radius: var(--fanui-radius-md);
574
+ background-color: var(--fanui-color-surface);
575
+ font-family: var(--fanui-font-mono);
576
+ font-size: var(--fanui-font-size-xl);
577
+ font-variant-numeric: tabular-nums;
578
+ text-align: center;
579
+ color: var(--fanui-color-text-strong);
580
+ 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, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
581
+ }
582
+ .fanui-pin__cell:focus {
583
+ outline: none;
584
+ border-color: var(--fanui-primary);
585
+ outline: 0;
586
+ 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));
587
+ }
588
+ @media (forced-colors: active) {
589
+ .fanui-pin__cell:focus {
590
+ outline: 2px solid transparent;
591
+ outline-offset: 2px;
592
+ }
593
+ }
594
+ .fanui-pin__cell:focus {
595
+ transform: translateY(-2px);
596
+ }
597
+ .fanui-pin__cell.is-filled {
598
+ border-color: var(--fanui-primary-border);
599
+ background-color: var(--fanui-primary-soft);
600
+ }
601
+ .fanui-pin__cell:disabled {
602
+ background-color: var(--fanui-color-disabled-bg);
603
+ }
604
+ .fanui-pin--filled .fanui-pin__cell {
605
+ background-color: var(--fanui-color-surface-sunken);
606
+ }
607
+ .fanui-pin--sm .fanui-pin__cell {
608
+ width: 36px;
609
+ height: 42px;
610
+ font-size: var(--fanui-font-size-lg);
611
+ }
612
+ .fanui-pin--separated {
613
+ gap: var(--fanui-space-4);
614
+ }
615
+
616
+ .fanui-swatch {
617
+ display: inline-flex;
618
+ flex-wrap: wrap;
619
+ gap: var(--fanui-space-2);
620
+ }
621
+ .fanui-swatch__item {
622
+ position: relative;
623
+ display: grid;
624
+ place-items: center;
625
+ width: 30px;
626
+ height: 30px;
627
+ padding: 0;
628
+ border: 1px solid rgba(2, 6, 23, 0.12);
629
+ border-radius: var(--fanui-radius-md);
630
+ background-color: var(--fanui-swatch-color, var(--fanui-color-border));
631
+ cursor: pointer;
632
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
633
+ }
634
+ .fanui-swatch__item:hover {
635
+ transform: translateY(-2px);
636
+ box-shadow: var(--fanui-shadow-md);
637
+ }
638
+ .fanui-swatch__item[aria-checked=true], .fanui-swatch__item.is-selected {
639
+ box-shadow: 0 0 0 2px var(--fanui-color-surface), 0 0 0 4px var(--fanui-swatch-color);
640
+ }
641
+ .fanui-swatch__item[aria-checked=true]::after {
642
+ content: "";
643
+ width: 10px;
644
+ height: 6px;
645
+ border-inline-start: 2px solid #fff;
646
+ border-bottom: 2px solid #fff;
647
+ transform: rotate(-45deg) translate(1px, -1px);
648
+ filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.4));
649
+ }
650
+ .fanui-swatch--lg .fanui-swatch__item {
651
+ width: 40px;
652
+ height: 40px;
653
+ }
654
+ .fanui-swatch--round .fanui-swatch__item {
655
+ border-radius: var(--fanui-radius-full);
656
+ }
657
+
658
+ .fanui-combobox {
659
+ position: relative;
660
+ }
661
+ .fanui-combobox__control {
662
+ position: relative;
663
+ display: flex;
664
+ align-items: center;
665
+ }
666
+ .fanui-combobox__input {
667
+ display: block;
668
+ width: 100%;
669
+ min-height: 36px;
670
+ padding: 6.5px 14px;
671
+ font-family: inherit;
672
+ font-size: 14px;
673
+ line-height: 1.5;
674
+ color: var(--fanui-color-text);
675
+ background-color: var(--fanui-color-surface);
676
+ border: 1px solid var(--fanui-color-border);
677
+ border-radius: 6px;
678
+ box-sizing: border-box;
679
+ appearance: none;
680
+ -webkit-appearance: none;
681
+ -moz-appearance: none;
682
+ background-clip: padding-box;
683
+ 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, background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
684
+ }
685
+ .fanui-combobox__input::placeholder {
686
+ color: var(--fanui-color-text-subtle);
687
+ opacity: 1;
688
+ }
689
+ .fanui-combobox__input::-webkit-input-placeholder {
690
+ color: var(--fanui-color-text-subtle);
691
+ opacity: 1;
692
+ }
693
+ .fanui-combobox__input::-moz-placeholder {
694
+ color: var(--fanui-color-text-subtle);
695
+ opacity: 1;
696
+ }
697
+ .fanui-combobox__input:-ms-input-placeholder {
698
+ color: var(--fanui-color-text-subtle);
699
+ opacity: 1;
700
+ }
701
+ .fanui-combobox__input:hover:not(:disabled):not(.is-disabled) {
702
+ border-color: var(--fanui-color-border-strong);
703
+ }
704
+ .fanui-combobox__input:focus, .fanui-combobox__input:focus-visible {
705
+ border-color: var(--fanui-primary);
706
+ outline: 0;
707
+ 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));
708
+ }
709
+ @media (forced-colors: active) {
710
+ .fanui-combobox__input:focus, .fanui-combobox__input:focus-visible {
711
+ outline: 2px solid transparent;
712
+ outline-offset: 2px;
713
+ }
714
+ }
715
+ .fanui-combobox__input:disabled, .fanui-combobox__input.is-disabled {
716
+ background-color: var(--fanui-color-disabled-bg);
717
+ color: var(--fanui-color-disabled-text);
718
+ cursor: not-allowed;
719
+ resize: none;
720
+ }
721
+ .fanui-combobox__input[readonly] {
722
+ background-color: var(--fanui-color-surface-sunken);
723
+ }
724
+ .fanui-combobox__input {
725
+ padding-inline-end: 34px;
726
+ }
727
+ .fanui-combobox__toggle {
728
+ position: absolute;
729
+ inset-inline-end: 6px;
730
+ display: grid;
731
+ place-items: center;
732
+ width: 24px;
733
+ height: 24px;
734
+ border: 0;
735
+ border-radius: var(--fanui-radius-sm);
736
+ background: transparent;
737
+ color: var(--fanui-color-text-muted);
738
+ cursor: pointer;
739
+ }
740
+ .fanui-combobox__toggle:hover {
741
+ background-color: var(--fanui-color-hover);
742
+ }
743
+ .fanui-combobox__list {
744
+ position: absolute;
745
+ inset-inline: 0;
746
+ top: calc(100% + 4px);
747
+ z-index: var(--fanui-z-dropdown);
748
+ max-height: 260px;
749
+ margin: 0;
750
+ padding: var(--fanui-space-1);
751
+ list-style: none;
752
+ overflow-y: auto;
753
+ border: 1px solid var(--fanui-color-border);
754
+ border-radius: var(--fanui-radius-md);
755
+ background-color: var(--fanui-color-overlay);
756
+ box-shadow: var(--fanui-shadow-xl);
757
+ opacity: 0;
758
+ visibility: hidden;
759
+ transform: translateY(-4px);
760
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, visibility 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
761
+ }
762
+ .fanui-combobox__list.is-open {
763
+ opacity: 1;
764
+ visibility: visible;
765
+ transform: translateY(0);
766
+ }
767
+ .fanui-combobox__option {
768
+ display: flex;
769
+ align-items: center;
770
+ justify-content: space-between;
771
+ gap: var(--fanui-space-2);
772
+ padding: 7px 10px;
773
+ border-radius: var(--fanui-radius-sm);
774
+ font-size: var(--fanui-font-size-sm);
775
+ color: var(--fanui-color-text);
776
+ cursor: pointer;
777
+ }
778
+ .fanui-combobox__option:hover, .fanui-combobox__option.is-active {
779
+ background-color: var(--fanui-color-hover);
780
+ }
781
+ .fanui-combobox__option.is-selected {
782
+ color: var(--fanui-primary-ink);
783
+ background-color: var(--fanui-primary-soft);
784
+ }
785
+ .fanui-combobox__option.is-disabled {
786
+ opacity: 0.5;
787
+ cursor: not-allowed;
788
+ }
789
+ .fanui-combobox__empty {
790
+ padding: var(--fanui-space-4);
791
+ text-align: center;
792
+ font-size: var(--fanui-font-size-sm);
793
+ color: var(--fanui-color-text-subtle);
794
+ }
795
+ .fanui-combobox__mark {
796
+ background-color: var(--fanui-warning-soft-2);
797
+ color: inherit;
798
+ font-weight: var(--fanui-font-weight-semibold);
799
+ }