@flun/html-template 4.0.10

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 (59) hide show
  1. package/.env +9 -0
  2. package/LICENSE +15 -0
  3. package/build.js +3 -0
  4. package/compile.js +349 -0
  5. package/copy-files.js +200 -0
  6. package/customize/account.js +726 -0
  7. package/customize/data.json +484 -0
  8. package/customize/functions.js +48 -0
  9. package/customize/hotReloadInjector.js +25 -0
  10. package/customize/routes.js +141 -0
  11. package/customize/users.json +44 -0
  12. package/customize/variables.js +70 -0
  13. package/dev-server.js +344 -0
  14. package/dev.js +4 -0
  15. package/f-CHANGELOG.md +4 -0
  16. package/f-README.md +485 -0
  17. package/index.d.ts +133 -0
  18. package/index.js +4 -0
  19. package/package.json +77 -0
  20. package/restoreDefaults.js +8 -0
  21. package/services/templateService.js +962 -0
  22. package/static/about.css +118 -0
  23. package/static/auth.js +27 -0
  24. package/static/constants.css +138 -0
  25. package/static/img/dark.png +0 -0
  26. package/static/img/favicon.ico +0 -0
  27. package/static/img/light.png +0 -0
  28. package/static/img/top.png +0 -0
  29. package/static/index.css +86 -0
  30. package/static/mouseOrTouch.js +156 -0
  31. package/static/public.css +288 -0
  32. package/static/script.css +318 -0
  33. package/static/script.js +392 -0
  34. package/static/styling.css +874 -0
  35. package/static/styling.js +933 -0
  36. package/static/themeImg.css +10 -0
  37. package/static/themeImg.js +19 -0
  38. package/static/themeModule.js +222 -0
  39. package/static/topImg.css +19 -0
  40. package/static/topImg.js +21 -0
  41. package/static/utils/browser13.js +270 -0
  42. package/static/utils/closebrackets.js +166 -0
  43. package/static/utils/css-lint.js +308 -0
  44. package/static/utils/custom-css-hint.js +876 -0
  45. package/static/utils/foldgutter.js +141 -0
  46. package/static/utils/match-highlighter.js +70 -0
  47. package/templates/about.html +236 -0
  48. package/templates/account/2fa.html +184 -0
  49. package/templates/account/forgot-password.html +226 -0
  50. package/templates/account/login.html +230 -0
  51. package/templates/account/profile.html +977 -0
  52. package/templates/account/register.html +224 -0
  53. package/templates/account/reset-password.html +205 -0
  54. package/templates/account/verify-email.html +163 -0
  55. package/templates/base.html +71 -0
  56. package/templates/footer-content.html +5 -0
  57. package/templates/index.html +140 -0
  58. package/templates/script.html +209 -0
  59. package/templates/test-include.html +11 -0
