@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,960 @@
1
+ /* fanUI v2.1.0 · module: interactive(独立产物,自带令牌) */
2
+ .fanui-command {
3
+ position: fixed;
4
+ top: 0;
5
+ right: 0;
6
+ bottom: 0;
7
+ left: 0;
8
+ z-index: calc(var(--fanui-z-modal) + 10);
9
+ display: flex;
10
+ justify-content: center;
11
+ align-items: flex-start;
12
+ padding: 12vh var(--fanui-space-4) var(--fanui-space-4);
13
+ opacity: 0;
14
+ visibility: hidden;
15
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, visibility 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
16
+ }
17
+ .fanui-command.is-open {
18
+ opacity: 1;
19
+ visibility: visible;
20
+ }
21
+ .fanui-command__backdrop {
22
+ position: absolute;
23
+ top: 0;
24
+ right: 0;
25
+ bottom: 0;
26
+ left: 0;
27
+ background-color: var(--fanui-backdrop-bg);
28
+ backdrop-filter: blur(6px);
29
+ -webkit-backdrop-filter: blur(6px);
30
+ }
31
+ .fanui-command__dialog {
32
+ position: relative;
33
+ width: min(640px, 100%);
34
+ max-height: 70vh;
35
+ display: flex;
36
+ flex-direction: column;
37
+ overflow: hidden;
38
+ border: 1px solid var(--fanui-color-border);
39
+ border-radius: var(--fanui-radius-2xl);
40
+ background-color: var(--fanui-color-overlay);
41
+ box-shadow: var(--fanui-shadow-2xl);
42
+ transform: translateY(-12px) scale(0.98);
43
+ transition: transform 300ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, opacity 300ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s;
44
+ }
45
+ .fanui-command.is-open .fanui-command__dialog {
46
+ transform: translateY(0) scale(1);
47
+ }
48
+ .fanui-command--glass .fanui-command__dialog {
49
+ background-color: rgba(var(--fanui-glass-tint-rgb), calc(var(--fanui-glass-tint-base) + var(--fanui-glass-tint-k) * var(--fanui-glass-intensity)));
50
+ background-image: linear-gradient(180deg, rgba(255, 255, 255, calc(var(--fanui-glass-sheen-a) * var(--fanui-glass-intensity))) 0%, rgba(255, 255, 255, 0) 46%);
51
+ 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)));
52
+ -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)));
53
+ border-color: rgba(var(--fanui-glass-border-rgb), calc(var(--fanui-glass-border-a) + var(--fanui-glass-border-k) * var(--fanui-glass-intensity)));
54
+ 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))));
55
+ }
56
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
57
+ .fanui-command--glass .fanui-command__dialog {
58
+ background-color: var(--fanui-glass-fallback-bg);
59
+ background-image: none;
60
+ }
61
+ }
62
+ .fanui-command--glass .fanui-command__dialog {
63
+ background-image: linear-gradient(color-mix(in srgb, var(--fanui-color-overlay) 55%, transparent), color-mix(in srgb, var(--fanui-color-overlay) 70%, transparent));
64
+ }
65
+ .fanui-command--glass .fanui-command__group-title, .fanui-command--glass .fanui-command__item-desc, .fanui-command--glass .fanui-command__item-hint, .fanui-command--glass .fanui-command__item-icon, .fanui-command--glass .fanui-command__foot {
66
+ color: var(--fanui-color-text-muted);
67
+ }
68
+ .fanui-command__head {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: var(--fanui-space-3);
72
+ padding: var(--fanui-space-4);
73
+ border-bottom: 1px solid var(--fanui-color-border-subtle);
74
+ }
75
+ .fanui-command__icon {
76
+ color: var(--fanui-color-text-subtle);
77
+ flex: 0 0 auto;
78
+ }
79
+ .fanui-command__input {
80
+ flex: 1 1 auto;
81
+ min-width: 0;
82
+ border: 0;
83
+ background: transparent;
84
+ font: inherit;
85
+ font-size: var(--fanui-font-size-md);
86
+ color: var(--fanui-color-text);
87
+ }
88
+ .fanui-command__input:focus {
89
+ outline: none;
90
+ }
91
+ .fanui-command__input::placeholder {
92
+ color: var(--fanui-color-text-subtle);
93
+ }
94
+ .fanui-command__body {
95
+ flex: 1 1 auto;
96
+ min-height: 120px;
97
+ overflow-y: auto;
98
+ padding: var(--fanui-space-2);
99
+ scrollbar-width: thin;
100
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
101
+ }
102
+ .fanui-command__body::-webkit-scrollbar {
103
+ width: 6px;
104
+ height: 6px;
105
+ }
106
+ .fanui-command__body::-webkit-scrollbar-track {
107
+ background: transparent;
108
+ }
109
+ .fanui-command__body::-webkit-scrollbar-thumb {
110
+ background: rgba(100, 116, 139, 0.45);
111
+ border-radius: 9999px;
112
+ }
113
+ .fanui-command__body::-webkit-scrollbar-thumb:hover {
114
+ background: rgba(100, 116, 139, 0.7);
115
+ }
116
+ .fanui-command__group-title {
117
+ padding: var(--fanui-space-3) var(--fanui-space-3) var(--fanui-space-1);
118
+ font-size: var(--fanui-font-size-xs);
119
+ font-weight: var(--fanui-font-weight-semibold);
120
+ letter-spacing: var(--fanui-tracking-wider);
121
+ text-transform: uppercase;
122
+ color: var(--fanui-color-text-subtle);
123
+ }
124
+ .fanui-command__item {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: var(--fanui-space-3);
128
+ padding: 9px var(--fanui-space-3);
129
+ border-radius: var(--fanui-radius-md);
130
+ color: var(--fanui-color-text);
131
+ cursor: pointer;
132
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
133
+ }
134
+ .fanui-command__item[aria-selected=true], .fanui-command__item.is-active {
135
+ background-color: var(--fanui-primary-soft);
136
+ color: var(--fanui-primary-ink);
137
+ }
138
+ .fanui-command__item:active {
139
+ transform: scale(0.995);
140
+ }
141
+ .fanui-command__item[aria-disabled=true] {
142
+ opacity: 0.45;
143
+ pointer-events: none;
144
+ }
145
+ .fanui-command__item-icon {
146
+ display: grid;
147
+ place-items: center;
148
+ width: 28px;
149
+ height: 28px;
150
+ flex: 0 0 auto;
151
+ border-radius: var(--fanui-radius-sm);
152
+ background-color: var(--fanui-color-surface-sunken);
153
+ color: var(--fanui-color-text-muted);
154
+ font-size: var(--fanui-font-size-sm);
155
+ }
156
+ .fanui-command__item-body {
157
+ flex: 1 1 auto;
158
+ min-width: 0;
159
+ }
160
+ .fanui-command__item-title {
161
+ display: block;
162
+ font-size: var(--fanui-font-size-sm);
163
+ overflow: hidden;
164
+ text-overflow: ellipsis;
165
+ white-space: nowrap;
166
+ }
167
+ .fanui-command__item-desc {
168
+ display: block;
169
+ font-size: var(--fanui-font-size-xs);
170
+ color: var(--fanui-color-text-subtle);
171
+ overflow: hidden;
172
+ text-overflow: ellipsis;
173
+ white-space: nowrap;
174
+ }
175
+ .fanui-command__item-hint {
176
+ flex: 0 0 auto;
177
+ font-size: var(--fanui-font-size-xs);
178
+ color: var(--fanui-color-text-subtle);
179
+ }
180
+ .fanui-command__empty {
181
+ display: grid;
182
+ place-items: center;
183
+ gap: var(--fanui-space-2);
184
+ padding: var(--fanui-space-10) var(--fanui-space-4);
185
+ text-align: center;
186
+ color: var(--fanui-color-text-subtle);
187
+ font-size: var(--fanui-font-size-sm);
188
+ }
189
+ .fanui-command__foot {
190
+ display: flex;
191
+ align-items: center;
192
+ justify-content: space-between;
193
+ gap: var(--fanui-space-3);
194
+ padding: var(--fanui-space-2) var(--fanui-space-4);
195
+ border-top: 1px solid var(--fanui-color-border-subtle);
196
+ font-size: var(--fanui-font-size-xs);
197
+ color: var(--fanui-color-text-subtle);
198
+ }
199
+ .fanui-command__keys {
200
+ display: inline-flex;
201
+ align-items: center;
202
+ gap: var(--fanui-space-1);
203
+ }
204
+ .fanui-command__mark {
205
+ padding: 0 1px;
206
+ border-radius: 3px;
207
+ background-color: var(--fanui-warning-soft-2);
208
+ color: var(--fanui-warning-ink);
209
+ }
210
+
211
+ .fanui-dock {
212
+ display: inline-flex;
213
+ align-items: flex-end;
214
+ gap: var(--fanui-space-2);
215
+ padding: var(--fanui-space-2) var(--fanui-space-3);
216
+ border-radius: var(--fanui-radius-2xl);
217
+ }
218
+ .fanui-dock__item {
219
+ --fanui-dock-scale: 1;
220
+ position: relative;
221
+ display: grid;
222
+ place-items: center;
223
+ width: 46px;
224
+ height: 46px;
225
+ flex: 0 0 auto;
226
+ color: var(--fanui-color-text);
227
+ text-decoration: none;
228
+ border-radius: var(--fanui-radius-lg);
229
+ transform: scale(var(--fanui-dock-scale)) translateY(calc((var(--fanui-dock-scale) - 1) * -8px));
230
+ transform-origin: bottom center;
231
+ transition: transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, box-shadow 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s;
232
+ }
233
+ .fanui-dock__item:focus-visible {
234
+ outline: 0;
235
+ 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));
236
+ }
237
+ @media (forced-colors: active) {
238
+ .fanui-dock__item:focus-visible {
239
+ outline: 2px solid transparent;
240
+ outline-offset: 2px;
241
+ }
242
+ }
243
+ .fanui-dock__item:hover {
244
+ --fanui-dock-scale: 1.42;
245
+ }
246
+ .fanui-dock__item:hover + .fanui-dock__item, .fanui-dock__item:has(+ .fanui-dock__item:hover) {
247
+ --fanui-dock-scale: 1.24;
248
+ }
249
+ .fanui-dock__item:hover + .fanui-dock__item + .fanui-dock__item, .fanui-dock__item:has(+ .fanui-dock__item + .fanui-dock__item:hover) {
250
+ --fanui-dock-scale: 1.1;
251
+ }
252
+ .fanui-dock__label {
253
+ position: absolute;
254
+ bottom: calc(100% + 10px);
255
+ left: 50%;
256
+ transform: translateX(-50%) translateY(4px);
257
+ padding: 3px 8px;
258
+ font-size: var(--fanui-font-size-xs);
259
+ white-space: nowrap;
260
+ color: var(--fanui-color-text-inverse);
261
+ background-color: var(--fanui-color-text-strong);
262
+ border-radius: var(--fanui-radius-sm);
263
+ opacity: 0;
264
+ pointer-events: none;
265
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
266
+ }
267
+ .fanui-dock__item:hover .fanui-dock__label {
268
+ opacity: 1;
269
+ transform: translateX(-50%) translateY(0);
270
+ }
271
+ .fanui-dock__item.is-active::after {
272
+ content: "";
273
+ position: absolute;
274
+ bottom: -5px;
275
+ width: 4px;
276
+ height: 4px;
277
+ border-radius: var(--fanui-radius-full);
278
+ background-color: currentColor;
279
+ }
280
+ .fanui-dock--sm .fanui-dock__item {
281
+ width: 38px;
282
+ height: 38px;
283
+ }
284
+ .fanui-dock--vertical {
285
+ flex-direction: column;
286
+ align-items: center;
287
+ }
288
+ .fanui-dock--vertical .fanui-dock__label {
289
+ bottom: auto;
290
+ left: calc(100% + 10px);
291
+ top: 50%;
292
+ transform: translateY(-50%) translateX(-4px);
293
+ }
294
+ .fanui-dock--vertical .fanui-dock__item:hover .fanui-dock__label {
295
+ transform: translateY(-50%) translateX(0);
296
+ }
297
+
298
+ .fanui-carousel {
299
+ position: relative;
300
+ }
301
+ .fanui-carousel__viewport {
302
+ display: flex;
303
+ gap: var(--fanui-carousel-gap, var(--fanui-space-4));
304
+ overflow-x: auto;
305
+ scroll-snap-type: x mandatory;
306
+ scroll-behavior: smooth;
307
+ scrollbar-width: none;
308
+ scrollbar-width: none;
309
+ -ms-overflow-style: none;
310
+ }
311
+ .fanui-carousel__viewport::-webkit-scrollbar {
312
+ width: 0;
313
+ height: 0;
314
+ display: none;
315
+ }
316
+ .fanui-carousel__viewport > * {
317
+ flex: 0 0 var(--fanui-carousel-slide, 100%);
318
+ scroll-snap-align: start;
319
+ }
320
+ .fanui-carousel--peek .fanui-carousel__viewport > * {
321
+ --fanui-carousel-slide: calc(100% - 48px);
322
+ }
323
+ .fanui-carousel--2 .fanui-carousel__viewport > * {
324
+ --fanui-carousel-slide: calc((100% - var(--fanui-carousel-gap, 16px)) / 2);
325
+ }
326
+ .fanui-carousel--3 .fanui-carousel__viewport > * {
327
+ --fanui-carousel-slide: calc((100% - var(--fanui-carousel-gap, 16px) * 2) / 3);
328
+ }
329
+ .fanui-carousel__nav {
330
+ position: absolute;
331
+ top: 50%;
332
+ z-index: 2;
333
+ display: grid;
334
+ place-items: center;
335
+ width: 38px;
336
+ height: 38px;
337
+ border: 1px solid var(--fanui-color-border);
338
+ border-radius: var(--fanui-radius-full);
339
+ background-color: var(--fanui-color-overlay);
340
+ color: var(--fanui-color-text);
341
+ box-shadow: var(--fanui-shadow-md);
342
+ cursor: pointer;
343
+ transform: translateY(-50%);
344
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, opacity 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
345
+ }
346
+ .fanui-carousel__nav:hover {
347
+ background-color: var(--fanui-color-hover);
348
+ transform: translateY(-50%) scale(1.06);
349
+ }
350
+ .fanui-carousel__nav:disabled {
351
+ opacity: 0.35;
352
+ cursor: not-allowed;
353
+ }
354
+ .fanui-carousel__nav--prev {
355
+ inset-inline-start: -8px;
356
+ }
357
+ .fanui-carousel__nav--next {
358
+ inset-inline-end: -8px;
359
+ }
360
+ .fanui-carousel__dots {
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: center;
364
+ gap: var(--fanui-space-2);
365
+ margin-top: var(--fanui-space-4);
366
+ }
367
+ .fanui-carousel__dot {
368
+ width: 8px;
369
+ height: 8px;
370
+ padding: 0;
371
+ border: 0;
372
+ border-radius: var(--fanui-radius-full);
373
+ background-color: var(--fanui-color-border-strong);
374
+ cursor: pointer;
375
+ transition: width 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, background-color 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s;
376
+ }
377
+ .fanui-carousel__dot.is-active {
378
+ width: 22px;
379
+ background-color: var(--fanui-primary);
380
+ }
381
+ .fanui-carousel__progress {
382
+ height: 3px;
383
+ margin-top: var(--fanui-space-4);
384
+ border-radius: var(--fanui-radius-full);
385
+ background-color: var(--fanui-color-border);
386
+ overflow: hidden;
387
+ }
388
+ .fanui-carousel__progress-bar {
389
+ height: 100%;
390
+ border-radius: inherit;
391
+ background-image: linear-gradient(to right, var(--fanui-primary), var(--fanui-primary-vivid));
392
+ transform-origin: left center;
393
+ transform: scaleX(var(--fanui-carousel-progress, 0));
394
+ transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
395
+ }
396
+
397
+ .fanui-fab {
398
+ position: fixed;
399
+ inset-block-end: var(--fanui-space-6);
400
+ inset-inline-end: var(--fanui-space-6);
401
+ z-index: var(--fanui-z-fixed);
402
+ display: flex;
403
+ flex-direction: column-reverse;
404
+ align-items: center;
405
+ gap: var(--fanui-space-3);
406
+ }
407
+ .fanui-fab__trigger {
408
+ display: grid;
409
+ place-items: center;
410
+ width: 54px;
411
+ height: 54px;
412
+ border: 0;
413
+ border-radius: var(--fanui-radius-full);
414
+ background-image: var(--fanui-brand-grad);
415
+ color: #fff;
416
+ font-size: 20px;
417
+ cursor: pointer;
418
+ box-shadow: 0 10px 24px -8px var(--fanui-primary-glow);
419
+ transition: transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, box-shadow 200ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s;
420
+ }
421
+ .fanui-fab__trigger:hover {
422
+ transform: translateY(-2px) scale(1.05);
423
+ box-shadow: 0 16px 32px -10px var(--fanui-primary-glow);
424
+ }
425
+ .fanui-fab__trigger:active {
426
+ transform: scale(0.96);
427
+ }
428
+ .is-open .fanui-fab__trigger {
429
+ transform: rotate(45deg);
430
+ }
431
+ .fanui-fab__list {
432
+ display: flex;
433
+ flex-direction: column-reverse;
434
+ align-items: center;
435
+ gap: var(--fanui-space-3);
436
+ margin: 0;
437
+ padding: 0;
438
+ list-style: none;
439
+ }
440
+ .fanui-fab__item {
441
+ display: flex;
442
+ align-items: center;
443
+ gap: var(--fanui-space-2);
444
+ opacity: 0;
445
+ transform: translateY(10px) scale(0.9);
446
+ pointer-events: none;
447
+ 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;
448
+ }
449
+ .is-open .fanui-fab__item {
450
+ opacity: 1;
451
+ transform: none;
452
+ pointer-events: auto;
453
+ }
454
+ .fanui-fab__action {
455
+ display: grid;
456
+ place-items: center;
457
+ width: 42px;
458
+ height: 42px;
459
+ border: 1px solid var(--fanui-color-border);
460
+ border-radius: var(--fanui-radius-full);
461
+ background-color: var(--fanui-color-overlay);
462
+ color: var(--fanui-color-text);
463
+ box-shadow: var(--fanui-shadow-md);
464
+ cursor: pointer;
465
+ }
466
+ .fanui-fab__text {
467
+ padding: 3px 8px;
468
+ font-size: var(--fanui-font-size-xs);
469
+ white-space: nowrap;
470
+ color: var(--fanui-color-text-inverse);
471
+ background-color: var(--fanui-color-text-strong);
472
+ border-radius: var(--fanui-radius-sm);
473
+ }
474
+ .fanui-fab__list .fanui-fab__item:nth-child(1) {
475
+ transition-delay: 0ms;
476
+ }
477
+ .fanui-fab__list .fanui-fab__item:nth-child(2) {
478
+ transition-delay: 40ms;
479
+ }
480
+ .fanui-fab__list .fanui-fab__item:nth-child(3) {
481
+ transition-delay: 80ms;
482
+ }
483
+ .fanui-fab__list .fanui-fab__item:nth-child(4) {
484
+ transition-delay: 120ms;
485
+ }
486
+ .fanui-fab__list .fanui-fab__item:nth-child(5) {
487
+ transition-delay: 160ms;
488
+ }
489
+ .fanui-fab--glass .fanui-fab__trigger {
490
+ background-color: rgba(var(--fanui-glass-tint-rgb), calc(var(--fanui-glass-tint-base) + var(--fanui-glass-tint-k) * var(--fanui-glass-intensity)));
491
+ background-image: linear-gradient(180deg, rgba(255, 255, 255, calc(var(--fanui-glass-sheen-a) * var(--fanui-glass-intensity))) 0%, rgba(255, 255, 255, 0) 46%);
492
+ 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)));
493
+ -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)));
494
+ border-color: rgba(var(--fanui-glass-border-rgb), calc(var(--fanui-glass-border-a) + var(--fanui-glass-border-k) * var(--fanui-glass-intensity)));
495
+ }
496
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
497
+ .fanui-fab--glass .fanui-fab__trigger {
498
+ background-color: var(--fanui-glass-fallback-bg);
499
+ background-image: none;
500
+ }
501
+ }
502
+ .fanui-fab--glass .fanui-fab__trigger {
503
+ background-image: var(--fanui-brand-grad);
504
+ }
505
+
506
+ .fanui-scroll-progress {
507
+ position: fixed;
508
+ inset-block-start: 0;
509
+ inset-inline: 0;
510
+ z-index: calc(var(--fanui-z-fixed) + 1);
511
+ height: 3px;
512
+ background-color: transparent;
513
+ pointer-events: none;
514
+ }
515
+ .fanui-scroll-progress__bar {
516
+ height: 100%;
517
+ background-image: linear-gradient(to right, var(--fanui-primary), var(--fanui-accent));
518
+ transform-origin: left center;
519
+ transform: scaleX(var(--fanui-scroll-progress, 0));
520
+ transition: transform 150ms linear 0s;
521
+ }
522
+ .fanui-scroll-progress--thin {
523
+ height: 2px;
524
+ }
525
+ .fanui-scroll-progress--thick {
526
+ height: 4px;
527
+ }
528
+ .fanui-scroll-progress--glow .fanui-scroll-progress__bar {
529
+ box-shadow: 0 0 12px var(--fanui-primary-glow);
530
+ }
531
+
532
+ .fanui-spotlight {
533
+ position: relative;
534
+ isolation: isolate;
535
+ overflow: hidden;
536
+ border: 1px solid var(--fanui-color-border);
537
+ border-radius: var(--fanui-radius-xl);
538
+ background-color: var(--fanui-color-surface);
539
+ transition: border-color 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
540
+ }
541
+ .fanui-spotlight::before {
542
+ content: "";
543
+ position: absolute;
544
+ inset: 0;
545
+ z-index: 0;
546
+ pointer-events: none;
547
+ opacity: 0;
548
+ background: radial-gradient(260px circle at var(--fanui-spot-x, 50%) var(--fanui-spot-y, 0%), var(--fanui-primary-soft-2, var(--fanui-primary-soft)), transparent 68%);
549
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
550
+ }
551
+ .fanui-spotlight::after {
552
+ content: "";
553
+ position: absolute;
554
+ inset: 0;
555
+ z-index: 1;
556
+ pointer-events: none;
557
+ border-radius: inherit;
558
+ padding: 1px;
559
+ opacity: 0;
560
+ background: radial-gradient(200px circle at var(--fanui-spot-x, 50%) var(--fanui-spot-y, 0%), var(--fanui-primary), transparent 70%);
561
+ -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
562
+ mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
563
+ -webkit-mask-composite: xor;
564
+ mask-composite: exclude;
565
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
566
+ }
567
+ .fanui-spotlight:hover::before, .fanui-spotlight:hover::after {
568
+ opacity: 1;
569
+ }
570
+ .fanui-spotlight > * {
571
+ position: relative;
572
+ z-index: 2;
573
+ }
574
+ .fanui-spotlight:hover {
575
+ transform: translateY(-2px);
576
+ box-shadow: var(--fanui-shadow-lg);
577
+ }
578
+ .fanui-spotlight--static::before, .fanui-spotlight--static::after {
579
+ opacity: 0.55;
580
+ }
581
+
582
+ .fanui-cursor-glow {
583
+ position: fixed;
584
+ inset: 0;
585
+ z-index: 0;
586
+ pointer-events: none;
587
+ background: radial-gradient(520px circle at var(--fanui-cursor-x, 50%) var(--fanui-cursor-y, 30%), var(--fanui-brand-aura-a), transparent 62%);
588
+ opacity: 0.9;
589
+ }
590
+ html[data-fanui-glass=off] .fanui-cursor-glow {
591
+ opacity: 0.5;
592
+ }
593
+
594
+ .fanui-studio {
595
+ position: fixed;
596
+ inset-block-end: var(--fanui-space-5);
597
+ inset-inline-end: var(--fanui-space-5);
598
+ z-index: calc(var(--fanui-z-fixed) + 20);
599
+ display: flex;
600
+ flex-direction: column;
601
+ align-items: flex-end;
602
+ gap: var(--fanui-space-3);
603
+ font-size: var(--fanui-font-size-sm);
604
+ }
605
+ .fanui-studio__trigger {
606
+ display: inline-flex;
607
+ align-items: center;
608
+ gap: var(--fanui-space-2);
609
+ height: 44px;
610
+ padding: 0 var(--fanui-space-4);
611
+ border: 1px solid var(--fanui-color-border);
612
+ border-radius: var(--fanui-radius-full);
613
+ background-color: var(--fanui-color-overlay);
614
+ color: var(--fanui-color-text);
615
+ box-shadow: var(--fanui-shadow-lg);
616
+ cursor: pointer;
617
+ background-color: rgba(var(--fanui-glass-tint-rgb), calc(var(--fanui-glass-tint-base) + var(--fanui-glass-tint-k) * var(--fanui-glass-intensity)));
618
+ background-image: linear-gradient(180deg, rgba(255, 255, 255, calc(var(--fanui-glass-sheen-a) * var(--fanui-glass-intensity))) 0%, rgba(255, 255, 255, 0) 46%);
619
+ 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)));
620
+ -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)));
621
+ border-color: rgba(var(--fanui-glass-border-rgb), calc(var(--fanui-glass-border-a) + var(--fanui-glass-border-k) * var(--fanui-glass-intensity)));
622
+ }
623
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
624
+ .fanui-studio__trigger {
625
+ background-color: var(--fanui-glass-fallback-bg);
626
+ background-image: none;
627
+ }
628
+ }
629
+ .fanui-studio__trigger {
630
+ box-shadow: var(--fanui-shadow-lg);
631
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
632
+ }
633
+ .fanui-studio__trigger:hover {
634
+ transform: translateY(-2px);
635
+ }
636
+ .fanui-studio__trigger-dot {
637
+ width: 14px;
638
+ height: 14px;
639
+ border-radius: var(--fanui-radius-full);
640
+ background-image: var(--fanui-brand-grad);
641
+ box-shadow: 0 0 0 3px var(--fanui-primary-ring);
642
+ }
643
+ .fanui-studio__panel {
644
+ width: 300px;
645
+ max-height: min(74vh, 620px);
646
+ overflow-y: auto;
647
+ padding: var(--fanui-space-5);
648
+ border-radius: var(--fanui-radius-2xl);
649
+ scrollbar-width: thin;
650
+ scrollbar-color: rgba(100, 116, 139, 0.45) transparent;
651
+ }
652
+ .fanui-studio__panel::-webkit-scrollbar {
653
+ width: 6px;
654
+ height: 6px;
655
+ }
656
+ .fanui-studio__panel::-webkit-scrollbar-track {
657
+ background: transparent;
658
+ }
659
+ .fanui-studio__panel::-webkit-scrollbar-thumb {
660
+ background: rgba(100, 116, 139, 0.45);
661
+ border-radius: 9999px;
662
+ }
663
+ .fanui-studio__panel::-webkit-scrollbar-thumb:hover {
664
+ background: rgba(100, 116, 139, 0.7);
665
+ }
666
+ .fanui-studio__panel {
667
+ position: relative;
668
+ isolation: isolate;
669
+ background-color: rgba(var(--fanui-glass-tint-rgb), calc(var(--fanui-glass-tint-base) + var(--fanui-glass-tint-k) * var(--fanui-glass-intensity)));
670
+ 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%);
671
+ background-repeat: no-repeat;
672
+ background-size: 100% 100%;
673
+ border: 1px solid rgba(var(--fanui-glass-border-rgb), calc(var(--fanui-glass-border-a) + var(--fanui-glass-border-k) * var(--fanui-glass-intensity)));
674
+ border-radius: var(--fanui-glass-radius, 12px);
675
+ color: var(--fanui-color-text);
676
+ 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)));
677
+ -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)));
678
+ 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))));
679
+ 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;
680
+ }
681
+ .fanui-studio__panel::after {
682
+ content: "";
683
+ position: absolute;
684
+ inset: 0;
685
+ z-index: 1;
686
+ border-radius: inherit;
687
+ pointer-events: none;
688
+ padding: var(--fanui-glass-edge-width, calc(1px + 0.5px * var(--fanui-glass-intensity)));
689
+ 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%);
690
+ -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
691
+ mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
692
+ -webkit-mask-composite: xor;
693
+ mask-composite: exclude;
694
+ opacity: var(--fanui-glass-edge-alpha, 1);
695
+ }
696
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
697
+ .fanui-studio__panel {
698
+ background-color: var(--fanui-glass-fallback-bg);
699
+ background-image: none;
700
+ }
701
+ }
702
+ .fanui-studio__panel {
703
+ --fanui-glass-radius: var(--fanui-radius-2xl);
704
+ opacity: 0;
705
+ visibility: hidden;
706
+ transform: translateY(12px) scale(0.97);
707
+ transform-origin: bottom right;
708
+ transition: opacity 300ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, transform 300ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s, visibility 300ms cubic-bezier(0.34, 1.56, 0.64, 1) 0s;
709
+ }
710
+ .fanui-studio.is-open .fanui-studio__panel {
711
+ opacity: 1;
712
+ visibility: visible;
713
+ transform: none;
714
+ }
715
+ .fanui-studio__title {
716
+ display: flex;
717
+ align-items: center;
718
+ justify-content: space-between;
719
+ margin-bottom: var(--fanui-space-4);
720
+ font-size: var(--fanui-font-size-md);
721
+ font-weight: var(--fanui-font-weight-semibold);
722
+ color: var(--fanui-color-text-strong);
723
+ }
724
+ .fanui-studio__section {
725
+ padding-block: var(--fanui-space-3);
726
+ border-top: 1px solid var(--fanui-glass-divider);
727
+ }
728
+ .fanui-studio__section:first-of-type {
729
+ border-top: 0;
730
+ padding-top: 0;
731
+ }
732
+ .fanui-studio__label {
733
+ display: flex;
734
+ align-items: center;
735
+ justify-content: space-between;
736
+ margin-bottom: var(--fanui-space-2);
737
+ font-size: var(--fanui-font-size-xs);
738
+ font-weight: var(--fanui-font-weight-semibold);
739
+ letter-spacing: var(--fanui-tracking-wide);
740
+ color: var(--fanui-color-text-subtle);
741
+ text-transform: uppercase;
742
+ }
743
+ .fanui-studio__value {
744
+ font-variant-numeric: tabular-nums;
745
+ font-weight: var(--fanui-font-weight-normal);
746
+ color: var(--fanui-primary-ink);
747
+ text-transform: none;
748
+ letter-spacing: 0;
749
+ }
750
+ .fanui-studio__accents {
751
+ display: grid;
752
+ grid-template-columns: repeat(6, 1fr);
753
+ gap: var(--fanui-space-2);
754
+ }
755
+ .fanui-studio__accent {
756
+ position: relative;
757
+ aspect-ratio: 1;
758
+ padding: 0;
759
+ border: 1px solid rgba(2, 6, 23, 0.14);
760
+ border-radius: var(--fanui-radius-md);
761
+ background-image: linear-gradient(135deg, var(--fanui-studio-c1), var(--fanui-studio-c2));
762
+ cursor: pointer;
763
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
764
+ }
765
+ .fanui-studio__accent:hover {
766
+ transform: translateY(-2px) scale(1.05);
767
+ }
768
+ .fanui-studio__accent[aria-pressed=true] {
769
+ box-shadow: 0 0 0 2px var(--fanui-color-overlay), 0 0 0 4px var(--fanui-primary);
770
+ }
771
+ .fanui-studio__accent[aria-pressed=true]::after {
772
+ content: "";
773
+ position: absolute;
774
+ inset: 0;
775
+ margin: auto;
776
+ width: 8px;
777
+ height: 5px;
778
+ border-inline-start: 2px solid #fff;
779
+ border-bottom: 2px solid #fff;
780
+ transform: rotate(-45deg) translate(1px, -1px);
781
+ filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.5));
782
+ }
783
+ .fanui-studio__row {
784
+ display: flex;
785
+ align-items: center;
786
+ gap: var(--fanui-space-2);
787
+ }
788
+ .fanui-studio__hint {
789
+ margin-top: var(--fanui-space-2);
790
+ font-size: var(--fanui-font-size-xs);
791
+ line-height: var(--fanui-line-height-normal);
792
+ color: var(--fanui-color-text-subtle);
793
+ }
794
+ .fanui-studio__kbd {
795
+ display: inline-block;
796
+ padding: 0 5px;
797
+ font-family: var(--fanui-font-mono);
798
+ font-size: 11px;
799
+ line-height: 18px;
800
+ color: var(--fanui-color-text-muted);
801
+ background-color: var(--fanui-glass-divider);
802
+ border: 1px solid var(--fanui-color-border);
803
+ border-radius: var(--fanui-radius-sm);
804
+ }
805
+
806
+ .fanui-sheet {
807
+ position: fixed;
808
+ top: 0;
809
+ right: 0;
810
+ bottom: 0;
811
+ left: 0;
812
+ z-index: var(--fanui-z-modal);
813
+ display: flex;
814
+ align-items: flex-end;
815
+ justify-content: center;
816
+ opacity: 0;
817
+ visibility: hidden;
818
+ transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s, visibility 200ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
819
+ }
820
+ .fanui-sheet.is-open {
821
+ opacity: 1;
822
+ visibility: visible;
823
+ }
824
+ .fanui-sheet__backdrop {
825
+ position: absolute;
826
+ top: 0;
827
+ right: 0;
828
+ bottom: 0;
829
+ left: 0;
830
+ background-color: var(--fanui-backdrop-bg);
831
+ }
832
+ .fanui-sheet__panel {
833
+ position: relative;
834
+ width: 100%;
835
+ max-width: 560px;
836
+ max-height: 88vh;
837
+ display: flex;
838
+ flex-direction: column;
839
+ padding: var(--fanui-space-3) var(--fanui-space-5) var(--fanui-space-6);
840
+ border-radius: var(--fanui-radius-2xl) var(--fanui-radius-2xl) 0 0;
841
+ position: relative;
842
+ isolation: isolate;
843
+ background-color: rgba(var(--fanui-glass-tint-rgb), calc(var(--fanui-glass-tint-base) + var(--fanui-glass-tint-k) * var(--fanui-glass-intensity)));
844
+ 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%);
845
+ background-repeat: no-repeat;
846
+ background-size: 100% 100%;
847
+ border: 1px solid rgba(var(--fanui-glass-border-rgb), calc(var(--fanui-glass-border-a) + var(--fanui-glass-border-k) * var(--fanui-glass-intensity)));
848
+ border-radius: var(--fanui-glass-radius, 12px);
849
+ color: var(--fanui-color-text);
850
+ 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)));
851
+ -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)));
852
+ 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))));
853
+ 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;
854
+ }
855
+ .fanui-sheet__panel::after {
856
+ content: "";
857
+ position: absolute;
858
+ inset: 0;
859
+ z-index: 1;
860
+ border-radius: inherit;
861
+ pointer-events: none;
862
+ padding: var(--fanui-glass-edge-width, calc(1px + 0.5px * var(--fanui-glass-intensity)));
863
+ 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%);
864
+ -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
865
+ mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
866
+ -webkit-mask-composite: xor;
867
+ mask-composite: exclude;
868
+ opacity: var(--fanui-glass-edge-alpha, 1);
869
+ }
870
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
871
+ .fanui-sheet__panel {
872
+ background-color: var(--fanui-glass-fallback-bg);
873
+ background-image: none;
874
+ }
875
+ }
876
+ .fanui-sheet__panel {
877
+ --fanui-glass-radius: var(--fanui-radius-2xl);
878
+ transform: translateY(100%);
879
+ transition: transform 300ms cubic-bezier(0, 0, 0.2, 1) 0s;
880
+ }
881
+ .fanui-sheet.is-open .fanui-sheet__panel {
882
+ transform: translateY(0);
883
+ }
884
+ .fanui-sheet__handle {
885
+ width: 40px;
886
+ height: 4px;
887
+ margin: 0 auto var(--fanui-space-4);
888
+ border-radius: var(--fanui-radius-full);
889
+ background-color: var(--fanui-color-border-strong);
890
+ flex: 0 0 auto;
891
+ }
892
+ .fanui-sheet__header {
893
+ display: flex;
894
+ align-items: center;
895
+ justify-content: space-between;
896
+ margin-bottom: var(--fanui-space-3);
897
+ }
898
+ .fanui-sheet__body {
899
+ flex: 1 1 auto;
900
+ overflow-y: auto;
901
+ padding-bottom: env(safe-area-inset-bottom, 0);
902
+ }
903
+
904
+ .fanui-bottom-nav {
905
+ position: fixed;
906
+ inset-block-end: 0;
907
+ inset-inline: 0;
908
+ z-index: var(--fanui-z-fixed);
909
+ display: flex;
910
+ padding-bottom: env(safe-area-inset-bottom, 0);
911
+ }
912
+ .fanui-bottom-nav__item {
913
+ flex: 1 1 0;
914
+ display: flex;
915
+ flex-direction: column;
916
+ align-items: center;
917
+ gap: 3px;
918
+ padding: var(--fanui-space-2) 0;
919
+ border: 0;
920
+ background: transparent;
921
+ font-size: var(--fanui-font-size-xs);
922
+ color: var(--fanui-color-text-subtle);
923
+ text-decoration: none;
924
+ cursor: pointer;
925
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s;
926
+ }
927
+ .fanui-bottom-nav__item[aria-current=page], .fanui-bottom-nav__item.is-active {
928
+ color: var(--fanui-primary);
929
+ }
930
+ .fanui-bottom-nav__item:hover {
931
+ color: var(--fanui-color-text);
932
+ }
933
+ .fanui-bottom-nav__icon {
934
+ display: grid;
935
+ place-items: center;
936
+ width: 24px;
937
+ height: 24px;
938
+ font-size: 18px;
939
+ }
940
+ .fanui-bottom-nav__badge {
941
+ position: absolute;
942
+ transform: translate(12px, -6px);
943
+ }
944
+
945
+ @supports (padding: env(safe-area-inset-bottom)) {
946
+ .fanui-fab {
947
+ inset-block-end: calc(var(--fanui-space-6) + env(safe-area-inset-bottom, 0px));
948
+ }
949
+ }
950
+ @media (prefers-reduced-motion: reduce) {
951
+ .fanui-dock__item {
952
+ transform: none !important;
953
+ }
954
+ .fanui-carousel__viewport {
955
+ scroll-behavior: auto;
956
+ }
957
+ .fanui-spotlight:hover {
958
+ transform: none;
959
+ }
960
+ }