@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,1057 @@
1
+ /* fanUI v2.1.0 · module: dashboard(独立产物,自带令牌) */
2
+ .fanui-kpi {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--fanui-space-3);
6
+ padding: var(--fanui-space-5);
7
+ border-radius: var(--fanui-radius-xl);
8
+ position: relative;
9
+ isolation: isolate;
10
+ background-color: rgba(var(--fanui-glass-tint-rgb), calc(var(--fanui-glass-tint-base) + var(--fanui-glass-tint-k) * var(--fanui-glass-intensity)));
11
+ background-image: radial-gradient(calc(var(--fanui-glass-specular-size-base) + var(--fanui-glass-specular-size-k) * var(--fanui-glass-intensity)) circle at var(--fanui-glass-mx, 30%) var(--fanui-glass-my, 0%), rgba(var(--fanui-glass-specular-rgb), calc(var(--fanui-glass-specular-a) * var(--fanui-glass-intensity) * var(--fanui-glass-specular-alpha))), transparent 70%), linear-gradient(180deg, rgba(255, 255, 255, calc(var(--fanui-glass-sheen-a) * var(--fanui-glass-intensity))) 0%, rgba(255, 255, 255, 0) 46%);
12
+ background-repeat: no-repeat;
13
+ background-size: 100% 100%;
14
+ border: 1px solid rgba(var(--fanui-glass-border-rgb), calc(var(--fanui-glass-border-a) + var(--fanui-glass-border-k) * var(--fanui-glass-intensity)));
15
+ border-radius: var(--fanui-glass-radius, 12px);
16
+ color: var(--fanui-color-text);
17
+ backdrop-filter: blur(calc(var(--fanui-glass-blur-base) * var(--fanui-glass-intensity) * var(--fanui-glass-blur-mode-k, 1))) saturate(calc(100% + var(--fanui-glass-sat-k) * var(--fanui-glass-intensity))) brightness(calc(100% + var(--fanui-glass-bri-k) * var(--fanui-glass-intensity)));
18
+ -webkit-backdrop-filter: blur(calc(var(--fanui-glass-blur-base) * var(--fanui-glass-intensity) * var(--fanui-glass-blur-mode-k, 1))) saturate(calc(100% + var(--fanui-glass-sat-k) * var(--fanui-glass-intensity))) brightness(calc(100% + var(--fanui-glass-bri-k) * var(--fanui-glass-intensity)));
19
+ box-shadow: 0 calc(var(--fanui-glass-shadow-y-k) * var(--fanui-glass-intensity)) calc(var(--fanui-glass-shadow-blur-k) * var(--fanui-glass-intensity)) calc(var(--fanui-glass-shadow-spread-k) * var(--fanui-glass-intensity)) rgba(var(--fanui-glass-shadow-rgb), calc(var(--fanui-glass-shadow-a) + var(--fanui-glass-shadow-k) * var(--fanui-glass-intensity))), inset 0 1px 0 rgba(255, 255, 255, calc(var(--fanui-glass-inner-hi) * min(1, var(--fanui-glass-intensity))));
20
+ transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s, border-color 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
21
+ }
22
+ .fanui-kpi::after {
23
+ content: "";
24
+ position: absolute;
25
+ inset: 0;
26
+ z-index: 1;
27
+ border-radius: inherit;
28
+ pointer-events: none;
29
+ padding: var(--fanui-glass-edge-width, calc(1px + 0.5px * var(--fanui-glass-intensity)));
30
+ background: linear-gradient(var(--fanui-glass-edge-angle, 150deg), rgba(255, 255, 255, calc(var(--fanui-glass-edge-hi-a) * min(1, var(--fanui-glass-intensity)))) 0%, rgba(255, 255, 255, calc(var(--fanui-glass-edge-lo-a) * var(--fanui-glass-intensity))) 38%, rgba(255, 255, 255, calc(var(--fanui-glass-edge-lo-a) * var(--fanui-glass-intensity))) 62%, rgba(255, 255, 255, calc(var(--fanui-glass-edge-hi-a) * min(1, var(--fanui-glass-intensity)))) 100%);
31
+ -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
32
+ mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
33
+ -webkit-mask-composite: xor;
34
+ mask-composite: exclude;
35
+ opacity: var(--fanui-glass-edge-alpha, 1);
36
+ }
37
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
38
+ .fanui-kpi {
39
+ background-color: var(--fanui-glass-fallback-bg);
40
+ background-image: none;
41
+ }
42
+ }
43
+ .fanui-kpi {
44
+ transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
45
+ }
46
+ .fanui-kpi:hover {
47
+ transform: translateY(-2px);
48
+ }
49
+ .fanui-kpi__head {
50
+ display: flex;
51
+ align-items: flex-start;
52
+ justify-content: space-between;
53
+ gap: var(--fanui-space-3);
54
+ }
55
+ .fanui-kpi__label {
56
+ font-size: var(--fanui-font-size-sm);
57
+ color: var(--fanui-color-text-muted);
58
+ }
59
+ .fanui-kpi__icon {
60
+ display: grid;
61
+ place-items: center;
62
+ width: 34px;
63
+ height: 34px;
64
+ flex: 0 0 auto;
65
+ border-radius: var(--fanui-radius-md);
66
+ color: var(--fanui-primary);
67
+ background-color: var(--fanui-primary-soft);
68
+ font-size: var(--fanui-font-size-md);
69
+ }
70
+ .fanui-kpi__value {
71
+ display: flex;
72
+ align-items: baseline;
73
+ gap: var(--fanui-space-2);
74
+ font-size: clamp(1.5rem, 2.4vw, 2rem);
75
+ font-weight: var(--fanui-font-weight-bold);
76
+ line-height: 1.15;
77
+ letter-spacing: var(--fanui-tracking-tight);
78
+ font-variant-numeric: tabular-nums;
79
+ color: var(--fanui-color-text-strong);
80
+ }
81
+ .fanui-kpi__value small {
82
+ font-size: var(--fanui-font-size-sm);
83
+ font-weight: var(--fanui-font-weight-normal);
84
+ color: var(--fanui-color-text-subtle);
85
+ }
86
+ .fanui-kpi__delta {
87
+ display: inline-flex;
88
+ align-items: center;
89
+ gap: 3px;
90
+ padding: 1px 7px;
91
+ font-size: var(--fanui-font-size-xs);
92
+ font-weight: var(--fanui-font-weight-semibold);
93
+ border-radius: var(--fanui-radius-full);
94
+ font-variant-numeric: tabular-nums;
95
+ }
96
+ .fanui-kpi__delta--up {
97
+ color: var(--fanui-danger-ink);
98
+ background-color: var(--fanui-danger-soft);
99
+ }
100
+ .fanui-kpi__delta--down {
101
+ color: var(--fanui-success-ink);
102
+ background-color: var(--fanui-success-soft);
103
+ }
104
+ .fanui-kpi__delta--flat {
105
+ color: var(--fanui-color-text-muted);
106
+ background-color: var(--fanui-color-surface-sunken);
107
+ }
108
+ .fanui-kpi__foot {
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: space-between;
112
+ gap: var(--fanui-space-3);
113
+ font-size: var(--fanui-font-size-xs);
114
+ color: var(--fanui-color-text-subtle);
115
+ }
116
+ .fanui-kpi__spark {
117
+ display: flex;
118
+ align-items: flex-end;
119
+ gap: 2px;
120
+ height: 28px;
121
+ margin-top: var(--fanui-space-1);
122
+ }
123
+ .fanui-kpi__spark-bar {
124
+ flex: 1 1 0;
125
+ min-width: 2px;
126
+ height: var(--fanui-spark-h, 40%);
127
+ border-radius: 2px;
128
+ background-image: linear-gradient(to top, var(--fanui-primary), var(--fanui-primary-vivid));
129
+ opacity: 0.85;
130
+ transition: height 300ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, opacity 300ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s;
131
+ }
132
+ .fanui-kpi__spark-bar:last-child {
133
+ opacity: 1;
134
+ }
135
+ .fanui-kpi:hover .fanui-kpi__spark-bar {
136
+ opacity: 1;
137
+ }
138
+ .fanui-kpi--accent .fanui-kpi__spark-bar {
139
+ background-image: linear-gradient(to top, var(--fanui-accent), var(--fanui-accent-vivid));
140
+ }
141
+ .fanui-kpi--accent .fanui-kpi__icon {
142
+ color: var(--fanui-accent);
143
+ background-color: var(--fanui-accent-soft);
144
+ }
145
+ .fanui-kpi--success .fanui-kpi__spark-bar {
146
+ background-image: linear-gradient(to top, var(--fanui-success), var(--fanui-success-vivid));
147
+ }
148
+ .fanui-kpi--success .fanui-kpi__icon {
149
+ color: var(--fanui-success);
150
+ background-color: var(--fanui-success-soft);
151
+ }
152
+ .fanui-kpi--warning .fanui-kpi__spark-bar {
153
+ background-image: linear-gradient(to top, var(--fanui-warning), var(--fanui-warning-vivid));
154
+ }
155
+ .fanui-kpi--warning .fanui-kpi__icon {
156
+ color: var(--fanui-warning);
157
+ background-color: var(--fanui-warning-soft);
158
+ }
159
+ .fanui-kpi--danger .fanui-kpi__spark-bar {
160
+ background-image: linear-gradient(to top, var(--fanui-danger), var(--fanui-danger-vivid));
161
+ }
162
+ .fanui-kpi--danger .fanui-kpi__icon {
163
+ color: var(--fanui-danger);
164
+ background-color: var(--fanui-danger-soft);
165
+ }
166
+ .fanui-kpi--compact {
167
+ padding: var(--fanui-space-4);
168
+ gap: var(--fanui-space-2);
169
+ }
170
+ .fanui-kpi--compact .fanui-kpi__value {
171
+ font-size: var(--fanui-font-size-xl);
172
+ }
173
+
174
+ .fanui-bars {
175
+ --fanui-bars-height: 180px;
176
+ display: flex;
177
+ align-items: flex-end;
178
+ gap: var(--fanui-bars-gap, 6px);
179
+ height: var(--fanui-bars-height);
180
+ padding-top: var(--fanui-space-4);
181
+ }
182
+ .fanui-bars__group {
183
+ flex: 1 1 0;
184
+ min-width: 0;
185
+ display: flex;
186
+ flex-direction: column;
187
+ align-items: center;
188
+ gap: var(--fanui-space-2);
189
+ height: 100%;
190
+ }
191
+ .fanui-bars__stack {
192
+ display: flex;
193
+ align-items: flex-end;
194
+ justify-content: center;
195
+ gap: 2px;
196
+ width: 100%;
197
+ flex: 1 1 auto;
198
+ min-height: 0;
199
+ }
200
+ .fanui-bars__bar {
201
+ position: relative;
202
+ width: 100%;
203
+ max-width: var(--fanui-bars-width, 28px);
204
+ height: var(--fanui-bar-h, 50%);
205
+ border-radius: var(--fanui-radius-sm) var(--fanui-radius-sm) 2px 2px;
206
+ background-image: linear-gradient(to top, var(--fanui-bar-c1, var(--fanui-primary)), var(--fanui-bar-c2, var(--fanui-primary-vivid)));
207
+ transform-origin: bottom center;
208
+ animation: fanui-bar-grow 520ms cubic-bezier(0, 0, 0.2, 1) both;
209
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, filter 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
210
+ }
211
+ .fanui-bars__bar:hover {
212
+ filter: brightness(1.08);
213
+ }
214
+ .fanui-bars__group:hover .fanui-bars__bar {
215
+ opacity: 0.72;
216
+ }
217
+ .fanui-bars__group:hover .fanui-bars__bar:hover, .fanui-bars__bar:hover {
218
+ opacity: 1;
219
+ }
220
+ .fanui-bars__label {
221
+ font-size: var(--fanui-font-size-xs);
222
+ color: var(--fanui-color-text-subtle);
223
+ white-space: nowrap;
224
+ overflow: hidden;
225
+ text-overflow: ellipsis;
226
+ white-space: nowrap;
227
+ max-width: 100%;
228
+ }
229
+ .fanui-bars__tip {
230
+ position: absolute;
231
+ bottom: calc(100% + 6px);
232
+ left: 50%;
233
+ transform: translateX(-50%) translateY(4px);
234
+ padding: 3px 8px;
235
+ font-size: var(--fanui-font-size-xs);
236
+ font-variant-numeric: tabular-nums;
237
+ white-space: nowrap;
238
+ color: var(--fanui-color-text-inverse);
239
+ background-color: var(--fanui-color-text-strong);
240
+ border-radius: var(--fanui-radius-sm);
241
+ opacity: 0;
242
+ pointer-events: none;
243
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
244
+ }
245
+ .fanui-bars__bar:hover .fanui-bars__tip {
246
+ opacity: 1;
247
+ transform: translateX(-50%) translateY(0);
248
+ }
249
+ .fanui-bars__grid {
250
+ position: relative;
251
+ }
252
+ .fanui-bars__grid::before {
253
+ content: "";
254
+ position: absolute;
255
+ inset: var(--fanui-space-4) 0 0;
256
+ pointer-events: none;
257
+ background-image: repeating-linear-gradient(to top, var(--fanui-color-border-subtle) 0 1px, transparent 1px 25%);
258
+ opacity: 0.7;
259
+ }
260
+ .fanui-bars--horizontal {
261
+ flex-direction: column;
262
+ align-items: stretch;
263
+ height: auto;
264
+ }
265
+ .fanui-bars--horizontal .fanui-bars__group {
266
+ flex-direction: row;
267
+ align-items: center;
268
+ height: auto;
269
+ gap: var(--fanui-space-3);
270
+ }
271
+ .fanui-bars--horizontal .fanui-bars__stack {
272
+ align-items: center;
273
+ height: 22px;
274
+ }
275
+ .fanui-bars--horizontal .fanui-bars__bar {
276
+ height: 12px !important;
277
+ max-width: none;
278
+ width: var(--fanui-bar-h, 50%);
279
+ border-radius: var(--fanui-radius-full);
280
+ }
281
+ .fanui-bars--horizontal .fanui-bars__label {
282
+ min-width: 84px;
283
+ text-align: start;
284
+ }
285
+
286
+ @keyframes fanui-bar-grow {
287
+ from {
288
+ transform: scaleY(0);
289
+ opacity: 0;
290
+ }
291
+ to {
292
+ transform: scaleY(1);
293
+ opacity: 1;
294
+ }
295
+ }
296
+ .fanui-donut {
297
+ --fanui-donut-value: 68%;
298
+ --fanui-donut-size: 148px;
299
+ --fanui-donut-thickness: 14px;
300
+ --fanui-donut-c1: var(--fanui-primary);
301
+ --fanui-donut-c2: var(--fanui-primary-vivid);
302
+ position: relative;
303
+ display: grid;
304
+ place-items: center;
305
+ width: var(--fanui-donut-size);
306
+ height: var(--fanui-donut-size);
307
+ border-radius: var(--fanui-radius-full);
308
+ background-image: conic-gradient(from -90deg, var(--fanui-donut-c1) 0%, var(--fanui-donut-c2) var(--fanui-donut-value), var(--fanui-color-border) var(--fanui-donut-value), var(--fanui-color-border) 100%);
309
+ }
310
+ .fanui-donut::before {
311
+ content: "";
312
+ position: absolute;
313
+ inset: var(--fanui-donut-thickness);
314
+ border-radius: var(--fanui-radius-full);
315
+ background-color: var(--fanui-color-surface);
316
+ }
317
+ .fanui-donut__center {
318
+ position: relative;
319
+ z-index: 1;
320
+ display: flex;
321
+ flex-direction: column;
322
+ align-items: center;
323
+ gap: 2px;
324
+ text-align: center;
325
+ }
326
+ .fanui-donut__value {
327
+ font-size: var(--fanui-font-size-2xl);
328
+ font-weight: var(--fanui-font-weight-bold);
329
+ line-height: 1;
330
+ font-variant-numeric: tabular-nums;
331
+ letter-spacing: var(--fanui-tracking-tight);
332
+ color: var(--fanui-color-text-strong);
333
+ }
334
+ .fanui-donut__label {
335
+ font-size: var(--fanui-font-size-xs);
336
+ color: var(--fanui-color-text-subtle);
337
+ }
338
+ .fanui-donut--sm {
339
+ --fanui-donut-size: 96px;
340
+ --fanui-donut-thickness: 10px;
341
+ }
342
+ .fanui-donut--lg {
343
+ --fanui-donut-size: 200px;
344
+ --fanui-donut-thickness: 18px;
345
+ }
346
+ .fanui-donut--accent {
347
+ --fanui-donut-c1: var(--fanui-accent);
348
+ --fanui-donut-c2: var(--fanui-accent-vivid);
349
+ }
350
+ .fanui-donut--success {
351
+ --fanui-donut-c1: var(--fanui-success);
352
+ --fanui-donut-c2: var(--fanui-success-vivid);
353
+ }
354
+ .fanui-donut--warning {
355
+ --fanui-donut-c1: var(--fanui-warning);
356
+ --fanui-donut-c2: var(--fanui-warning-vivid);
357
+ }
358
+ .fanui-donut--danger {
359
+ --fanui-donut-c1: var(--fanui-danger);
360
+ --fanui-donut-c2: var(--fanui-danger-vivid);
361
+ }
362
+
363
+ .fanui-legend {
364
+ display: flex;
365
+ flex-wrap: wrap;
366
+ gap: var(--fanui-space-3) var(--fanui-space-4);
367
+ margin: 0;
368
+ padding: 0;
369
+ list-style: none;
370
+ font-size: var(--fanui-font-size-xs);
371
+ color: var(--fanui-color-text-muted);
372
+ }
373
+ .fanui-legend__item {
374
+ display: inline-flex;
375
+ align-items: center;
376
+ gap: var(--fanui-space-2);
377
+ }
378
+ .fanui-legend__dot {
379
+ width: 10px;
380
+ height: 10px;
381
+ border-radius: 3px;
382
+ background-color: var(--fanui-legend-color, var(--fanui-primary));
383
+ flex: 0 0 auto;
384
+ }
385
+ .fanui-legend__value {
386
+ font-variant-numeric: tabular-nums;
387
+ color: var(--fanui-color-text-strong);
388
+ font-weight: var(--fanui-font-weight-medium);
389
+ }
390
+
391
+ .fanui-usage {
392
+ display: flex;
393
+ flex-direction: column;
394
+ gap: var(--fanui-space-2);
395
+ }
396
+ .fanui-usage__head {
397
+ display: flex;
398
+ align-items: baseline;
399
+ justify-content: space-between;
400
+ gap: var(--fanui-space-3);
401
+ font-size: var(--fanui-font-size-sm);
402
+ color: var(--fanui-color-text-muted);
403
+ }
404
+ .fanui-usage__value {
405
+ font-variant-numeric: tabular-nums;
406
+ color: var(--fanui-color-text-strong);
407
+ font-weight: var(--fanui-font-weight-semibold);
408
+ }
409
+ .fanui-usage__track {
410
+ height: 8px;
411
+ border-radius: var(--fanui-radius-full);
412
+ background-color: var(--fanui-color-surface-sunken);
413
+ overflow: hidden;
414
+ }
415
+ .fanui-usage__bar {
416
+ height: 100%;
417
+ width: var(--fanui-usage-value, 60%);
418
+ border-radius: inherit;
419
+ background-image: linear-gradient(to right, var(--fanui-primary), var(--fanui-primary-vivid));
420
+ transition: width 300ms cubic-bezier(0, 0, 0.2, 1) 0s, background-color 300ms cubic-bezier(0, 0, 0.2, 1) 0s;
421
+ }
422
+ .fanui-usage--warning .fanui-usage__bar {
423
+ background-image: linear-gradient(to right, var(--fanui-warning), var(--fanui-warning-vivid));
424
+ }
425
+ .fanui-usage--danger .fanui-usage__bar {
426
+ background-image: linear-gradient(to right, var(--fanui-danger), var(--fanui-danger-vivid));
427
+ }
428
+ .fanui-usage--striped .fanui-usage__bar {
429
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.18) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.18) 50%, rgba(255, 255, 255, 0.18) 75%, transparent 75%, transparent), linear-gradient(to right, var(--fanui-primary), var(--fanui-primary-vivid));
430
+ background-size: 1rem 1rem, 100% 100%;
431
+ animation: fanui-stripes 1s linear infinite;
432
+ }
433
+
434
+ @keyframes fanui-stripes {
435
+ from {
436
+ background-position: 0 0, 0 0;
437
+ }
438
+ to {
439
+ background-position: 1rem 0, 0 0;
440
+ }
441
+ }
442
+ .fanui-kanban {
443
+ display: flex;
444
+ gap: var(--fanui-space-4);
445
+ align-items: flex-start;
446
+ overflow-x: auto;
447
+ padding-bottom: var(--fanui-space-3);
448
+ scrollbar-width: thin;
449
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
450
+ }
451
+ .fanui-kanban::-webkit-scrollbar {
452
+ width: 8px;
453
+ height: 8px;
454
+ }
455
+ .fanui-kanban::-webkit-scrollbar-track {
456
+ background: transparent;
457
+ }
458
+ .fanui-kanban::-webkit-scrollbar-thumb {
459
+ background: rgba(100, 116, 139, 0.45);
460
+ border-radius: 9999px;
461
+ }
462
+ .fanui-kanban::-webkit-scrollbar-thumb:hover {
463
+ background: rgba(100, 116, 139, 0.7);
464
+ }
465
+ .fanui-kanban__column {
466
+ flex: 0 0 288px;
467
+ display: flex;
468
+ flex-direction: column;
469
+ gap: var(--fanui-space-3);
470
+ padding: var(--fanui-space-3);
471
+ border-radius: var(--fanui-radius-xl);
472
+ background-color: var(--fanui-color-surface-sunken);
473
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
474
+ }
475
+ .fanui-kanban__column.is-dragover {
476
+ background-color: var(--fanui-primary-soft);
477
+ box-shadow: inset 0 0 0 2px var(--fanui-primary-border);
478
+ }
479
+ .fanui-kanban__head {
480
+ display: flex;
481
+ align-items: center;
482
+ justify-content: space-between;
483
+ gap: var(--fanui-space-2);
484
+ padding-inline: var(--fanui-space-1);
485
+ }
486
+ .fanui-kanban__title {
487
+ display: inline-flex;
488
+ align-items: center;
489
+ gap: var(--fanui-space-2);
490
+ font-size: var(--fanui-font-size-sm);
491
+ font-weight: var(--fanui-font-weight-semibold);
492
+ color: var(--fanui-color-text-strong);
493
+ }
494
+ .fanui-kanban__title::before {
495
+ content: "";
496
+ width: 8px;
497
+ height: 8px;
498
+ border-radius: var(--fanui-radius-full);
499
+ background-color: var(--fanui-column-color, var(--fanui-primary));
500
+ }
501
+ .fanui-kanban__count {
502
+ min-width: 20px;
503
+ padding: 0 6px;
504
+ font-size: var(--fanui-font-size-xs);
505
+ line-height: 18px;
506
+ text-align: center;
507
+ font-variant-numeric: tabular-nums;
508
+ color: var(--fanui-color-text-muted);
509
+ background-color: var(--fanui-color-surface);
510
+ border-radius: var(--fanui-radius-full);
511
+ }
512
+ .fanui-kanban__list {
513
+ display: flex;
514
+ flex-direction: column;
515
+ gap: var(--fanui-space-2);
516
+ margin: 0;
517
+ padding: 0;
518
+ list-style: none;
519
+ min-height: 24px;
520
+ }
521
+ .fanui-kanban__card {
522
+ display: flex;
523
+ flex-direction: column;
524
+ gap: var(--fanui-space-2);
525
+ padding: var(--fanui-space-3);
526
+ border: 1px solid var(--fanui-color-border);
527
+ border-radius: var(--fanui-radius-lg);
528
+ background-color: var(--fanui-color-surface);
529
+ cursor: grab;
530
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, border-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
531
+ }
532
+ .fanui-kanban__card:hover {
533
+ transform: translateY(-1px);
534
+ border-color: var(--fanui-primary-border);
535
+ box-shadow: var(--fanui-shadow-md);
536
+ }
537
+ .fanui-kanban__card:active {
538
+ cursor: grabbing;
539
+ }
540
+ .fanui-kanban__card.is-dragging {
541
+ opacity: 0.5;
542
+ transform: rotate(1.5deg) scale(0.98);
543
+ border-style: dashed;
544
+ }
545
+ .fanui-kanban__card.is-drop-target {
546
+ border-color: var(--fanui-primary);
547
+ box-shadow: 0 0 0 3px var(--fanui-primary-ring);
548
+ }
549
+ .fanui-kanban__card-title {
550
+ font-size: var(--fanui-font-size-sm);
551
+ font-weight: var(--fanui-font-weight-medium);
552
+ line-height: var(--fanui-line-height-snug);
553
+ color: var(--fanui-color-text);
554
+ }
555
+ .fanui-kanban__card-meta {
556
+ display: flex;
557
+ align-items: center;
558
+ justify-content: space-between;
559
+ gap: var(--fanui-space-2);
560
+ font-size: var(--fanui-font-size-xs);
561
+ color: var(--fanui-color-text-subtle);
562
+ }
563
+ .fanui-kanban__labels {
564
+ display: flex;
565
+ flex-wrap: wrap;
566
+ gap: 4px;
567
+ }
568
+ .fanui-kanban__label {
569
+ padding: 1px 7px;
570
+ font-size: 11px;
571
+ border-radius: var(--fanui-radius-full);
572
+ background-color: var(--fanui-label-bg, var(--fanui-primary-soft));
573
+ color: var(--fanui-label-fg, var(--fanui-primary-ink));
574
+ }
575
+ .fanui-kanban__add {
576
+ display: flex;
577
+ align-items: center;
578
+ gap: var(--fanui-space-2);
579
+ padding: var(--fanui-space-2) var(--fanui-space-3);
580
+ border: 1px dashed var(--fanui-color-border-strong);
581
+ border-radius: var(--fanui-radius-lg);
582
+ background: transparent;
583
+ font: inherit;
584
+ font-size: var(--fanui-font-size-sm);
585
+ color: var(--fanui-color-text-muted);
586
+ cursor: pointer;
587
+ transition: border-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
588
+ }
589
+ .fanui-kanban__add:hover {
590
+ border-color: var(--fanui-primary);
591
+ color: var(--fanui-primary);
592
+ background-color: var(--fanui-primary-soft);
593
+ }
594
+ .fanui-kanban__avatars {
595
+ display: flex;
596
+ }
597
+ .fanui-kanban__avatars > * {
598
+ width: 22px;
599
+ height: 22px;
600
+ border-radius: var(--fanui-radius-full);
601
+ border: 2px solid var(--fanui-color-surface);
602
+ margin-inline-start: -6px;
603
+ display: grid;
604
+ place-items: center;
605
+ font-size: 10px;
606
+ background-color: var(--fanui-primary-soft-2);
607
+ color: var(--fanui-primary-ink);
608
+ }
609
+ .fanui-kanban__avatars > *:first-child {
610
+ margin-inline-start: 0;
611
+ }
612
+
613
+ .fanui-activity {
614
+ display: flex;
615
+ flex-direction: column;
616
+ gap: var(--fanui-space-4);
617
+ margin: 0;
618
+ padding: 0;
619
+ list-style: none;
620
+ }
621
+ .fanui-activity__item {
622
+ position: relative;
623
+ display: flex;
624
+ gap: var(--fanui-space-3);
625
+ padding-inline-start: var(--fanui-space-1);
626
+ }
627
+ .fanui-activity__item:not(:last-child)::before {
628
+ content: "";
629
+ position: absolute;
630
+ inset-block: 26px calc(var(--fanui-space-4) * -1);
631
+ inset-inline-start: 13px;
632
+ width: 1px;
633
+ background-color: var(--fanui-color-border);
634
+ }
635
+ .fanui-activity__icon {
636
+ position: relative;
637
+ z-index: 1;
638
+ display: grid;
639
+ place-items: center;
640
+ width: 26px;
641
+ height: 26px;
642
+ flex: 0 0 auto;
643
+ border-radius: var(--fanui-radius-full);
644
+ font-size: var(--fanui-font-size-xs);
645
+ color: var(--fanui-primary-fg);
646
+ background-color: var(--fanui-primary);
647
+ box-shadow: 0 0 0 3px var(--fanui-color-surface);
648
+ }
649
+ .fanui-activity__body {
650
+ flex: 1 1 auto;
651
+ min-width: 0;
652
+ }
653
+ .fanui-activity__text {
654
+ font-size: var(--fanui-font-size-sm);
655
+ line-height: var(--fanui-line-height-snug);
656
+ color: var(--fanui-color-text);
657
+ }
658
+ .fanui-activity__text strong {
659
+ font-weight: var(--fanui-font-weight-semibold);
660
+ color: var(--fanui-color-text-strong);
661
+ }
662
+ .fanui-activity__text a {
663
+ color: var(--fanui-primary);
664
+ text-decoration: none;
665
+ }
666
+ .fanui-activity__text a:hover {
667
+ text-decoration: underline;
668
+ }
669
+ .fanui-activity__time {
670
+ display: block;
671
+ margin-top: 2px;
672
+ font-size: var(--fanui-font-size-xs);
673
+ color: var(--fanui-color-text-subtle);
674
+ }
675
+ .fanui-activity__quote {
676
+ margin-top: var(--fanui-space-2);
677
+ padding: var(--fanui-space-2) var(--fanui-space-3);
678
+ border-inline-start: 2px solid var(--fanui-color-border);
679
+ border-radius: var(--fanui-radius-sm);
680
+ background-color: var(--fanui-color-surface-sunken);
681
+ font-size: var(--fanui-font-size-xs);
682
+ color: var(--fanui-color-text-muted);
683
+ }
684
+ .fanui-activity--compact {
685
+ gap: var(--fanui-space-3);
686
+ }
687
+ .fanui-activity--compact .fanui-activity__icon {
688
+ width: 22px;
689
+ height: 22px;
690
+ }
691
+ .fanui-activity--compact .fanui-activity__item:not(:last-child)::before {
692
+ inset-inline-start: 11px;
693
+ inset-block-start: 22px;
694
+ }
695
+
696
+ .fanui-notify {
697
+ position: relative;
698
+ }
699
+ .fanui-notify__trigger {
700
+ position: relative;
701
+ display: grid;
702
+ place-items: center;
703
+ width: 36px;
704
+ height: 36px;
705
+ border: 1px solid transparent;
706
+ border-radius: var(--fanui-radius-md);
707
+ background: transparent;
708
+ color: var(--fanui-color-text-muted);
709
+ cursor: pointer;
710
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
711
+ }
712
+ .fanui-notify__trigger:hover {
713
+ background-color: var(--fanui-color-hover);
714
+ color: var(--fanui-color-text);
715
+ }
716
+ .fanui-notify__dot {
717
+ position: absolute;
718
+ inset-block-start: 6px;
719
+ inset-inline-end: 6px;
720
+ min-width: 16px;
721
+ height: 16px;
722
+ padding: 0 4px;
723
+ display: grid;
724
+ place-items: center;
725
+ font-size: 10px;
726
+ font-weight: var(--fanui-font-weight-semibold);
727
+ line-height: 1;
728
+ color: var(--fanui-danger-fg);
729
+ background-color: var(--fanui-danger);
730
+ border-radius: var(--fanui-radius-full);
731
+ box-shadow: 0 0 0 2px var(--fanui-color-bg);
732
+ }
733
+ .fanui-notify__dot.is-pulse::after {
734
+ content: "";
735
+ position: absolute;
736
+ inset: 0;
737
+ border-radius: inherit;
738
+ background-color: inherit;
739
+ animation: fanui-notify-pulse 1.8s cubic-bezier(0, 0, 0.2, 1) infinite;
740
+ }
741
+ .fanui-notify__panel {
742
+ position: absolute;
743
+ inset-inline-end: 0;
744
+ inset-block-start: calc(100% + 8px);
745
+ z-index: var(--fanui-z-dropdown);
746
+ width: 360px;
747
+ max-width: calc(100vw - 32px);
748
+ max-height: 440px;
749
+ display: flex;
750
+ flex-direction: column;
751
+ overflow: hidden;
752
+ border: 1px solid var(--fanui-glass-border, var(--fanui-color-border));
753
+ border-radius: var(--fanui-radius-xl);
754
+ background-color: var(--fanui-color-overlay);
755
+ box-shadow: var(--fanui-shadow-2xl);
756
+ opacity: 0;
757
+ visibility: hidden;
758
+ transform: translateY(-6px) scale(0.98);
759
+ transform-origin: top right;
760
+ transition: opacity 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, visibility 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s;
761
+ }
762
+ .fanui-notify__panel.is-open {
763
+ opacity: 1;
764
+ visibility: visible;
765
+ transform: none;
766
+ }
767
+ .fanui-notify__head {
768
+ display: flex;
769
+ align-items: center;
770
+ justify-content: space-between;
771
+ gap: var(--fanui-space-3);
772
+ padding: var(--fanui-space-3) var(--fanui-space-4);
773
+ border-bottom: 1px solid var(--fanui-color-border-subtle);
774
+ font-size: var(--fanui-font-size-sm);
775
+ font-weight: var(--fanui-font-weight-semibold);
776
+ color: var(--fanui-color-text-strong);
777
+ }
778
+ .fanui-notify__list {
779
+ flex: 1 1 auto;
780
+ overflow-y: auto;
781
+ margin: 0;
782
+ padding: var(--fanui-space-1);
783
+ list-style: none;
784
+ scrollbar-width: thin;
785
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
786
+ }
787
+ .fanui-notify__list::-webkit-scrollbar {
788
+ width: 6px;
789
+ height: 6px;
790
+ }
791
+ .fanui-notify__list::-webkit-scrollbar-track {
792
+ background: transparent;
793
+ }
794
+ .fanui-notify__list::-webkit-scrollbar-thumb {
795
+ background: rgba(100, 116, 139, 0.45);
796
+ border-radius: 9999px;
797
+ }
798
+ .fanui-notify__list::-webkit-scrollbar-thumb:hover {
799
+ background: rgba(100, 116, 139, 0.7);
800
+ }
801
+ .fanui-notify__item {
802
+ display: flex;
803
+ gap: var(--fanui-space-3);
804
+ padding: var(--fanui-space-3);
805
+ border-radius: var(--fanui-radius-md);
806
+ cursor: pointer;
807
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
808
+ }
809
+ .fanui-notify__item:hover {
810
+ background-color: var(--fanui-color-hover);
811
+ }
812
+ .fanui-notify__item.is-unread {
813
+ background-color: var(--fanui-primary-soft);
814
+ }
815
+ .fanui-notify__item.is-unread .fanui-notify__item-title::after {
816
+ content: "";
817
+ display: inline-block;
818
+ width: 6px;
819
+ height: 6px;
820
+ margin-inline-start: 6px;
821
+ border-radius: var(--fanui-radius-full);
822
+ background-color: var(--fanui-primary);
823
+ vertical-align: middle;
824
+ }
825
+ .fanui-notify__item-icon {
826
+ display: grid;
827
+ place-items: center;
828
+ width: 32px;
829
+ height: 32px;
830
+ flex: 0 0 auto;
831
+ border-radius: var(--fanui-radius-md);
832
+ background-color: var(--fanui-color-surface);
833
+ color: var(--fanui-color-text-muted);
834
+ }
835
+ .fanui-notify__item-title {
836
+ font-size: var(--fanui-font-size-sm);
837
+ font-weight: var(--fanui-font-weight-medium);
838
+ color: var(--fanui-color-text-strong);
839
+ }
840
+ .fanui-notify__item-desc {
841
+ margin-top: 2px;
842
+ font-size: var(--fanui-font-size-xs);
843
+ line-height: var(--fanui-line-height-snug);
844
+ color: var(--fanui-color-text-muted);
845
+ }
846
+ .fanui-notify__item-time {
847
+ margin-top: 4px;
848
+ font-size: var(--fanui-font-size-xs);
849
+ color: var(--fanui-color-text-subtle);
850
+ }
851
+ .fanui-notify__foot {
852
+ padding: var(--fanui-space-2) var(--fanui-space-4);
853
+ border-top: 1px solid var(--fanui-color-border-subtle);
854
+ text-align: center;
855
+ font-size: var(--fanui-font-size-sm);
856
+ }
857
+ .fanui-notify__foot a {
858
+ color: var(--fanui-primary);
859
+ text-decoration: none;
860
+ }
861
+
862
+ @keyframes fanui-notify-pulse {
863
+ 0% {
864
+ opacity: 0.6;
865
+ transform: scale(1);
866
+ }
867
+ 70% {
868
+ opacity: 0;
869
+ transform: scale(2.2);
870
+ }
871
+ 100% {
872
+ opacity: 0;
873
+ transform: scale(2.2);
874
+ }
875
+ }
876
+ .fanui-filter-bar {
877
+ display: flex;
878
+ flex-wrap: wrap;
879
+ align-items: center;
880
+ gap: var(--fanui-space-3);
881
+ padding: var(--fanui-space-3);
882
+ border-radius: var(--fanui-radius-xl);
883
+ position: relative;
884
+ isolation: isolate;
885
+ background-color: rgba(var(--fanui-glass-tint-rgb), calc(var(--fanui-glass-tint-base) + var(--fanui-glass-tint-k) * var(--fanui-glass-intensity)));
886
+ background-image: radial-gradient(calc(var(--fanui-glass-specular-size-base) + var(--fanui-glass-specular-size-k) * var(--fanui-glass-intensity)) circle at var(--fanui-glass-mx, 30%) var(--fanui-glass-my, 0%), rgba(var(--fanui-glass-specular-rgb), calc(var(--fanui-glass-specular-a) * var(--fanui-glass-intensity) * var(--fanui-glass-specular-alpha))), transparent 70%), linear-gradient(180deg, rgba(255, 255, 255, calc(var(--fanui-glass-sheen-a) * var(--fanui-glass-intensity))) 0%, rgba(255, 255, 255, 0) 46%);
887
+ background-repeat: no-repeat;
888
+ background-size: 100% 100%;
889
+ border: 1px solid rgba(var(--fanui-glass-border-rgb), calc(var(--fanui-glass-border-a) + var(--fanui-glass-border-k) * var(--fanui-glass-intensity)));
890
+ border-radius: var(--fanui-glass-radius, 12px);
891
+ color: var(--fanui-color-text);
892
+ backdrop-filter: blur(calc(var(--fanui-glass-blur-base) * var(--fanui-glass-intensity) * var(--fanui-glass-blur-mode-k, 1))) saturate(calc(100% + var(--fanui-glass-sat-k) * var(--fanui-glass-intensity))) brightness(calc(100% + var(--fanui-glass-bri-k) * var(--fanui-glass-intensity)));
893
+ -webkit-backdrop-filter: blur(calc(var(--fanui-glass-blur-base) * var(--fanui-glass-intensity) * var(--fanui-glass-blur-mode-k, 1))) saturate(calc(100% + var(--fanui-glass-sat-k) * var(--fanui-glass-intensity))) brightness(calc(100% + var(--fanui-glass-bri-k) * var(--fanui-glass-intensity)));
894
+ box-shadow: 0 calc(var(--fanui-glass-shadow-y-k) * var(--fanui-glass-intensity)) calc(var(--fanui-glass-shadow-blur-k) * var(--fanui-glass-intensity)) calc(var(--fanui-glass-shadow-spread-k) * var(--fanui-glass-intensity)) rgba(var(--fanui-glass-shadow-rgb), calc(var(--fanui-glass-shadow-a) + var(--fanui-glass-shadow-k) * var(--fanui-glass-intensity))), inset 0 1px 0 rgba(255, 255, 255, calc(var(--fanui-glass-inner-hi) * min(1, var(--fanui-glass-intensity))));
895
+ transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s, border-color 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 300ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
896
+ }
897
+ .fanui-filter-bar::after {
898
+ content: "";
899
+ position: absolute;
900
+ inset: 0;
901
+ z-index: 1;
902
+ border-radius: inherit;
903
+ pointer-events: none;
904
+ padding: var(--fanui-glass-edge-width, calc(1px + 0.5px * var(--fanui-glass-intensity)));
905
+ background: linear-gradient(var(--fanui-glass-edge-angle, 150deg), rgba(255, 255, 255, calc(var(--fanui-glass-edge-hi-a) * min(1, var(--fanui-glass-intensity)))) 0%, rgba(255, 255, 255, calc(var(--fanui-glass-edge-lo-a) * var(--fanui-glass-intensity))) 38%, rgba(255, 255, 255, calc(var(--fanui-glass-edge-lo-a) * var(--fanui-glass-intensity))) 62%, rgba(255, 255, 255, calc(var(--fanui-glass-edge-hi-a) * min(1, var(--fanui-glass-intensity)))) 100%);
906
+ -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
907
+ mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
908
+ -webkit-mask-composite: xor;
909
+ mask-composite: exclude;
910
+ opacity: var(--fanui-glass-edge-alpha, 1);
911
+ }
912
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
913
+ .fanui-filter-bar {
914
+ background-color: var(--fanui-glass-fallback-bg);
915
+ background-image: none;
916
+ }
917
+ }
918
+ .fanui-filter-bar {
919
+ --fanui-glass-radius: var(--fanui-radius-xl);
920
+ }
921
+ .fanui-filter-bar__search {
922
+ position: relative;
923
+ flex: 1 1 240px;
924
+ min-width: 200px;
925
+ }
926
+ .fanui-filter-bar__search input {
927
+ display: block;
928
+ width: 100%;
929
+ min-height: 36px;
930
+ padding: 6.5px 14px;
931
+ font-family: inherit;
932
+ font-size: 14px;
933
+ line-height: 1.5;
934
+ color: var(--fanui-color-text);
935
+ background-color: var(--fanui-color-surface);
936
+ border: 1px solid var(--fanui-color-border);
937
+ border-radius: 6px;
938
+ box-sizing: border-box;
939
+ appearance: none;
940
+ -webkit-appearance: none;
941
+ -moz-appearance: none;
942
+ background-clip: padding-box;
943
+ 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;
944
+ }
945
+ .fanui-filter-bar__search input::placeholder {
946
+ color: var(--fanui-color-text-subtle);
947
+ opacity: 1;
948
+ }
949
+ .fanui-filter-bar__search input::-webkit-input-placeholder {
950
+ color: var(--fanui-color-text-subtle);
951
+ opacity: 1;
952
+ }
953
+ .fanui-filter-bar__search input::-moz-placeholder {
954
+ color: var(--fanui-color-text-subtle);
955
+ opacity: 1;
956
+ }
957
+ .fanui-filter-bar__search input:-ms-input-placeholder {
958
+ color: var(--fanui-color-text-subtle);
959
+ opacity: 1;
960
+ }
961
+ .fanui-filter-bar__search input:hover:not(:disabled):not(.is-disabled) {
962
+ border-color: var(--fanui-color-border-strong);
963
+ }
964
+ .fanui-filter-bar__search input:focus, .fanui-filter-bar__search input:focus-visible {
965
+ border-color: var(--fanui-primary);
966
+ outline: 0;
967
+ 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));
968
+ }
969
+ @media (forced-colors: active) {
970
+ .fanui-filter-bar__search input:focus, .fanui-filter-bar__search input:focus-visible {
971
+ outline: 2px solid transparent;
972
+ outline-offset: 2px;
973
+ }
974
+ }
975
+ .fanui-filter-bar__search input:disabled, .fanui-filter-bar__search input.is-disabled {
976
+ background-color: var(--fanui-color-disabled-bg);
977
+ color: var(--fanui-color-disabled-text);
978
+ cursor: not-allowed;
979
+ resize: none;
980
+ }
981
+ .fanui-filter-bar__search input[readonly] {
982
+ background-color: var(--fanui-color-surface-sunken);
983
+ }
984
+ .fanui-filter-bar__search input {
985
+ padding-inline-start: 34px;
986
+ }
987
+ .fanui-filter-bar__search svg,
988
+ .fanui-filter-bar__search .fanui-icon {
989
+ position: absolute;
990
+ inset-inline-start: 10px;
991
+ inset-block-start: 50%;
992
+ transform: translateY(-50%);
993
+ color: var(--fanui-color-text-subtle);
994
+ pointer-events: none;
995
+ }
996
+ .fanui-filter-bar__chips {
997
+ display: flex;
998
+ flex-wrap: wrap;
999
+ gap: var(--fanui-space-2);
1000
+ }
1001
+ .fanui-filter-bar__chip {
1002
+ display: inline-flex;
1003
+ align-items: center;
1004
+ gap: var(--fanui-space-1);
1005
+ padding: 4px 12px;
1006
+ border: 1px solid var(--fanui-color-border);
1007
+ border-radius: var(--fanui-radius-full);
1008
+ background-color: var(--fanui-color-surface);
1009
+ font: inherit;
1010
+ font-size: var(--fanui-font-size-sm);
1011
+ color: var(--fanui-color-text-muted);
1012
+ cursor: pointer;
1013
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, border-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
1014
+ }
1015
+ .fanui-filter-bar__chip:hover {
1016
+ border-color: var(--fanui-primary-border);
1017
+ color: var(--fanui-primary-ink);
1018
+ }
1019
+ .fanui-filter-bar__chip:active {
1020
+ transform: scale(0.97);
1021
+ }
1022
+ .fanui-filter-bar__chip.is-active {
1023
+ color: var(--fanui-primary-fg);
1024
+ background-color: var(--fanui-primary);
1025
+ border-color: var(--fanui-primary);
1026
+ }
1027
+ .fanui-filter-bar__chip-count {
1028
+ font-size: var(--fanui-font-size-xs);
1029
+ opacity: 0.75;
1030
+ font-variant-numeric: tabular-nums;
1031
+ }
1032
+ .fanui-filter-bar__spacer {
1033
+ flex: 1 1 auto;
1034
+ }
1035
+ .fanui-filter-bar__views {
1036
+ display: inline-flex;
1037
+ padding: 2px;
1038
+ border-radius: var(--fanui-radius-md);
1039
+ background-color: var(--fanui-glass-divider);
1040
+ }
1041
+ .fanui-filter-bar__views button {
1042
+ display: grid;
1043
+ place-items: center;
1044
+ width: 30px;
1045
+ height: 26px;
1046
+ border: 0;
1047
+ border-radius: var(--fanui-radius-sm);
1048
+ background: transparent;
1049
+ color: var(--fanui-color-text-muted);
1050
+ cursor: pointer;
1051
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
1052
+ }
1053
+ .fanui-filter-bar__views button.is-active {
1054
+ background-color: var(--fanui-color-surface);
1055
+ color: var(--fanui-primary);
1056
+ box-shadow: var(--fanui-shadow-xs);
1057
+ }