local-deep-research 0.1.0__py3-none-any.whl

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 (56) hide show
  1. local_deep_research/__init__.py +24 -0
  2. local_deep_research/citation_handler.py +113 -0
  3. local_deep_research/config.py +166 -0
  4. local_deep_research/defaults/__init__.py +44 -0
  5. local_deep_research/defaults/llm_config.py +269 -0
  6. local_deep_research/defaults/local_collections.toml +47 -0
  7. local_deep_research/defaults/main.toml +57 -0
  8. local_deep_research/defaults/search_engines.toml +244 -0
  9. local_deep_research/local_collections.py +141 -0
  10. local_deep_research/main.py +113 -0
  11. local_deep_research/report_generator.py +206 -0
  12. local_deep_research/search_system.py +241 -0
  13. local_deep_research/utilties/__init__.py +0 -0
  14. local_deep_research/utilties/enums.py +9 -0
  15. local_deep_research/utilties/llm_utils.py +116 -0
  16. local_deep_research/utilties/search_utilities.py +115 -0
  17. local_deep_research/utilties/setup_utils.py +6 -0
  18. local_deep_research/web/__init__.py +2 -0
  19. local_deep_research/web/app.py +1209 -0
  20. local_deep_research/web/static/css/styles.css +1008 -0
  21. local_deep_research/web/static/js/app.js +2078 -0
  22. local_deep_research/web/templates/api_keys_config.html +82 -0
  23. local_deep_research/web/templates/collections_config.html +90 -0
  24. local_deep_research/web/templates/index.html +312 -0
  25. local_deep_research/web/templates/llm_config.html +120 -0
  26. local_deep_research/web/templates/main_config.html +89 -0
  27. local_deep_research/web/templates/search_engines_config.html +154 -0
  28. local_deep_research/web/templates/settings.html +519 -0
  29. local_deep_research/web/templates/settings_dashboard.html +207 -0
  30. local_deep_research/web_search_engines/__init__.py +0 -0
  31. local_deep_research/web_search_engines/engines/__init__.py +0 -0
  32. local_deep_research/web_search_engines/engines/full_search.py +128 -0
  33. local_deep_research/web_search_engines/engines/meta_search_engine.py +274 -0
  34. local_deep_research/web_search_engines/engines/search_engine_arxiv.py +367 -0
  35. local_deep_research/web_search_engines/engines/search_engine_brave.py +245 -0
  36. local_deep_research/web_search_engines/engines/search_engine_ddg.py +123 -0
  37. local_deep_research/web_search_engines/engines/search_engine_github.py +663 -0
  38. local_deep_research/web_search_engines/engines/search_engine_google_pse.py +283 -0
  39. local_deep_research/web_search_engines/engines/search_engine_guardian.py +337 -0
  40. local_deep_research/web_search_engines/engines/search_engine_local.py +901 -0
  41. local_deep_research/web_search_engines/engines/search_engine_local_all.py +153 -0
  42. local_deep_research/web_search_engines/engines/search_engine_medrxiv.py +623 -0
  43. local_deep_research/web_search_engines/engines/search_engine_pubmed.py +992 -0
  44. local_deep_research/web_search_engines/engines/search_engine_serpapi.py +230 -0
  45. local_deep_research/web_search_engines/engines/search_engine_wayback.py +474 -0
  46. local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +242 -0
  47. local_deep_research/web_search_engines/full_search.py +254 -0
  48. local_deep_research/web_search_engines/search_engine_base.py +197 -0
  49. local_deep_research/web_search_engines/search_engine_factory.py +233 -0
  50. local_deep_research/web_search_engines/search_engines_config.py +54 -0
  51. local_deep_research-0.1.0.dist-info/LICENSE +21 -0
  52. local_deep_research-0.1.0.dist-info/METADATA +328 -0
  53. local_deep_research-0.1.0.dist-info/RECORD +56 -0
  54. local_deep_research-0.1.0.dist-info/WHEEL +5 -0
  55. local_deep_research-0.1.0.dist-info/entry_points.txt +3 -0
  56. local_deep_research-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1008 @@
