Ruhivig65 commited on
Commit
9ee47f9
·
verified ·
1 Parent(s): f2edce4

Upload style.css

Browse files
Files changed (1) hide show
  1. app/static/css/style.css +617 -0
app/static/css/style.css CHANGED
@@ -0,0 +1,617 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ============================================
2
+ Novel Scraper Pro - Complete Styles
3
+ ============================================ */
4
+
5
+ /* --- CSS Variables (Theme) --- */
6
+ :root {
7
+ --bg-primary: #0f1117;
8
+ --bg-secondary: #1a1d28;
9
+ --bg-card: #1e2130;
10
+ --bg-input: #252838;
11
+ --bg-hover: #2a2d42;
12
+
13
+ --text-primary: #e4e6f0;
14
+ --text-secondary: #9498ae;
15
+ --text-muted: #6b6f85;
16
+
17
+ --accent-blue: #4f8df5;
18
+ --accent-green: #34d399;
19
+ --accent-red: #f87171;
20
+ --accent-yellow: #fbbf24;
21
+ --accent-purple: #a78bfa;
22
+ --accent-orange: #fb923c;
23
+
24
+ --border-color: #2d3148;
25
+ --border-radius: 12px;
26
+ --shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
27
+
28
+ --font-main: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
29
+ --font-mono: 'JetBrains Mono', 'Courier New', monospace;
30
+ }
31
+
32
+ /* --- Reset --- */
33
+ *, *::before, *::after {
34
+ margin: 0;
35
+ padding: 0;
36
+ box-sizing: border-box;
37
+ }
38
+
39
+ body {
40
+ font-family: var(--font-main);
41
+ background-color: var(--bg-primary);
42
+ color: var(--text-primary);
43
+ line-height: 1.6;
44
+ min-height: 100vh;
45
+ }
46
+
47
+ /* --- Header --- */
48
+ .header {
49
+ background: linear-gradient(135deg, var(--bg-secondary), var(--bg-card));
50
+ border-bottom: 1px solid var(--border-color);
51
+ padding: 16px 24px;
52
+ position: sticky;
53
+ top: 0;
54
+ z-index: 100;
55
+ backdrop-filter: blur(10px);
56
+ }
57
+
58
+ .header-content {
59
+ max-width: 1400px;
60
+ margin: 0 auto;
61
+ display: flex;
62
+ justify-content: space-between;
63
+ align-items: center;
64
+ }
65
+
66
+ .header h1 {
67
+ font-size: 1.5rem;
68
+ font-weight: 700;
69
+ background: linear-gradient(135deg, var(--accent-blue), var(--accent-purple));
70
+ -webkit-background-clip: text;
71
+ -webkit-text-fill-color: transparent;
72
+ background-clip: text;
73
+ }
74
+
75
+ .header-status {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 8px;
79
+ font-size: 0.85rem;
80
+ color: var(--text-secondary);
81
+ }
82
+
83
+ .status-dot {
84
+ width: 10px;
85
+ height: 10px;
86
+ border-radius: 50%;
87
+ background: var(--accent-yellow);
88
+ animation: pulse 2s infinite;
89
+ }
90
+
91
+ .status-dot.active {
92
+ background: var(--accent-green);
93
+ }
94
+
95
+ .status-dot.error {
96
+ background: var(--accent-red);
97
+ }
98
+
99
+ @keyframes pulse {
100
+ 0%, 100% { opacity: 1; }
101
+ 50% { opacity: 0.5; }
102
+ }
103
+
104
+ /* --- Container --- */
105
+ .container {
106
+ max-width: 1400px;
107
+ margin: 0 auto;
108
+ padding: 24px;
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: 24px;
112
+ }
113
+
114
+ /* --- Cards --- */
115
+ .card {
116
+ background: var(--bg-card);
117
+ border: 1px solid var(--border-color);
118
+ border-radius: var(--border-radius);
119
+ padding: 24px;
120
+ box-shadow: var(--shadow);
121
+ }
122
+
123
+ .card-header {
124
+ display: flex;
125
+ justify-content: space-between;
126
+ align-items: center;
127
+ margin-bottom: 20px;
128
+ flex-wrap: wrap;
129
+ gap: 12px;
130
+ }
131
+
132
+ .card-header h2 {
133
+ font-size: 1.2rem;
134
+ font-weight: 600;
135
+ }
136
+
137
+ /* --- Forms --- */
138
+ .form-grid {
139
+ display: grid;
140
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
141
+ gap: 16px;
142
+ margin-bottom: 20px;
143
+ }
144
+
145
+ .form-group {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: 6px;
149
+ }
150
+
151
+ .form-group label {
152
+ font-size: 0.85rem;
153
+ font-weight: 500;
154
+ color: var(--text-secondary);
155
+ }
156
+
157
+ .optional {
158
+ color: var(--text-muted);
159
+ font-weight: 400;
160
+ }
161
+
162
+ .form-group input,
163
+ .form-group textarea,
164
+ .form-group select {
165
+ background: var(--bg-input);
166
+ border: 1px solid var(--border-color);
167
+ border-radius: 8px;
168
+ padding: 10px 14px;
169
+ color: var(--text-primary);
170
+ font-family: var(--font-main);
171
+ font-size: 0.9rem;
172
+ transition: border-color 0.2s, box-shadow 0.2s;
173
+ }
174
+
175
+ .form-group input:focus,
176
+ .form-group textarea:focus {
177
+ outline: none;
178
+ border-color: var(--accent-blue);
179
+ box-shadow: 0 0 0 3px rgba(79, 141, 245, 0.15);
180
+ }
181
+
182
+ .form-group textarea {
183
+ resize: vertical;
184
+ font-family: var(--font-mono);
185
+ font-size: 0.85rem;
186
+ }
187
+
188
+ .form-row {
189
+ display: flex;
190
+ gap: 12px;
191
+ }
192
+
193
+ .form-row input {
194
+ flex: 1;
195
+ background: var(--bg-input);
196
+ border: 1px solid var(--border-color);
197
+ border-radius: 8px;
198
+ padding: 10px 14px;
199
+ color: var(--text-primary);
200
+ font-size: 0.9rem;
201
+ }
202
+
203
+ /* --- Buttons --- */
204
+ .btn {
205
+ display: inline-flex;
206
+ align-items: center;
207
+ gap: 6px;
208
+ padding: 10px 20px;
209
+ border: none;
210
+ border-radius: 8px;
211
+ font-family: var(--font-main);
212
+ font-size: 0.9rem;
213
+ font-weight: 500;
214
+ cursor: pointer;
215
+ transition: all 0.2s;
216
+ text-decoration: none;
217
+ }
218
+
219
+ .btn:hover {
220
+ transform: translateY(-1px);
221
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
222
+ }
223
+
224
+ .btn:active {
225
+ transform: translateY(0);
226
+ }
227
+
228
+ .btn-primary {
229
+ background: linear-gradient(135deg, var(--accent-blue), #3b7de0);
230
+ color: white;
231
+ }
232
+
233
+ .btn-success {
234
+ background: linear-gradient(135deg, var(--accent-green), #2db88a);
235
+ color: #0f1117;
236
+ }
237
+
238
+ .btn-danger {
239
+ background: linear-gradient(135deg, var(--accent-red), #e05252);
240
+ color: white;
241
+ }
242
+
243
+ .btn-warning {
244
+ background: linear-gradient(135deg, var(--accent-yellow), #e5a91a);
245
+ color: #0f1117;
246
+ }
247
+
248
+ .btn-secondary {
249
+ background: var(--bg-hover);
250
+ color: var(--text-secondary);
251
+ border: 1px solid var(--border-color);
252
+ }
253
+
254
+ .btn-sm {
255
+ padding: 6px 14px;
256
+ font-size: 0.8rem;
257
+ }
258
+
259
+ .control-buttons {
260
+ display: flex;
261
+ gap: 8px;
262
+ flex-wrap: wrap;
263
+ }
264
+
265
+ /* --- System Info --- */
266
+ .system-info {
267
+ display: flex;
268
+ gap: 24px;
269
+ flex-wrap: wrap;
270
+ padding: 12px 16px;
271
+ background: var(--bg-input);
272
+ border-radius: 8px;
273
+ }
274
+
275
+ .info-item {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 6px;
279
+ }
280
+
281
+ .info-label {
282
+ color: var(--text-muted);
283
+ font-size: 0.85rem;
284
+ }
285
+
286
+ .info-value {
287
+ color: var(--accent-blue);
288
+ font-weight: 600;
289
+ font-family: var(--font-mono);
290
+ }
291
+
292
+ /* --- Novels Grid --- */
293
+ .novels-grid {
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 12px;
297
+ }
298
+
299
+ .empty-state {
300
+ text-align: center;
301
+ padding: 40px;
302
+ color: var(--text-muted);
303
+ }
304
+
305
+ /* --- Novel Card --- */
306
+ .novel-card {
307
+ background: var(--bg-input);
308
+ border: 1px solid var(--border-color);
309
+ border-radius: 10px;
310
+ padding: 16px 20px;
311
+ display: flex;
312
+ justify-content: space-between;
313
+ align-items: center;
314
+ gap: 16px;
315
+ flex-wrap: wrap;
316
+ transition: border-color 0.2s;
317
+ }
318
+
319
+ .novel-card:hover {
320
+ border-color: var(--accent-blue);
321
+ }
322
+
323
+ .novel-card.status-scraping {
324
+ border-left: 4px solid var(--accent-green);
325
+ }
326
+
327
+ .novel-card.status-queued {
328
+ border-left: 4px solid var(--text-muted);
329
+ }
330
+
331
+ .novel-card.status-paused_captcha {
332
+ border-left: 4px solid var(--accent-yellow);
333
+ animation: captcha-pulse 2s infinite;
334
+ }
335
+
336
+ .novel-card.status-completed {
337
+ border-left: 4px solid var(--accent-blue);
338
+ }
339
+
340
+ .novel-card.status-failed,
341
+ .novel-card.status-paused_error {
342
+ border-left: 4px solid var(--accent-red);
343
+ }
344
+
345
+ @keyframes captcha-pulse {
346
+ 0%, 100% { border-left-color: var(--accent-yellow); }
347
+ 50% { border-left-color: var(--accent-orange); }
348
+ }
349
+
350
+ .novel-info {
351
+ flex: 1;
352
+ min-width: 200px;
353
+ }
354
+
355
+ .novel-title {
356
+ font-size: 1rem;
357
+ font-weight: 600;
358
+ margin-bottom: 4px;
359
+ }
360
+
361
+ .novel-meta {
362
+ display: flex;
363
+ gap: 16px;
364
+ flex-wrap: wrap;
365
+ font-size: 0.8rem;
366
+ color: var(--text-secondary);
367
+ }
368
+
369
+ .novel-meta span {
370
+ display: flex;
371
+ align-items: center;
372
+ gap: 4px;
373
+ }
374
+
375
+ .novel-status-badge {
376
+ display: inline-flex;
377
+ align-items: center;
378
+ gap: 4px;
379
+ padding: 4px 12px;
380
+ border-radius: 20px;
381
+ font-size: 0.75rem;
382
+ font-weight: 600;
383
+ text-transform: uppercase;
384
+ letter-spacing: 0.5px;
385
+ }
386
+
387
+ .badge-queued { background: rgba(107, 111, 133, 0.2); color: var(--text-muted); }
388
+ .badge-logging_in { background: rgba(79, 141, 245, 0.2); color: var(--accent-blue); }
389
+ .badge-scraping { background: rgba(52, 211, 153, 0.2); color: var(--accent-green); }
390
+ .badge-paused_captcha { background: rgba(251, 191, 36, 0.2); color: var(--accent-yellow); }
391
+ .badge-paused_error { background: rgba(248, 113, 113, 0.2); color: var(--accent-red); }
392
+ .badge-completed { background: rgba(167, 139, 250, 0.2); color: var(--accent-purple); }
393
+ .badge-failed { background: rgba(248, 113, 113, 0.2); color: var(--accent-red); }
394
+
395
+ .novel-message {
396
+ font-size: 0.8rem;
397
+ color: var(--text-muted);
398
+ margin-top: 4px;
399
+ font-family: var(--font-mono);
400
+ }
401
+
402
+ .novel-actions {
403
+ display: flex;
404
+ gap: 8px;
405
+ flex-wrap: wrap;
406
+ }
407
+
408
+ /* --- Alert Banner --- */
409
+ .alert-banner {
410
+ background: linear-gradient(135deg, rgba(251, 191, 36, 0.15), rgba(248, 113, 113, 0.15));
411
+ border: 1px solid var(--accent-yellow);
412
+ border-radius: var(--border-radius);
413
+ padding: 16px 20px;
414
+ animation: alert-glow 2s infinite;
415
+ }
416
+
417
+ @keyframes alert-glow {
418
+ 0%, 100% { box-shadow: 0 0 10px rgba(251, 191, 36, 0.2); }
419
+ 50% { box-shadow: 0 0 25px rgba(251, 191, 36, 0.4); }
420
+ }
421
+
422
+ .alert-content {
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 12px;
426
+ flex-wrap: wrap;
427
+ }
428
+
429
+ .alert-icon {
430
+ font-size: 1.5rem;
431
+ }
432
+
433
+ .alert-text {
434
+ flex: 1;
435
+ font-weight: 500;
436
+ color: var(--accent-yellow);
437
+ }
438
+
439
+ /* --- Intervention Section --- */
440
+ .intervention-panel {
441
+ background: var(--bg-input);
442
+ border: 2px solid var(--accent-yellow);
443
+ border-radius: 10px;
444
+ padding: 20px;
445
+ margin-bottom: 16px;
446
+ }
447
+
448
+ .intervention-header {
449
+ display: flex;
450
+ justify-content: space-between;
451
+ align-items: center;
452
+ margin-bottom: 16px;
453
+ flex-wrap: wrap;
454
+ gap: 12px;
455
+ }
456
+
457
+ .intervention-header h3 {
458
+ color: var(--accent-yellow);
459
+ }
460
+
461
+ .screenshot-container {
462
+ position: relative;
463
+ display: inline-block;
464
+ border: 2px solid var(--border-color);
465
+ border-radius: 8px;
466
+ overflow: hidden;
467
+ cursor: crosshair;
468
+ max-width: 100%;
469
+ }
470
+
471
+ .screenshot-container img {
472
+ display: block;
473
+ max-width: 100%;
474
+ height: auto;
475
+ }
476
+
477
+ .click-indicator {
478
+ position: absolute;
479
+ width: 20px;
480
+ height: 20px;
481
+ border: 3px solid var(--accent-red);
482
+ border-radius: 50%;
483
+ transform: translate(-50%, -50%);
484
+ pointer-events: none;
485
+ animation: click-ring 0.5s ease-out;
486
+ }
487
+
488
+ @keyframes click-ring {
489
+ from { width: 40px; height: 40px; opacity: 0.8; }
490
+ to { width: 20px; height: 20px; opacity: 1; }
491
+ }
492
+
493
+ .intervention-actions {
494
+ margin-top: 16px;
495
+ display: flex;
496
+ gap: 8px;
497
+ flex-wrap: wrap;
498
+ align-items: center;
499
+ }
500
+
501
+ .intervention-input {
502
+ display: flex;
503
+ gap: 8px;
504
+ align-items: center;
505
+ margin-top: 12px;
506
+ }
507
+
508
+ .intervention-input input {
509
+ background: var(--bg-secondary);
510
+ border: 1px solid var(--border-color);
511
+ border-radius: 8px;
512
+ padding: 8px 12px;
513
+ color: var(--text-primary);
514
+ font-size: 0.9rem;
515
+ width: 200px;
516
+ }
517
+
518
+ /* --- Toast Notifications --- */
519
+ .toast-container {
520
+ position: fixed;
521
+ bottom: 24px;
522
+ right: 24px;
523
+ display: flex;
524
+ flex-direction: column;
525
+ gap: 8px;
526
+ z-index: 1000;
527
+ }
528
+
529
+ .toast {
530
+ background: var(--bg-card);
531
+ border: 1px solid var(--border-color);
532
+ border-radius: 10px;
533
+ padding: 12px 20px;
534
+ min-width: 280px;
535
+ max-width: 420px;
536
+ box-shadow: var(--shadow);
537
+ display: flex;
538
+ align-items: center;
539
+ gap: 10px;
540
+ animation: toast-in 0.3s ease;
541
+ }
542
+
543
+ .toast.toast-success { border-left: 4px solid var(--accent-green); }
544
+ .toast.toast-error { border-left: 4px solid var(--accent-red); }
545
+ .toast.toast-warning { border-left: 4px solid var(--accent-yellow); }
546
+ .toast.toast-info { border-left: 4px solid var(--accent-blue); }
547
+
548
+ .toast-message {
549
+ flex: 1;
550
+ font-size: 0.85rem;
551
+ }
552
+
553
+ .toast-close {
554
+ background: none;
555
+ border: none;
556
+ color: var(--text-muted);
557
+ cursor: pointer;
558
+ font-size: 1.1rem;
559
+ padding: 4px;
560
+ }
561
+
562
+ @keyframes toast-in {
563
+ from { transform: translateX(100%); opacity: 0; }
564
+ to { transform: translateX(0); opacity: 1; }
565
+ }
566
+
567
+ @keyframes toast-out {
568
+ from { transform: translateX(0); opacity: 1; }
569
+ to { transform: translateX(100%); opacity: 0; }
570
+ }
571
+
572
+ /* --- Scrollbar --- */
573
+ ::-webkit-scrollbar {
574
+ width: 8px;
575
+ }
576
+
577
+ ::-webkit-scrollbar-track {
578
+ background: var(--bg-primary);
579
+ }
580
+
581
+ ::-webkit-scrollbar-thumb {
582
+ background: var(--border-color);
583
+ border-radius: 4px;
584
+ }
585
+
586
+ ::-webkit-scrollbar-thumb:hover {
587
+ background: var(--text-muted);
588
+ }
589
+
590
+ /* --- Responsive --- */
591
+ @media (max-width: 768px) {
592
+ .container {
593
+ padding: 12px;
594
+ }
595
+
596
+ .card {
597
+ padding: 16px;
598
+ }
599
+
600
+ .header-content {
601
+ flex-direction: column;
602
+ gap: 8px;
603
+ }
604
+
605
+ .form-grid {
606
+ grid-template-columns: 1fr;
607
+ }
608
+
609
+ .novel-card {
610
+ flex-direction: column;
611
+ align-items: flex-start;
612
+ }
613
+
614
+ .form-row {
615
+ flex-direction: column;
616
+ }
617
+ }