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