@@ -0,0 +1,874 @@
1
+ /* 选择器 */
2
+ .picker {
3
+ position: fixed;
4
+ top: 50%;
5
+ left: 50%;
6
+ transform: translate(-50%, -50%);
7
+ background: #88888F;
8
+ border-radius: 10px;
9
+ box-shadow: 0 5px 25px rgba(0, 0, 0, 0.2);
10
+ padding: 10px;
11
+ z-index: 1000;
12
+ display: none;
13
+ grid-template-columns: repeat(6, 1fr);
14
+ gap: 5px;
15
+ max-width: 320px;
16
+ border: 1px solid #e1e5e9;
17
+ justify-items: center;
18
+ }
19
+
20
+ .picker label {
21
+ font-size: 14px;
22
+ color: #2c3e50;
23
+ font-weight: bold;
24
+ white-space: nowrap;
25
+ }
26
+
27
+ /* 优化触摸响应,不阻止其他手势 */
28
+ .picker,
29
+ .custom-option,
30
+ button {
31
+ touch-action: manipulation;
32
+ }
33
+
34
+ .mode-toggle {
35
+ grid-column: 1 / -1;
36
+ display: flex;
37
+ gap: 3px;
38
+ border-radius: 8px 8px 0 0;
39
+ overflow: hidden;
40
+ }
41
+
42
+ .mode-btn {
43
+ width: 35px;
44
+ height: 25px;
45
+ padding: 4px 0;
46
+ border-radius: 5px;
47
+ background: #5f7284;
48
+ border: none;
49
+ cursor: pointer;
50
+ font-size: 13px;
51
+ font-weight: bold;
52
+ color: #1d2a36;
53
+ transition: all 0.2s ease;
54
+ border-right: 1px solid #e1e5e9;
55
+ }
56
+
57
+ .mode-btn:last-child {
58
+ border-right: none;
59
+ }
60
+
61
+ .mode-btn.active {
62
+ background: #3498db;
63
+ color: var(--text-color);
64
+ }
65
+
66
+ .mode-btn:hover:not(.active) {
67
+ background: #e9ecef;
68
+ }
69
+
70
+ /* 选择器特性容器 */
71
+ .custom {
72
+ grid-column: 1 / -1;
73
+ display: flex;
74
+ align-items: center;
75
+ margin-top: 10px;
76
+ width: 100%;
77
+ }
78
+
79
+ .custom-option {
80
+ width: 25px;
81
+ height: 25px;
82
+ border-radius: 5px;
83
+ cursor: pointer;
84
+ border: 2px solid transparent;
85
+ transition: all 0.2s ease;
86
+ }
87
+
88
+ .custom-option:hover {
89
+ transform: scale(1.1);
90
+ box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2);
91
+ }
92
+
93
+ /* 清除边框按钮 */
94
+ .clearBorder {
95
+ grid-column: 1 / -1;
96
+ background: #e74c3c;
97
+ color: var(--text-color);
98
+ padding: 3px 6px;
99
+ border: none;
100
+ border-radius: 5px;
101
+ cursor: pointer;
102
+ transition: background 0.3s;
103
+ font-size: 14px;
104
+ width: 100%;
105
+ }
106
+
107
+ .clearBorder:hover {
108
+ background: #c0392b;
109
+ }
110
+
111
+ /* 保存和编辑按钮容器 */
112
+ .saveEditor {
113
+ margin-top: 2px;
114
+ grid-column: 1 / -1;
115
+ display: flex;
116
+ gap: 8px;
117
+ align-items: center;
118
+ width: 100%;
119
+ }
120
+
121
+ .toEditorBtn,
122
+ .toSaveBtn {
123
+ flex: 1;
124
+ padding: 8px 12px;
125
+ height: auto;
126
+ background: #34db77;
127
+ color: var(--text-color);
128
+ border: none;
129
+ border-radius: 5px;
130
+ cursor: pointer;
131
+ transition: background 0.3s;
132
+ font-size: 14px;
133
+ font-weight: bold;
134
+ white-space: nowrap;
135
+ }
136
+
137
+ .toSaveBtn {
138
+ background: #3c67e7;
139
+ }
140
+
141
+ .toEditorBtn:hover {
142
+ background: #2980b9;
143
+ }
144
+
145
+ .toSaveBtn:hover {
146
+ background: #074521;
147
+ }
148
+
149
+ /* 隐藏的可访问性标签样式 */
150
+ .visually-hidden {
151
+ position: absolute;
152
+ width: 1px;
153
+ height: 1px;
154
+ padding: 0;
155
+ margin: -1px;
156
+ overflow: hidden;
157
+ clip: rect(0, 0, 0, 0);
158
+ white-space: nowrap;
159
+ border: 0;
160
+ }
161
+
162
+ /* 自定义颜色输入框 */
163
+ .custom input[type="color"] {
164
+ flex: 1;
165
+ height: 40px;
166
+ border: 1px solid #ddd;
167
+ border-radius: 5px;
168
+ min-width: 50px;
169
+ }
170
+
171
+ /* 字体大小输入框 */
172
+ .custom input[type="text"] {
173
+ flex: 1;
174
+ height: 30px;
175
+ border: 1px solid #ddd;
176
+ border-radius: 5px;
177
+ padding: 0 8px;
178
+ font-size: 14px;
179
+ min-width: 0;
180
+ }
181
+
182
+ input[type="file"] {
183
+ width: 100%;
184
+ }
185
+
186
+ .custom button {
187
+ padding: 0 10px;
188
+ height: 30px;
189
+ background: #3498db;
190
+ color: var(--text-color);
191
+ border: none;
192
+ border-radius: 5px;
193
+ cursor: pointer;
194
+ transition: background 0.3s;
195
+ font-size: 14px;
196
+ white-space: nowrap;
197
+ flex-shrink: 0;
198
+ }
199
+
200
+ .custom button:hover {
201
+ background: #2980b9;
202
+ }
203
+
204
+ /* 长按提示器 */
205
+ .pressIndicator {
206
+ position: fixed;
207
+ width: 60px;
208
+ height: 60px;
209
+ border-radius: 50%;
210
+ pointer-events: none;
211
+ z-index: 1000;
212
+ display: none;
213
+ align-items: center;
214
+ justify-content: center;
215
+ color: var(--text-color);
216
+ font-weight: bold;
217
+ font-size: 12px;
218
+ text-align: center;
219
+ }
220
+
221
+ /* 长按倒计时 */
222
+ .long-press-indicator {
223
+ display: flex;
224
+ background: #3498db;
225
+ animation: pulse 1s infinite;
226
+ position: absolute;
227
+ z-index: 1000;
228
+ }
229
+
230
+ /* 视觉反馈 动画 */
231
+ .element-highlight {
232
+ outline: 2px dashed #3498db !important;
233
+ outline-offset: 2px;
234
+ touch-action: none;
235
+ }
236
+
237
+ .countdown-bar {
238
+ position: absolute;
239
+ bottom: 0;
240
+ left: 0;
241
+ height: 4px;
242
+ background: #3498db;
243
+ width: 100%;
244
+ transform-origin: left center;
245
+ animation: countdown 2s linear;
246
+ }
247
+
248
+ /* 字体选择器样式 */
249
+ .select-btn {
250
+ width: 100%;
251
+ padding: 8px 12px;
252
+ background: #5f7284;
253
+ color: var(--text-color);
254
+ border: 1px solid #4a5b6b;
255
+ text-align: left;
256
+ display: flex;
257
+ justify-content: space-between;
258
+ align-items: center;
259
+ transition: all 0.2s ease;
260
+ }
261
+
262
+ .select-btn:hover {
263
+ background: #6b7f94;
264
+ border-color: #5a6b7a;
265
+ }
266
+
267
+ .dropdown-arrow {
268
+ font-size: 10px;
269
+ transition: transform 0.3s ease;
270
+ margin-left: 8px;
271
+ }
272
+
273
+ .select-list {
274
+ position: absolute;
275
+ top: 83%;
276
+ left: 0;
277
+ right: 0;
278
+ background: rgb(65, 46, 46);
279
+ border: 1px solid #ddd;
280
+ border-radius: 5px;
281
+ max-height: 200px;
282
+ overflow-y: auto;
283
+ z-index: 1001;
284
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
285
+ margin-top: 4px;
286
+ }
287
+
288
+ .select-item {
289
+ padding: 8px 12px;
290
+ cursor: pointer;
291
+ font-size: 14px;
292
+ border-bottom: 1px solid #f0f0f0;
293
+ transition: all 0.2s ease;
294
+ color: #b8a3a3;
295
+ }
296
+
297
+ .select-item:last-child {
298
+ border-bottom: none;
299
+ }
300
+
301
+ .select-item:hover {
302
+ background: #f5f5f5;
303
+ color: #3498db;
304
+ }
305
+
306
+ .select-item.selected {
307
+ background: #3498db;
308
+ color: var(--text-color);
309
+ }
310
+
311
+ /* 确保列表中的字体正确显示 */
312
+ .select-item[select-item-data=""] {
313
+ font-family: inherit;
314
+ text-align: inherit;
315
+ }
316
+
317
+ /* 边框选择器样式 */
318
+ .borderCustom {
319
+ grid-column: 1 / -1;
320
+ display: flex;
321
+ gap: 2px;
322
+ }
323
+
324
+ .borderOption {
325
+ flex: 1;
326
+ text-align: center;
327
+ cursor: pointer;
328
+ }
329
+
330
+ @keyframes countdown {
331
+ from {
332
+ transform: scaleX(1);
333
+ }
334
+
335
+ to {
336
+ transform: scaleX(0);
337
+ }
338
+ }
339
+
340
+ @keyframes pulse {
341
+ 0% {
342
+ transform: scale(0.8);
343
+ opacity: 1;
344
+ }
345
+
346
+ 50% {
347
+ transform: scale(1.2);
348
+ opacity: 0.7;
349
+ }
350
+
351
+ 100% {
352
+ transform: scale(0.8);
353
+ opacity: 1;
354
+ }
355
+ }
356
+
357
+ /* ========================================================================== */
358
+ /* 图片选择器触发容器 */
359
+ #imagePickerDiv {
360
+ grid-column: 1 / -1;
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: space-between;
364
+ padding: 8px;
365
+ gap: 8px;
366
+ background: linear-gradient(135deg, #6089b1, #55687b);
367
+ border-radius: 10px;
368
+ border: 1px solid #dee2e6;
369
+ width: 100%;
370
+ }
371
+
372
+ .selectImageBtn {
373
+ padding: 10px 20px;
374
+ background: linear-gradient(135deg, #3498db, #2980b9);
375
+ color: var(--text-color);
376
+ border: none;
377
+ border-radius: 8px;
378
+ font-size: 15px;
379
+ font-weight: 600;
380
+ cursor: pointer;
381
+ transition: all 0.3s;
382
+ box-shadow: 0 4px 12px rgba(52, 152, 219, 0.2);
383
+ }
384
+
385
+ .selectImageBtn:hover {
386
+ background: linear-gradient(135deg, #2980b9, #2573a7);
387
+ transform: translateY(-2px);
388
+ box-shadow: 0 6px 16px rgba(52, 152, 219, 0.3);
389
+ }
390
+
391
+ .selectImageBtn:active {
392
+ transform: translateY(0);
393
+ box-shadow: 0 2px 8px rgba(52, 152, 219, 0.2);
394
+ }
395
+
396
+ .remove-bg-btn {
397
+ background: #d22a17;
398
+ }
399
+
400
+ .remove-bg-btn:hover {
401
+ background: linear-gradient(135deg, #902828, #911d57);
402
+ }
403
+
404
+ /* 图片遮罩容器 */
405
+ .image-picker-overlay {
406
+ position: fixed;
407
+ top: 0;
408
+ left: 0;
409
+ width: 100%;
410
+ height: 100%;
411
+ background: rgba(0, 0, 0, 0.85);
412
+ display: flex;
413
+ justify-content: center;
414
+ align-items: center;
415
+ z-index: 1200;
416
+ animation: fadeInOverlay 0.3s ease;
417
+ -webkit-backdrop-filter: blur(5px);
418
+ backdrop-filter: blur(5px);
419
+ }
420
+
421
+ @keyframes fadeInOverlay {
422
+ from {
423
+ opacity: 0;
424
+ }
425
+
426
+ to {
427
+ opacity: 1;
428
+ }
429
+ }
430
+
431
+ .image-picker-container {
432
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
433
+ border-radius: 16px;
434
+ width: 90%;
435
+ max-width: 1200px;
436
+ max-height: 85vh;
437
+ display: flex;
438
+ flex-direction: column;
439
+ overflow: hidden;
440
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
441
+ border: 1px solid rgba(255, 255, 255, 0.1);
442
+ animation: slideUpOverlay 0.4s ease;
443
+ }
444
+
445
+ @keyframes slideUpOverlay {
446
+ from {
447
+ transform: translateY(50px);
448
+ opacity: 0;
449
+ }
450
+
451
+ to {
452
+ transform: translateY(0);
453
+ opacity: 1;
454
+ }
455
+ }
456
+
457
+ .image-picker-header {
458
+ padding: 20px 30px;
459
+ background: rgba(255, 255, 255, 0.05);
460
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
461
+ display: flex;
462
+ justify-content: space-between;
463
+ align-items: center;
464
+ }
465
+
466
+ .image-picker-title {
467
+ font-size: 24px;
468
+ font-weight: bold;
469
+ color: var(--text-color);
470
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
471
+ }
472
+
473
+ /* 关闭按钮 */
474
+ .close-image-btn {
475
+ background: rgba(255, 255, 255, 0.1);
476
+ border: none;
477
+ color: var(--text-color);
478
+ width: 40px;
479
+ height: 40px;
480
+ border-radius: 50%;
481
+ font-size: 24px;
482
+ cursor: pointer;
483
+ display: flex;
484
+ align-items: center;
485
+ justify-content: center;
486
+ transition: all 0.2s;
487
+ }
488
+
489
+ .close-image-btn:hover {
490
+ background: rgba(255, 255, 255, 0.2);
491
+ transform: rotate(90deg);
492
+ }
493
+
494
+ .image-filter-section {
495
+ display: flex;
496
+ gap: 10px;
497
+ align-items: center;
498
+ justify-content: center;
499
+ padding: 20px 30px;
500
+ background: rgba(0, 0, 0, 0.2);
501
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
502
+ }
503
+
504
+ .image-search-input {
505
+ padding: 12px 20px;
506
+ background: rgba(255, 255, 255, 0.08);
507
+ border: 2px solid rgba(255, 255, 255, 0.1);
508
+ border-radius: 8px;
509
+ color: var(--text-color);
510
+ font-size: 16px;
511
+ outline: none;
512
+ transition: all 0.3s;
513
+ }
514
+
515
+ .image-search-input:focus {
516
+ background: rgba(255, 255, 255, 0.12);
517
+ border-color: #3498db;
518
+ box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.2);
519
+ }
520
+
521
+ .image-search-input::placeholder {
522
+ color: rgba(255, 255, 255, 0.5);
523
+ }
524
+
525
+ .image-search-btn {
526
+ width: 80px;
527
+ height: 40px;
528
+ }
529
+
530
+ .image-grid-overlay {
531
+ flex: 1;
532
+ padding: 20px;
533
+ overflow-y: auto;
534
+ display: grid;
535
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
536
+ gap: 20px;
537
+ align-items: start;
538
+ }
539
+
540
+ .image-item-overlay {
541
+ background: rgba(255, 255, 255, 0.05);
542
+ border-radius: 12px;
543
+ cursor: pointer;
544
+ transition: all 0.3s;
545
+ position: relative;
546
+ border: 2px solid transparent;
547
+ display: flex;
548
+ flex-direction: column;
549
+ height: 100%;
550
+ }
551
+
552
+ .image-item-overlay:hover {
553
+ transform: translateY(-5px);
554
+ background: rgba(255, 255, 255, 0.1);
555
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
556
+ border-color: rgba(52, 152, 219, 0.3);
557
+ }
558
+
559
+ .image-item-overlay.selected {
560
+ border-color: #3498db;
561
+ background: rgba(52, 152, 219, 0.15);
562
+ box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.3);
563
+ }
564
+
565
+ .image-thumbnail-overlay {
566
+ position: relative;
567
+ display: flex;
568
+ padding: 5px;
569
+ align-items: center;
570
+ justify-content: center;
571
+ overflow: hidden;
572
+ border-radius: 8px;
573
+ background-color: rgba(255, 255, 255, 0.05);
574
+ width: 100%;
575
+ aspect-ratio: 16/9;
576
+ min-height: 180px;
577
+ max-height: 100%;
578
+ }
579
+
580
+ .image-thumbnail-overlay img {
581
+ width: 100%;
582
+ height: 100%;
583
+ object-fit: contain;
584
+ transition: transform 0.3s ease;
585
+ }
586
+
587
+ /* 悬停时放大效果 */
588
+ .image-item-overlay:hover .image-thumbnail-overlay img {
589
+ transform: scale(2.05);
590
+ }
591
+
592
+ .image-name-overlay {
593
+ width: 100%;
594
+ padding: 10px 5px;
595
+ border-radius: 0 0 5px 5px;
596
+ color: #19aa4c;
597
+ font-size: 14px;
598
+ text-align: center;
599
+ white-space: nowrap;
600
+ overflow: hidden;
601
+ border-radius: 8px;
602
+ text-overflow: ellipsis;
603
+ background: rgba(27, 22, 22, 0.8);
604
+ position: relative;
605
+ bottom: 0;
606
+ left: 0;
607
+ margin-top: auto;
608
+ }
609
+
610
+ .image-checkmark {
611
+ position: absolute;
612
+ top: 10px;
613
+ right: 10px;
614
+ background: #3498db;
615
+ color: var(--text-color);
616
+ width: 28px;
617
+ height: 28px;
618
+ border-radius: 50%;
619
+ display: flex;
620
+ align-items: center;
621
+ justify-content: center;
622
+ font-size: 16px;
623
+ opacity: 0;
624
+ transform: scale(0.8);
625
+ transition: all 0.3s;
626
+ }
627
+
628
+ .image-item-overlay.selected .image-checkmark {
629
+ opacity: 1;
630
+ transform: scale(1);
631
+ }
632
+
633
+ .image-picker-actions {
634
+ padding: 20px 30px;
635
+ background: rgba(0, 0, 0, 0.3);
636
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
637
+ display: flex;
638
+ gap: 15px;
639
+ justify-content: flex-end;
640
+ }
641
+
642
+ .image-picker-actions button {
643
+ padding: 12px 28px;
644
+ border: none;
645
+ border-radius: 8px;
646
+ font-size: 16px;
647
+ font-weight: 600;
648
+ cursor: pointer;
649
+ transition: all 0.3s;
650
+ }
651
+
652
+ .cancel-image-btn {
653
+ background: rgba(255, 255, 255, 0.1);
654
+ color: var(--text-color);
655
+ }
656
+
657
+ .cancel-image-btn:hover {
658
+ background: rgba(255, 255, 255, 0.2);
659
+ }
660
+
661
+ .apply-image-btn {
662
+ background: linear-gradient(135deg, #3498db, #2980b9);
663
+ color: var(--text-color);
664
+ min-width: 140px;
665
+ }
666
+
667
+ .apply-image-btn:not(:disabled):hover {
668
+ background: linear-gradient(135deg, #2980b9, #2573a7);
669
+ transform: translateY(-2px);
670
+ box-shadow: 0 5px 15px rgba(52, 152, 219, 0.3);
671
+ }
672
+
673
+ .apply-image-btn:disabled {
674
+ background: rgba(255, 255, 255, 0.1);
675
+ color: rgba(255, 255, 255, 0.5);
676
+ cursor: not-allowed;
677
+ transform: none !important;
678
+ }
679
+
680
+ /* 加载和错误状态 */
681
+ .loading-overlay,
682
+ .no-images-overlay,
683
+ .error-overlay {
684
+ grid-column: 1 / -1;
685
+ text-align: center;
686
+ color: rgba(255, 255, 255, 0.8);
687
+ padding: 60px 20px;
688
+ font-size: 18px;
689
+ }
690
+
691
+ /* 大图预览样式 */
692
+ .image-preview-overlay {
693
+ position: fixed;
694
+ top: 0;
695
+ left: 0;
696
+ width: 100%;
697
+ height: 100%;
698
+ background: rgba(0, 0, 0, 0.9);
699
+ display: flex;
700
+ justify-content: center;
701
+ align-items: center;
702
+ z-index: 1201;
703
+ animation: fadeInOverlay 0.3s;
704
+ -webkit-backdrop-filter: blur(5px);
705
+ backdrop-filter: blur(10px);
706
+ }
707
+
708
+ .preview-modal {
709
+ background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
710
+ border-radius: 16px;
711
+ width: 90%;
712
+ max-width: 800px;
713
+ max-height: 90vh;
714
+ overflow: hidden;
715
+ box-shadow: 0 30px 80px rgba(0, 0, 0, 0.6);
716
+ border: 1px solid rgba(255, 255, 255, 0.1);
717
+ animation: scaleIn 0.3s ease;
718
+ }
719
+
720
+ @keyframes scaleIn {
721
+ from {
722
+ transform: scale(0.9);
723
+ opacity: 0;
724
+ }
725
+
726
+ to {
727
+ transform: scale(1);
728
+ opacity: 1;
729
+ }
730
+ }
731
+
732
+ .preview-header {
733
+ padding: 20px 30px;
734
+ background: rgba(255, 255, 255, 0.05);
735
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
736
+ display: flex;
737
+ justify-content: space-between;
738
+ align-items: center;
739
+ }
740
+
741
+ .preview-header h3 {
742
+ margin: 0;
743
+ color: var(--text-color);
744
+ font-size: 20px;
745
+ }
746
+
747
+ .close-preview {
748
+ background: rgba(255, 255, 255, 0.1);
749
+ border: none;
750
+ color: var(--text-color);
751
+ width: 36px;
752
+ height: 36px;
753
+ border-radius: 50%;
754
+ font-size: 20px;
755
+ cursor: pointer;
756
+ transition: all 0.2s;
757
+ }
758
+
759
+ .close-preview:hover {
760
+ background: rgba(255, 255, 255, 0.2);
761
+ transform: rotate(90deg);
762
+ }
763
+
764
+ .preview-body {
765
+ padding: 30px;
766
+ text-align: center;
767
+ max-height: 60vh;
768
+ overflow: auto;
769
+ }
770
+
771
+ .preview-image {
772
+ max-width: 100%;
773
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
774
+ }
775
+
776
+ .preview-footer {
777
+ padding: 20px 30px;
778
+ background: rgba(0, 0, 0, 0.3);
779
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
780
+ display: flex;
781
+ gap: 15px;
782
+ justify-content: center;
783
+ }
784
+
785
+ .preview-footer button {
786
+ padding: 12px 28px;
787
+ border: none;
788
+ border-radius: 8px;
789
+ font-size: 16px;
790
+ font-weight: 600;
791
+ cursor: pointer;
792
+ transition: all 0.3s;
793
+ }
794
+
795
+ .use-this-image {
796
+ background: linear-gradient(135deg, #2ecc71, #27ae60);
797
+ color: var(--text-color);
798
+ }
799
+
800
+ .use-this-image:hover {
801
+ background: linear-gradient(135deg, #27ae60, #229954);
802
+ transform: translateY(-2px);
803
+ box-shadow: 0 5px 15px rgba(46, 204, 113, 0.3);
804
+ }
805
+
806
+ .close-preview-btn {
807
+ background: rgba(255, 255, 255, 0.1);
808
+ color: var(--text-color);
809
+ }
810
+
811
+ .close-preview-btn:hover {
812
+ background: rgba(255, 255, 255, 0.2);
813
+ }
814
+
815
+ /* 滚动条美化 */
816
+ .image-grid-overlay::-webkit-scrollbar {
817
+ width: 8px;
818
+ }
819
+
820
+ .image-grid-overlay::-webkit-scrollbar-track {
821
+ background: rgba(255, 255, 255, 0.05);
822
+ border-radius: 4px;
823
+ }
824
+
825
+ .image-grid-overlay::-webkit-scrollbar-thumb {
826
+ background: rgba(52, 152, 219, 0.5);
827
+ border-radius: 4px;
828
+ }
829
+
830
+ .image-grid-overlay::-webkit-scrollbar-thumb:hover {
831
+ background: rgba(52, 152, 219, 0.7);
832
+ }
833
+
834
+ @media (max-width: 768px) {
835
+ .image-grid-overlay {
836
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
837
+ gap: 15px;
838
+ padding: 15px;
839
+ }
840
+
841
+ .image-thumbnail-overlay {
842
+ aspect-ratio: 4/3;
843
+ height: 120px;
844
+ }
845
+
846
+ .image-picker-actions {
847
+ flex-wrap: wrap;
848
+ justify-content: center;
849
+ }
850
+
851
+ .image-picker-actions button {
852
+ flex: 1;
853
+ min-width: 120px;
854
+ }
855
+ }
856
+
857
+ @media (max-width: 480px) {
858
+ .image-grid-overlay {
859
+ grid-template-columns: repeat(2, 1fr);
860
+ gap: 10px;
861
+ padding: 10px;
862
+ }
863
+
864
+ .image-thumbnail-overlay {
865
+ aspect-ratio: 1/1;
866
+ height: 100px;
867
+ }
868
+
869
+ .image-picker-header,
870
+ .image-filter-section,
871
+ .image-picker-actions {
872
+ padding: 15px;
873
+ }
874
+ }