1
+ /* Modern AI-themed dark interface */
2
+ :root {
3
+ --bg-primary: #121212;
4
+ --bg-secondary: #1e1e2d;
5
+ --bg-tertiary: #2a2a3a;
6
+ --accent-primary: #6e4ff6;
7
+ --accent-secondary: #9179f0;
8
+ --accent-tertiary: #40bfff;
9
+ --text-primary: #f5f5f5;
10
+ --text-secondary: #c0c0cc;
11
+ --text-muted: #8a8aa0;
12
+ --border-color: #343452;
13
+ --success-color: #0acf97;
14
+ --warning-color: #f9bc0b;
15
+ --error-color: #fa5c7c;
16
+ --card-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
17
+ --glow-effect: 0 0 15px rgba(110, 79, 246, 0.3);
18
+ --gradient-bg: linear-gradient(135deg, #2a2a3a 0%, #1e1e2d 100%);
19
+ }
20
+
21
+ /* Reset and Base Styles */
22
+ * {
23
+ margin: 0;
24
+ padding: 0;
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ body {
29
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
30
+ background-color: var(--bg-primary);
31
+ color: var(--text-primary);
32
+ line-height: 1.6;
33
+ overflow-x: hidden;
34
+ }
35
+
36
+ a {
37
+ color: var(--accent-tertiary);
38
+ text-decoration: none;
39
+ transition: color 0.2s;
40
+ }
41
+
42
+ a:hover {
43
+ color: var(--accent-secondary);
44
+ }
45
+
46
+ /* Layout */
47
+ .app-container {
48
+ display: flex;
49
+ min-height: 100vh;
50
+ }
51
+
52
+ /* Sidebar */
53
+ .sidebar {
54
+ width: 240px;
55
+ background-color: var(--bg-secondary);
56
+ border-right: 1px solid var(--border-color);
57
+ display: flex;
58
+ flex-direction: column;
59
+ position: fixed;
60
+ height: 100vh;
61
+ z-index: 10;
62
+ }
63
+
64
+ .sidebar-header {
65
+ padding: 1.5rem;
66
+ border-bottom: 1px solid var(--border-color);
67
+ }
68
+
69
+ .sidebar-header h2 {
70
+ display: flex;
71
+ align-items: center;
72
+ font-weight: 600;
73
+ font-size: 1.25rem;
74
+ gap: 0.5rem;
75
+ color: var(--accent-secondary);
76
+ }
77
+
78
+ .sidebar-header h2 i {
79
+ color: var(--accent-primary);
80
+ }
81
+
82
+ .sidebar-nav {
83
+ flex: 1;
84
+ padding: 1rem 0;
85
+ }
86
+
87
+ .sidebar-nav ul {
88
+ list-style: none;
89
+ }
90
+
91
+ .sidebar-nav li {
92
+ padding: 0.75rem 1.5rem;
93
+ margin-bottom: 0.25rem;
94
+ cursor: pointer;
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 0.75rem;
98
+ color: var(--text-secondary);
99
+ border-left: 3px solid transparent;
100
+ transition: all 0.2s;
101
+ }
102
+
103
+ .sidebar-nav li i {
104
+ width: 20px;
105
+ }
106
+
107
+ .sidebar-nav li:hover {
108
+ background-color: var(--bg-tertiary);
109
+ color: var(--text-primary);
110
+ }
111
+
112
+ .sidebar-nav li.active {
113
+ color: var(--accent-primary);
114
+ background-color: rgba(110, 79, 246, 0.1);
115
+ border-left-color: var(--accent-primary);
116
+ }
117
+
118
+ .sidebar-footer {
119
+ padding: 1rem 1.5rem;
120
+ border-top: 1px solid var(--border-color);
121
+ color: var(--text-muted);
122
+ font-size: 0.875rem;
123
+ display: flex;
124
+ justify-content: center;
125
+ }
126
+
127
+ /* Main Content */
128
+ .main-content {
129
+ flex: 1;
130
+ padding: 1.0rem 2rem 2rem 2rem;
131
+ margin-left: 240px;
132
+ width: calc(100% - 240px);
133
+ }
134
+
135
+ .page {
136
+ display: none;
137
+ }
138
+
139
+ .page.active {
140
+ display: block;
141
+ animation: fadeIn 0.3s ease;
142
+ }
143
+
144
+ @keyframes fadeIn {
145
+ from { opacity: 0; }
146
+ to { opacity: 1; }
147
+ }
148
+
149
+ .page-header {
150
+ margin-bottom: 1.5rem;
151
+ }
152
+
153
+ .page-header h1 {
154
+ font-weight: 600;
155
+ font-size: 1.75rem;
156
+ color: var(--text-primary);
157
+ }
158
+
159
+ /* Cards */
160
+ .card {
161
+ background-color: var(--bg-secondary);
162
+ border-radius: 12px;
163
+ box-shadow: var(--card-shadow);
164
+ margin-bottom: 1.5rem;
165
+ overflow: hidden;
166
+ border: 1px solid var(--border-color);
167
+ }
168
+
169
+ .card-content {
170
+ padding: 1.5rem;
171
+ }
172
+
173
+ /* Form Elements */
174
+ .form-group {
175
+ margin-bottom: 1.5rem;
176
+ }
177
+
178
+ .form-group label {
179
+ display: block;
180
+ margin-bottom: 0.5rem;
181
+ font-weight: 500;
182
+ color: var(--text-secondary);
183
+ }
184
+
185
+ textarea, input[type="text"] {
186
+ width: 100%;
187
+ padding: 0.75rem;
188
+ border-radius: 8px;
189
+ border: 1px solid var(--border-color);
190
+ background-color: var(--bg-tertiary);
191
+ color: var(--text-primary);
192
+ font-family: inherit;
193
+ font-size: 0.95rem;
194
+ resize: vertical;
195
+ transition: border-color 0.2s, box-shadow 0.2s;
196
+ }
197
+
198
+ textarea:focus, input[type="text"]:focus {
199
+ outline: none;
200
+ border-color: var(--accent-primary);
201
+ box-shadow: 0 0 0 3px rgba(110, 79, 246, 0.2);
202
+ }
203
+
204
+ .btn {
205
+ display: inline-flex;
206
+ align-items: center;
207
+ justify-content: center;
208
+ gap: 0.5rem;
209
+ padding: 0.75rem 1.25rem;
210
+ border-radius: 8px;
211
+ font-weight: 500;
212
+ font-size: 0.95rem;
213
+ cursor: pointer;
214
+ transition: all 0.2s;
215
+ border: none;
216
+ }
217
+
218
+ .btn-sm {
219
+ padding: 0.5rem 1rem;
220
+ font-size: 0.85rem;
221
+ }
222
+
223
+ .btn-primary {
224
+ background-color: var(--accent-primary);
225
+ color: white;
226
+ }
227
+
228
+ .btn-primary:hover {
229
+ background-color: var(--accent-secondary);
230
+ box-shadow: var(--glow-effect);
231
+ }
232
+
233
+ .btn-outline {
234
+ background-color: transparent;
235
+ color: var(--accent-tertiary);
236
+ border: 1px solid var(--accent-tertiary);
237
+ }
238
+
239
+ .btn-outline:hover {
240
+ background-color: rgba(64, 191, 255, 0.1);
241
+ }
242
+
243
+ .delete-btn {
244
+ color: var(--error-color);
245
+ border-color: var(--error-color);
246
+ }
247
+
248
+ .delete-btn:hover {
249
+ background-color: rgba(250, 92, 124, 0.1);
250
+ }
251
+
252
+ .terminate-btn {
253
+ color: #e74c3c;
254
+ border-color: #e74c3c;
255
+ }
256
+
257
+ .terminate-btn:hover {
258
+ background-color: rgba(231, 76, 60, 0.1);
259
+ }
260
+
261
+ .btn:disabled {
262
+ opacity: 0.6;
263
+ cursor: not-allowed;
264
+ pointer-events: none;
265
+ }
266
+
267
+ .form-actions {
268
+ display: flex;
269
+ justify-content: flex-end;
270
+ }
271
+
272
+ /* Mode Selection */
273
+ .mode-selection {
274
+ display: flex;
275
+ gap: 1rem;
276
+ }
277
+
278
+ .mode-option {
279
+ flex: 1;
280
+ background-color: var(--bg-tertiary);
281
+ border-radius: 8px;
282
+ padding: 1.25rem;
283
+ border: 2px solid transparent;
284
+ cursor: pointer;
285
+ transition: all 0.2s;
286
+ display: flex;
287
+ align-items: center;
288
+ gap: 1rem;
289
+ }
290
+
291
+ .mode-option:hover {
292
+ background-color: var(--bg-primary);
293
+ }
294
+
295
+ .mode-option.active {
296
+ border-color: var (--accent-primary);
297
+ background-color: rgba(110, 79, 246, 0.1);
298
+ }
299
+
300
+ .mode-icon {
301
+ width: 40px;
302
+ height: 40px;
303
+ background-color: var(--accent-primary);
304
+ color: white;
305
+ border-radius: 50%;
306
+ display: flex;
307
+ align-items: center;
308
+ justify-content: center;
309
+ font-size: 1.2rem;
310
+ }
311
+
312
+ .mode-option.active .mode-icon {
313
+ background-color: var(--accent-secondary);
314
+ box-shadow: var(--glow-effect);
315
+ }
316
+
317
+ .mode-info h3 {
318
+ margin-bottom: 0.25rem;
319
+ color: var(--text-primary);
320
+ }
321
+
322
+ .mode-info p {
323
+ color: var(--text-muted);
324
+ font-size: 0.85rem;
325
+ }
326
+
327
+ /* Progress Bar */
328
+ .progress-container {
329
+ margin: 1.5rem 0;
330
+ display: flex;
331
+ align-items: center;
332
+ gap: 1rem;
333
+ }
334
+
335
+ .progress-bar {
336
+ flex: 1;
337
+ height: 12px;
338
+ background-color: var(--bg-tertiary);
339
+ border-radius: 6px;
340
+ overflow: hidden;
341
+ }
342
+
343
+ .progress-fill {
344
+ height: 100%;
345
+ width: 0%;
346
+ background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary));
347
+ border-radius: 6px;
348
+ transition: width 0.5s ease;
349
+ }
350
+
351
+ .progress-text {
352
+ width: 60px;
353
+ text-align: right;
354
+ font-weight: 600;
355
+ color: var(--accent-secondary);
356
+ }
357
+
358
+ .query-display {
359
+ margin-bottom: 1.5rem;
360
+ }
361
+
362
+ .query-display h3 {
363
+ color: var(--text-secondary);
364
+ font-size: 1rem;
365
+ margin-bottom: 0.5rem;
366
+ }
367
+
368
+ .query-display p {
369
+ color: var(--text-primary);
370
+ font-weight: 500;
371
+ }
372
+
373
+ .progress-info {
374
+ color: var(--text-secondary);
375
+ font-size: 0.9rem;
376
+ }
377
+
378
+ /* History List */
379
+ .history-list {
380
+ display: flex;
381
+ flex-direction: column;
382
+ gap: 1rem;
383
+ }
384
+
385
+ .history-item {
386
+ background-color: var(--bg-tertiary);
387
+ border-radius: 8px;
388
+ padding: 1rem;
389
+ border: 1px solid var(--border-color);
390
+ transition: all 0.2s;
391
+ cursor: pointer;
392
+ position: relative;
393
+ }
394
+
395
+ .history-item:hover {
396
+ border-color: var(--accent-tertiary);
397
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
398
+ }
399
+
400
+ .history-item-header {
401
+ display: flex;
402
+ justify-content: space-between;
403
+ align-items: center;
404
+ margin-bottom: 0.5rem;
405
+ }
406
+
407
+ .history-item-title {
408
+ font-weight: 500;
409
+ color: var(--text-primary);
410
+ }
411
+
412
+ .history-item-status {
413
+ font-size: 0.8rem;
414
+ padding: 0.25rem 0.5rem;
415
+ border-radius: 4px;
416
+ font-weight: 500;
417
+ }
418
+
419
+ .status-completed {
420
+ background-color: rgba(10, 207, 151, 0.15);
421
+ color: var(--success-color);
422
+ }
423
+
424
+ .status-in-progress {
425
+ background-color: rgba(249, 188, 11, 0.15);
426
+ color: var(--warning-color);
427
+ }
428
+
429
+ .status-failed {
430
+ background-color: rgba(250, 92, 124, 0.15);
431
+ color: var(--error-color);
432
+ }
433
+
434
+ .status-suspended {
435
+ color: #f39c12;
436
+ }
437
+
438
+ .status-terminating {
439
+ background-color: rgba(231, 76, 60, 0.15);
440
+ color: #e74c3c;
441
+ animation: pulse 1.5s infinite;
442
+ }
443
+
444
+ @keyframes pulse {
445
+ 0% { opacity: 0.7; }
446
+ 50% { opacity: 1; }
447
+ 100% { opacity: 0.7; }
448
+ }
449
+
450
+ .history-item-meta {
451
+ display: flex;
452
+ color: var(--text-muted);
453
+ font-size: 0.85rem;
454
+ margin-bottom: 0.75rem;
455
+ }
456
+
457
+ .history-item-date {
458
+ margin-right: 1rem;
459
+ }
460
+
461
+ .history-item-mode {
462
+ display: flex;
463
+ align-items: center;
464
+ gap: 0.25rem;
465
+ }
466
+
467
+ .history-item-actions {
468
+ display: flex;
469
+ justify-content: flex-end;
470
+ gap: 0.5rem;
471
+ position: relative;
472
+ z-index: 5;
473
+ }
474
+
475
+ .history-item-actions button {
476
+ position: relative;
477
+ z-index: 10;
478
+ }
479
+
480
+ /* Results Page */
481
+ .results-header {
482
+ display: flex;
483
+ justify-content: space-between;
484
+ align-items: center;
485
+ }
486
+
487
+ .results-metadata {
488
+ display: flex;
489
+ flex-wrap: wrap;
490
+ gap: 1rem;
491
+ margin-bottom: 1.5rem;
492
+ padding-bottom: 1rem;
493
+ border-bottom: 1px solid var(--border-color);
494
+ }
495
+
496
+ .metadata-item {
497
+ display: flex;
498
+ flex-direction: column;
499
+ }
500
+
501
+ .metadata-label {
502
+ font-size: 0.85rem;
503
+ color: var(--text-muted);
504
+ margin-bottom: 0.25rem;
505
+ }
506
+
507
+ .metadata-value {
508
+ color: var(--text-primary);
509
+ font-weight: 500;
510
+ }
511
+
512
+ .results-content {
513
+ line-height: 1.7;
514
+ }
515
+
516
+ .results-content h1 {
517
+ font-size: 1.75rem;
518
+ margin: 1.5rem 0 1rem;
519
+ color: var(--text-primary);
520
+ }
521
+
522
+ .results-content h2 {
523
+ font-size: 1.5rem;
524
+ margin: 1.25rem 0 0.75rem;
525
+ color: var(--accent-tertiary);
526
+ }
527
+
528
+ .results-content h3 {
529
+ font-size: 1.25rem;
530
+ margin: 1rem 0 0.5rem;
531
+ color: var(--accent-secondary);
532
+ }
533
+
534
+ .results-content p {
535
+ margin-bottom: 1rem;
536
+ color: var(--text-secondary);
537
+ }
538
+
539
+ .results-content ul,
540
+ .results-content ol {
541
+ margin-bottom: 1rem;
542
+ padding-left: 1.5rem;
543
+ color: var(--text-secondary);
544
+ }
545
+
546
+ .results-content li {
547
+ margin-bottom: 0.5rem;
548
+ }
549
+
550
+ .results-content code {
551
+ background-color: var(--bg-tertiary);
552
+ padding: 0.15rem 0.3rem;
553
+ border-radius: 4px;
554
+ font-family: 'SF Mono', 'Menlo', 'Monaco', 'Courier New', monospace;
555
+ font-size: 0.9em;
556
+ }
557
+
558
+ .results-content pre {
559
+ background-color: var(--bg-tertiary);
560
+ border-radius: 8px;
561
+ padding: 1rem;
562
+ margin-bottom: 1rem;
563
+ overflow-x: auto;
564
+ }
565
+
566
+ .results-content blockquote {
567
+ border-left: 3px solid var(--accent-primary);
568
+ padding-left: 1rem;
569
+ margin-left: 0;
570
+ margin-bottom: 1rem;
571
+ color: var(--text-muted);
572
+ }
573
+
574
+ .results-content table {
575
+ width: 100%;
576
+ border-collapse: collapse;
577
+ margin-bottom: 1rem;
578
+ }
579
+
580
+ .results-content th {
581
+ background-color: var(--bg-tertiary);
582
+ text-align: left;
583
+ padding: 0.75rem;
584
+ border-bottom: 2px solid var(--border-color);
585
+ color: var(--accent-tertiary);
586
+ }
587
+
588
+ .results-content td {
589
+ padding: 0.75rem;
590
+ border-bottom: 1px solid var(--border-color);
591
+ color: var(--text-secondary);
592
+ }
593
+
594
+ /* Research Details Page */
595
+ .research-metadata {
596
+ display: grid;
597
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
598
+ gap: 1.5rem;
599
+ margin-bottom: 1.5rem;
600
+ padding-bottom: 1rem;
601
+ border-bottom: 1px solid var(--border-color);
602
+ }
603
+
604
+ .detail-progress-container {
605
+ display: flex;
606
+ align-items: center;
607
+ gap: 0.75rem;
608
+ }
609
+
610
+ .detail-progress-bar {
611
+ flex: 1;
612
+ height: 8px;
613
+ background-color: var(--bg-tertiary);
614
+ border-radius: 4px;
615
+ overflow: hidden;
616
+ }
617
+
618
+ .detail-progress-fill {
619
+ height: 100%;
620
+ width: 0%;
621
+ background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary));
622
+ border-radius: 4px;
623
+ transition: width 0.5s ease;
624
+ }
625
+
626
+ .research-log-container {
627
+ margin-top: 1.5rem;
628
+ }
629
+
630
+ .research-log-container h3 {
631
+ margin-bottom: 1rem;
632
+ color: var(--text-secondary);
633
+ font-size: 1.1rem;
634
+ font-weight: 500;
635
+ }
636
+
637
+ .research-log {
638
+ max-height: 500px;
639
+ overflow-y: auto;
640
+ padding: 1rem;
641
+ background-color: var(--bg-tertiary);
642
+ border-radius: 8px;
643
+ border: 1px solid var(--border-color);
644
+ }
645
+
646
+ .log-entry {
647
+ padding: 0.75rem;
648
+ border-bottom: 1px solid var(--border-color);
649
+ display: flex;
650
+ gap: 1rem;
651
+ }
652
+
653
+ .log-entry:last-child {
654
+ border-bottom: none;
655
+ }
656
+
657
+ .log-entry-time {
658
+ font-size: 0.8rem;
659
+ color: var(--text-muted);
660
+ min-width: 80px;
661
+ }
662
+
663
+ .log-entry-content {
664
+ flex: 1;
665
+ }
666
+
667
+ .log-entry-message {
668
+ color: var(--text-secondary);
669
+ margin-bottom: 0.25rem;
670
+ }
671
+
672
+ .log-entry-progress {
673
+ font-size: 0.85rem;
674
+ color: var(--accent-secondary);
675
+ font-weight: 500;
676
+ }
677
+
678
+ .detail-actions {
679
+ margin-top: 1.5rem;
680
+ display: flex;
681
+ justify-content: center;
682
+ gap: 1rem;
683
+ }
684
+
685
+ .phase-highlight {
686
+ color: var(--accent-tertiary);
687
+ font-weight: 500;
688
+ }
689
+
690
+ .phase-init {
691
+ color: var(--accent-tertiary);
692
+ }
693
+
694
+ .phase-search {
695
+ color: var(--accent-secondary);
696
+ }
697
+
698
+ .phase-analysis {
699
+ color: var(--warning-color);
700
+ }
701
+
702
+ .phase-complete {
703
+ color: var(--success-color);
704
+ }
705
+
706
+ .phase-error {
707
+ color: var(--error-color);
708
+ }
709
+
710
+ .phase-termination {
711
+ color: #e74c3c;
712
+ font-weight: bold;
713
+ }
714
+
715
+ .empty-state {
716
+ padding: 2rem;
717
+ text-align: center;
718
+ color: var(--text-muted);
719
+ font-style: italic;
720
+ }
721
+
722
+ .error-message {
723
+ padding: 1rem;
724
+ background-color: rgba(250, 92, 124, 0.1);
725
+ border: 1px solid var(--error-color);
726
+ border-radius: 8px;
727
+ color: var(--error-color);
728
+ margin: 1rem 0;
729
+ font-size: 0.9rem;
730
+ }
731
+
732
+ /* Loading Spinner */
733
+ .loading-spinner {
734
+ padding: 2rem 0;
735
+ }
736
+
737
+ .loading-spinner.centered {
738
+ display: flex;
739
+ justify-content: center;
740
+ align-items: center;
741
+ }
742
+
743
+ .spinner {
744
+ width: 40px;
745
+ height: 40px;
746
+ border: 4px solid rgba(110, 79, 246, 0.2);
747
+ border-left-color: var(--accent-primary);
748
+ border-radius: 50%;
749
+ animation: spin 1s linear infinite;
750
+ }
751
+
752
+ @keyframes spin {
753
+ to { transform: rotate(360deg); }
754
+ }
755
+
756
+ /* Mobile Tab Bar */
757
+ .mobile-tab-bar {
758
+ display: none; /* Hidden by default */
759
+ position: fixed;
760
+ bottom: 0;
761
+ left: 0;
762
+ right: 0;
763
+ height: 60px;
764
+ background-color: var(--bg-secondary);
765
+ border-top: 1px solid var(--border-color);
766
+ z-index: 1000;
767
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.2);
768
+ }
769
+
770
+ .mobile-tab-bar ul {
771
+ display: flex;
772
+ height: 100%;
773
+ list-style: none;
774
+ padding: 0;
775
+ margin: 0;
776
+ width: 100%;
777
+ }
778
+
779
+ .mobile-tab-bar li {
780
+ flex: 1;
781
+ display: flex;
782
+ flex-direction: column;
783
+ justify-content: center;
784
+ align-items: center;
785
+ cursor: pointer;
786
+ color: var(--text-secondary);
787
+ transition: all 0.2s;
788
+ padding: 0.5rem 0;
789
+ min-width: 90px;
790
+ }
791
+
792
+ .mobile-tab-bar li i {
793
+ font-size: 1.3rem;
794
+ margin-bottom: 8px;
795
+ }
796
+
797
+ .mobile-tab-bar li span {
798
+ font-size: 0.75rem;
799
+ text-align: center;
800
+ width: 100%;
801
+ }
802
+
803
+ .mobile-tab-bar li.active {
804
+ color: var(--accent-primary);
805
+ }
806
+
807
+ .mobile-tab-bar li:hover {
808
+ color: var(--text-primary);
809
+ }
810
+
811
+ /* External link styling for sidebar and mobile navigation - more subtle */
812
+ .sidebar-nav ul li.external-link {
813
+ color: var(--text-primary);
814
+ border-left: 3px solid #607d8b;
815
+ margin-bottom: 10px;
816
+ padding-left: 17px;
817
+ opacity: 0.75;
818
+ }
819
+
820
+ .sidebar-nav ul li.external-link:hover {
821
+ background-color: rgba(96, 125, 139, 0.1);
822
+ opacity: 1;
823
+ cursor: pointer;
824
+ }
825
+
826
+ .mobile-tab-bar ul li.external-link {
827
+ color: var(--text-primary);
828
+ opacity: 0.75;
829
+ }
830
+
831
+ .mobile-tab-bar ul li.external-link i {
832
+ color: var(--text-primary);
833
+ }
834
+
835
+ .mobile-tab-bar ul li.external-link:hover {
836
+ opacity: 1;
837
+ }
838
+
839
+ /* Responsive */
840
+ @media (max-width: 991px) {
841
+ .sidebar {
842
+ width: 60px;
843
+ overflow: hidden;
844
+ }
845
+
846
+ /* Hide all text in the logo and center icon */
847
+ .sidebar-header {
848
+ padding: 1rem 0;
849
+ text-align: center;
850
+ display: flex;
851
+ align-items: center;
852
+ justify-content: center;
853
+ height: 60px;
854
+ }
855
+
856
+ .sidebar-header h2 {
857
+ font-size: 0;
858
+ display: flex;
859
+ justify-content: center;
860
+ width: 100%;
861
+ }
862
+
863
+ .sidebar-header h2 i {
864
+ font-size: 1.4rem;
865
+ display: flex;
866
+ align-items: center;
867
+ justify-content: center;
868
+ }
869
+
870
+ /* Hide all text in nav items and center icons */
871
+ .sidebar-nav {
872
+ display: flex;
873
+ flex-direction: column;
874
+ padding-top: 0.5rem;
875
+ }
876
+
877
+ .sidebar-nav ul {
878
+ width: 100%;
879
+ }
880
+
881
+ .sidebar-nav li {
882
+ text-indent: -9999px;
883
+ white-space: nowrap;
884
+ padding: 1rem 0;
885
+ text-align: center;
886
+ height: 60px;
887
+ display: flex;
888
+ align-items: center;
889
+ justify-content: center;
890
+ }
891
+
892
+ .sidebar-nav li i {
893
+ text-indent: 0;
894
+ margin: 0;
895
+ font-size: 1.3rem;
896
+ display: flex;
897
+ align-items: center;
898
+ justify-content: center;
899
+ }
900
+
901
+ /* Active state fix for icon view */
902
+ .sidebar-nav li.active {
903
+ border-left-width: 3px;
904
+ }
905
+
906
+ /* Hide footer */
907
+ .sidebar-footer {
908
+ display: none;
909
+ }
910
+
911
+ /* Adjust main content */
912
+ .main-content {
913
+ margin-left: 60px;
914
+ width: calc(100% - 60px);
915
+ }
916
+
917
+ .mode-selection {
918
+ flex-direction: column;
919
+ }
920
+ }
921
+
922
+ @media (max-width: 767px) {
923
+ body {
924
+ padding-bottom: 60px; /* Add padding to body for the tab bar */
925
+ }
926
+
927
+ .main-content {
928
+ padding: 1rem;
929
+ padding-bottom: 70px; /* Add padding for the tab bar */
930
+ margin-left: 0;
931
+ width: 100%;
932
+ }
933
+
934
+ .sidebar {
935
+ width: 0;
936
+ transform: translateX(-100%);
937
+ }
938
+
939
+ .sidebar.active {
940
+ width: 240px;
941
+ transform: translateX(0);
942
+ }
943
+
944
+ /* Restore text in logo when sidebar is active on mobile */
945
+ .sidebar.active .sidebar-header h2 {
946
+ font-size: 1.25rem;
947
+ }
948
+
949
+ /* Restore text in nav items when sidebar is active on mobile */
950
+ .sidebar.active .sidebar-nav li {
951
+ text-indent: 0;
952
+ padding: 0.75rem 1.5rem;
953
+ text-align: left;
954
+ }
955
+
956
+ .sidebar.active .sidebar-nav li i {
957
+ display: inline;
958
+ width: 20px;
959
+ margin-right: 0.75rem;
960
+ font-size: 1rem;
961
+ }
962
+
963
+ .sidebar.active .sidebar-footer {
964
+ display: flex;
965
+ }
966
+
967
+ /* Show mobile tab bar */
968
+ .mobile-tab-bar {
969
+ display: flex !important; /* Use !important to ensure it displays */
970
+ }
971
+ }
972
+
973
+ .progress-status {
974
+ margin-bottom: 1.25rem;
975
+ padding: 0.5rem 0;
976
+ font-weight: 500;
977
+ }
978
+
979
+ .progress-actions {
980
+ display: flex;
981
+ justify-content: center;
982
+ margin-top: 1rem;
983
+ }
984
+
985
+ .file-path {
986
+ background-color: #1a1a1a;
987
+ padding: 10px;
988
+ border-radius: 4px;
989
+ font-family: monospace;
990
+ margin: 15px 0;
991
+ word-break: break-all;
992
+ border: 1px solid #333;
993
+ }
994
+
995
+ .config-example {
996
+ background-color: #0a0a0a;
997
+ padding: 15px;
998
+ border-radius: 4px;
999
+ font-family: monospace;
1000
+ margin: 15px 0;
1001
+ overflow-x: auto;
1002
+ border: 1px solid #333;
1003
+ color: #e6e6e6;
1004
+ }
1005
+
1006
+ .mt-4 {
1007
+ margin-top: 20px;
1008
+ }