local-deep-research 0.1.26__py3-none-any.whl → 0.2.2__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 (140) hide show
  1. local_deep_research/__init__.py +23 -22
  2. local_deep_research/__main__.py +16 -0
  3. local_deep_research/advanced_search_system/__init__.py +7 -0
  4. local_deep_research/advanced_search_system/filters/__init__.py +8 -0
  5. local_deep_research/advanced_search_system/filters/base_filter.py +38 -0
  6. local_deep_research/advanced_search_system/filters/cross_engine_filter.py +200 -0
  7. local_deep_research/advanced_search_system/findings/base_findings.py +81 -0
  8. local_deep_research/advanced_search_system/findings/repository.py +452 -0
  9. local_deep_research/advanced_search_system/knowledge/__init__.py +1 -0
  10. local_deep_research/advanced_search_system/knowledge/base_knowledge.py +151 -0
  11. local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +159 -0
  12. local_deep_research/advanced_search_system/questions/__init__.py +1 -0
  13. local_deep_research/advanced_search_system/questions/base_question.py +64 -0
  14. local_deep_research/advanced_search_system/questions/decomposition_question.py +445 -0
  15. local_deep_research/advanced_search_system/questions/standard_question.py +119 -0
  16. local_deep_research/advanced_search_system/repositories/__init__.py +7 -0
  17. local_deep_research/advanced_search_system/strategies/__init__.py +1 -0
  18. local_deep_research/advanced_search_system/strategies/base_strategy.py +118 -0
  19. local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +450 -0
  20. local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +312 -0
  21. local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +270 -0
  22. local_deep_research/advanced_search_system/strategies/standard_strategy.py +300 -0
  23. local_deep_research/advanced_search_system/tools/__init__.py +1 -0
  24. local_deep_research/advanced_search_system/tools/base_tool.py +100 -0
  25. local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +1 -0
  26. local_deep_research/advanced_search_system/tools/question_tools/__init__.py +1 -0
  27. local_deep_research/advanced_search_system/tools/search_tools/__init__.py +1 -0
  28. local_deep_research/api/__init__.py +5 -5
  29. local_deep_research/api/research_functions.py +154 -160
  30. local_deep_research/app.py +8 -0
  31. local_deep_research/citation_handler.py +25 -16
  32. local_deep_research/{config.py → config/config_files.py} +102 -110
  33. local_deep_research/config/llm_config.py +472 -0
  34. local_deep_research/config/search_config.py +77 -0
  35. local_deep_research/defaults/__init__.py +10 -5
  36. local_deep_research/defaults/main.toml +2 -2
  37. local_deep_research/defaults/search_engines.toml +60 -34
  38. local_deep_research/main.py +121 -19
  39. local_deep_research/migrate_db.py +147 -0
  40. local_deep_research/report_generator.py +87 -45
  41. local_deep_research/search_system.py +153 -283
  42. local_deep_research/setup_data_dir.py +35 -0
  43. local_deep_research/test_migration.py +178 -0
  44. local_deep_research/utilities/__init__.py +0 -0
  45. local_deep_research/utilities/db_utils.py +49 -0
  46. local_deep_research/{utilties → utilities}/enums.py +2 -2
  47. local_deep_research/{utilties → utilities}/llm_utils.py +63 -29
  48. local_deep_research/utilities/search_utilities.py +242 -0
  49. local_deep_research/{utilties → utilities}/setup_utils.py +4 -2
  50. local_deep_research/web/__init__.py +0 -1
  51. local_deep_research/web/app.py +86 -1709
  52. local_deep_research/web/app_factory.py +289 -0
  53. local_deep_research/web/database/README.md +70 -0
  54. local_deep_research/web/database/migrate_to_ldr_db.py +289 -0
  55. local_deep_research/web/database/migrations.py +447 -0
  56. local_deep_research/web/database/models.py +117 -0
  57. local_deep_research/web/database/schema_upgrade.py +107 -0
  58. local_deep_research/web/models/database.py +294 -0
  59. local_deep_research/web/models/settings.py +94 -0
  60. local_deep_research/web/routes/api_routes.py +559 -0
  61. local_deep_research/web/routes/history_routes.py +354 -0
  62. local_deep_research/web/routes/research_routes.py +715 -0
  63. local_deep_research/web/routes/settings_routes.py +1583 -0
  64. local_deep_research/web/services/research_service.py +947 -0
  65. local_deep_research/web/services/resource_service.py +149 -0
  66. local_deep_research/web/services/settings_manager.py +669 -0
  67. local_deep_research/web/services/settings_service.py +187 -0
  68. local_deep_research/web/services/socket_service.py +210 -0
  69. local_deep_research/web/static/css/custom_dropdown.css +277 -0
  70. local_deep_research/web/static/css/settings.css +1223 -0
  71. local_deep_research/web/static/css/styles.css +525 -48
  72. local_deep_research/web/static/js/components/custom_dropdown.js +428 -0
  73. local_deep_research/web/static/js/components/detail.js +348 -0
  74. local_deep_research/web/static/js/components/fallback/formatting.js +122 -0
  75. local_deep_research/web/static/js/components/fallback/ui.js +215 -0
  76. local_deep_research/web/static/js/components/history.js +487 -0
  77. local_deep_research/web/static/js/components/logpanel.js +949 -0
  78. local_deep_research/web/static/js/components/progress.js +1107 -0
  79. local_deep_research/web/static/js/components/research.js +1865 -0
  80. local_deep_research/web/static/js/components/results.js +766 -0
  81. local_deep_research/web/static/js/components/settings.js +3981 -0
  82. local_deep_research/web/static/js/components/settings_sync.js +106 -0
  83. local_deep_research/web/static/js/main.js +226 -0
  84. local_deep_research/web/static/js/services/api.js +253 -0
  85. local_deep_research/web/static/js/services/audio.js +31 -0
  86. local_deep_research/web/static/js/services/formatting.js +119 -0
  87. local_deep_research/web/static/js/services/pdf.js +622 -0
  88. local_deep_research/web/static/js/services/socket.js +882 -0
  89. local_deep_research/web/static/js/services/ui.js +546 -0
  90. local_deep_research/web/templates/base.html +72 -0
  91. local_deep_research/web/templates/components/custom_dropdown.html +47 -0
  92. local_deep_research/web/templates/components/log_panel.html +32 -0
  93. local_deep_research/web/templates/components/mobile_nav.html +22 -0
  94. local_deep_research/web/templates/components/settings_form.html +299 -0
  95. local_deep_research/web/templates/components/sidebar.html +21 -0
  96. local_deep_research/web/templates/pages/details.html +73 -0
  97. local_deep_research/web/templates/pages/history.html +51 -0
  98. local_deep_research/web/templates/pages/progress.html +57 -0
  99. local_deep_research/web/templates/pages/research.html +139 -0
  100. local_deep_research/web/templates/pages/results.html +59 -0
  101. local_deep_research/web/templates/settings_dashboard.html +78 -192
  102. local_deep_research/web/utils/__init__.py +0 -0
  103. local_deep_research/web/utils/formatters.py +76 -0
  104. local_deep_research/web_search_engines/engines/full_search.py +18 -16
  105. local_deep_research/web_search_engines/engines/meta_search_engine.py +182 -131
  106. local_deep_research/web_search_engines/engines/search_engine_arxiv.py +224 -139
  107. local_deep_research/web_search_engines/engines/search_engine_brave.py +88 -71
  108. local_deep_research/web_search_engines/engines/search_engine_ddg.py +48 -39
  109. local_deep_research/web_search_engines/engines/search_engine_github.py +415 -204
  110. local_deep_research/web_search_engines/engines/search_engine_google_pse.py +123 -90
  111. local_deep_research/web_search_engines/engines/search_engine_guardian.py +210 -157
  112. local_deep_research/web_search_engines/engines/search_engine_local.py +532 -369
  113. local_deep_research/web_search_engines/engines/search_engine_local_all.py +42 -36
  114. local_deep_research/web_search_engines/engines/search_engine_pubmed.py +358 -266
  115. local_deep_research/web_search_engines/engines/search_engine_searxng.py +212 -160
  116. local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +213 -170
  117. local_deep_research/web_search_engines/engines/search_engine_serpapi.py +84 -68
  118. local_deep_research/web_search_engines/engines/search_engine_wayback.py +186 -154
  119. local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +115 -77
  120. local_deep_research/web_search_engines/search_engine_base.py +174 -99
  121. local_deep_research/web_search_engines/search_engine_factory.py +192 -102
  122. local_deep_research/web_search_engines/search_engines_config.py +22 -15
  123. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/METADATA +177 -97
  124. local_deep_research-0.2.2.dist-info/RECORD +135 -0
  125. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/WHEEL +1 -2
  126. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/entry_points.txt +3 -0
  127. local_deep_research/defaults/llm_config.py +0 -338
  128. local_deep_research/utilties/search_utilities.py +0 -114
  129. local_deep_research/web/static/js/app.js +0 -3763
  130. local_deep_research/web/templates/api_keys_config.html +0 -82
  131. local_deep_research/web/templates/collections_config.html +0 -90
  132. local_deep_research/web/templates/index.html +0 -348
  133. local_deep_research/web/templates/llm_config.html +0 -120
  134. local_deep_research/web/templates/main_config.html +0 -89
  135. local_deep_research/web/templates/search_engines_config.html +0 -154
  136. local_deep_research/web/templates/settings.html +0 -519
  137. local_deep_research-0.1.26.dist-info/RECORD +0 -61
  138. local_deep_research-0.1.26.dist-info/top_level.txt +0 -1
  139. /local_deep_research/{utilties → config}/__init__.py +0 -0
  140. {local_deep_research-0.1.26.dist-info → local_deep_research-0.2.2.dist-info}/licenses/LICENSE +0 -0
@@ -249,6 +249,7 @@ textarea:focus, input[type="text"]:focus {
249
249
  .btn-primary:hover {
250
250
  background-color: var(--accent-secondary);
251
251
  box-shadow: var(--glow-effect);
252
+ color: white;
252
253
  }
253
254
 
254
255
  .btn-outline {
@@ -345,57 +346,181 @@ textarea:focus, input[type="text"]:focus {
345
346
  font-size: 0.85rem;
346
347
  }
347
348
 
348
- /* Progress Bar */
349
- .progress-container {
350
- margin: 1.5rem 0;
349
+ /* Progress Page */
350
+ .progress-info {
351
+ padding: 1rem 0;
352
+ }
353
+
354
+ .current-query-container {
355
+ margin-bottom: 1rem;
351
356
  display: flex;
352
357
  align-items: center;
353
- gap: 1rem;
354
358
  }
355
359
 
356
- .progress-bar {
360
+ .current-query-label {
361
+ font-weight: 600;
362
+ color: var(--text-secondary);
363
+ margin-right: 0.5rem;
364
+ min-width: 120px;
365
+ }
366
+
367
+ .current-query {
357
368
  flex: 1;
358
- height: 12px;
369
+ color: var(--text-primary);
370
+ padding: 0.5rem;
359
371
  background-color: var(--bg-tertiary);
360
372
  border-radius: 6px;
373
+ font-family: 'JetBrains Mono', monospace;
374
+ font-size: 0.9rem;
375
+ overflow-wrap: break-word;
376
+ word-wrap: break-word;
377
+ word-break: break-word;
378
+ }
379
+
380
+ .progress-container {
381
+ margin: 1.5rem 0;
382
+ position: relative;
383
+ }
384
+
385
+ .progress-bar {
386
+ width: 100%;
387
+ height: 10px;
388
+ background-color: var(--bg-tertiary);
389
+ border-radius: 5px;
361
390
  overflow: hidden;
391
+ position: relative;
362
392
  }
363
393
 
364
394
  .progress-fill {
365
395
  height: 100%;
366
- width: 0%;
367
- background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary));
368
- border-radius: 6px;
396
+ background-color: var(--accent-primary);
397
+ border-radius: 5px;
369
398
  transition: width 0.5s ease;
370
399
  }
371
400
 
372
- .progress-text {
373
- width: 60px;
374
- text-align: right;
401
+ .progress-percentage {
402
+ position: absolute;
403
+ right: 0;
404
+ top: -1.5rem;
405
+ font-size: 0.875rem;
375
406
  font-weight: 600;
376
- color: var(--accent-secondary);
407
+ color: var(--text-secondary);
377
408
  }
378
409
 
379
- .query-display {
380
- margin-bottom: 1.5rem;
410
+ .status-container, .task-container {
411
+ display: flex;
412
+ align-items: flex-start;
413
+ margin-bottom: 0.75rem;
381
414
  }
382
415
 
383
- .query-display h3 {
416
+ .status-label, .task-label {
417
+ font-weight: 600;
418
+ color: var(--text-secondary);
419
+ margin-right: 0.5rem;
420
+ min-width: 120px;
421
+ }
422
+
423
+ .status-indicator {
424
+ padding: 0.25rem 0.75rem;
425
+ border-radius: 12px;
426
+ font-size: 0.875rem;
427
+ font-weight: 600;
428
+ background-color: var(--bg-tertiary);
384
429
  color: var(--text-secondary);
385
- font-size: 1rem;
386
- margin-bottom: 0.5rem;
387
430
  }
388
431
 
389
- .query-display p {
432
+ .status-indicator.status-completed {
433
+ background-color: rgba(10, 207, 151, 0.2);
434
+ color: var(--success-color);
435
+ }
436
+
437
+ .status-indicator.status-failed,
438
+ .status-indicator.status-error {
439
+ background-color: rgba(250, 92, 124, 0.2);
440
+ color: var(--error-color);
441
+ }
442
+
443
+ .status-indicator.status-in_progress {
444
+ background-color: rgba(64, 191, 255, 0.2);
445
+ color: var(--accent-tertiary);
446
+ }
447
+
448
+ .task-text {
449
+ flex: 1;
390
450
  color: var(--text-primary);
391
- font-weight: 500;
451
+ line-height: 1.4;
392
452
  }
393
453
 
394
- .progress-info {
395
- color: var(--text-secondary);
454
+ .progress-actions {
455
+ margin-top: 1.5rem;
456
+ display: flex;
457
+ gap: 1rem;
458
+ }
459
+
460
+ /* Notification settings and audio test button */
461
+ .notification-settings {
462
+ margin: 15px 0;
463
+ display: flex;
464
+ justify-content: flex-end;
465
+ }
466
+
467
+ .audio-test {
468
+ position: relative;
469
+ display: inline-flex;
470
+ align-items: center;
471
+ }
472
+
473
+ .audio-test .tooltip-text {
474
+ font-size: 0.8rem;
475
+ color: var(--text-muted);
476
+ margin-left: 10px;
477
+ }
478
+
479
+ #test-audio-btn {
480
+ padding: 5px 10px;
481
+ font-size: 0.9rem;
482
+ }
483
+
484
+ /* Sound test dialog styling */
485
+ .sound-test-dialog {
396
486
  font-size: 0.9rem;
397
487
  }
398
488
 
489
+ .sound-test-content {
490
+ display: flex;
491
+ flex-direction: column;
492
+ }
493
+
494
+ .sound-test-content h3 {
495
+ margin-top: 0;
496
+ margin-bottom: 15px;
497
+ }
498
+
499
+ .sound-test-content ul {
500
+ list-style: none;
501
+ padding: 0;
502
+ margin: 15px 0;
503
+ }
504
+
505
+ .sound-test-content li {
506
+ margin-bottom: 8px;
507
+ display: flex;
508
+ justify-content: space-between;
509
+ }
510
+
511
+ .sound-test-content .test-tip {
512
+ background-color: rgba(64, 191, 255, 0.1);
513
+ border-radius: 6px;
514
+ padding: 10px;
515
+ margin: 10px 0;
516
+ font-size: 0.85rem;
517
+ }
518
+
519
+ .sound-test-content button {
520
+ margin-top: 10px;
521
+ margin-right: 8px;
522
+ }
523
+
399
524
  /* History List */
400
525
  .history-list {
401
526
  display: flex;
@@ -559,7 +684,7 @@ textarea:focus, input[type="text"]:focus {
559
684
  color: var(--text-secondary);
560
685
  }
561
686
 
562
- .results-content ul,
687
+ .results-content ul,
563
688
  .results-content ol {
564
689
  margin-bottom: 1rem;
565
690
  padding-left: 1.5rem;
@@ -865,7 +990,7 @@ textarea:focus, input[type="text"]:focus {
865
990
  width: 60px;
866
991
  overflow: hidden;
867
992
  }
868
-
993
+
869
994
  /* Hide all text in the logo and center icon */
870
995
  .sidebar-header {
871
996
  padding: 1rem 0;
@@ -875,32 +1000,32 @@ textarea:focus, input[type="text"]:focus {
875
1000
  justify-content: center;
876
1001
  height: 60px;
877
1002
  }
878
-
1003
+
879
1004
  .sidebar-header h2 {
880
1005
  font-size: 0;
881
1006
  display: flex;
882
1007
  justify-content: center;
883
1008
  width: 100%;
884
1009
  }
885
-
1010
+
886
1011
  .sidebar-header h2 i {
887
1012
  font-size: 1.4rem;
888
1013
  display: flex;
889
1014
  align-items: center;
890
1015
  justify-content: center;
891
1016
  }
892
-
1017
+
893
1018
  /* Hide all text in nav items and center icons */
894
1019
  .sidebar-nav {
895
1020
  display: flex;
896
1021
  flex-direction: column;
897
1022
  padding-top: 0.5rem;
898
1023
  }
899
-
1024
+
900
1025
  .sidebar-nav ul {
901
1026
  width: 100%;
902
1027
  }
903
-
1028
+
904
1029
  .sidebar-nav li {
905
1030
  text-indent: -9999px;
906
1031
  white-space: nowrap;
@@ -911,7 +1036,7 @@ textarea:focus, input[type="text"]:focus {
911
1036
  align-items: center;
912
1037
  justify-content: center;
913
1038
  }
914
-
1039
+
915
1040
  .sidebar-nav li i {
916
1041
  text-indent: 0;
917
1042
  margin: 0;
@@ -920,23 +1045,23 @@ textarea:focus, input[type="text"]:focus {
920
1045
  align-items: center;
921
1046
  justify-content: center;
922
1047
  }
923
-
1048
+
924
1049
  /* Active state fix for icon view */
925
1050
  .sidebar-nav li.active {
926
1051
  border-left-width: 3px;
927
1052
  }
928
-
1053
+
929
1054
  /* Hide footer */
930
1055
  .sidebar-footer {
931
1056
  display: none;
932
1057
  }
933
-
1058
+
934
1059
  /* Adjust main content */
935
1060
  .main-content {
936
1061
  margin-left: 60px;
937
1062
  width: calc(100% - 60px);
938
1063
  }
939
-
1064
+
940
1065
  .mode-selection {
941
1066
  flex-direction: column;
942
1067
  }
@@ -952,46 +1077,46 @@ textarea:focus, input[type="text"]:focus {
952
1077
  width: 100%;
953
1078
  padding-bottom: 70px; /* Account for mobile tab bar */
954
1079
  }
955
-
1080
+
956
1081
  /* Adjust padding for mobile when log panel is visible */
957
1082
  .page#research-progress.active ~ .main-content,
958
1083
  .page#research-results.active ~ .main-content {
959
1084
  padding-bottom: calc(42vh + 60px); /* Log panel + mobile tab bar */
960
1085
  }
961
-
1086
+
962
1087
  .sidebar {
963
1088
  width: 0;
964
1089
  transform: translateX(-100%);
965
1090
  }
966
-
1091
+
967
1092
  .sidebar.active {
968
1093
  width: 240px;
969
1094
  transform: translateX(0);
970
1095
  }
971
-
1096
+
972
1097
  /* Restore text in logo when sidebar is active on mobile */
973
1098
  .sidebar.active .sidebar-header h2 {
974
1099
  font-size: 1.25rem;
975
1100
  }
976
-
1101
+
977
1102
  /* Restore text in nav items when sidebar is active on mobile */
978
1103
  .sidebar.active .sidebar-nav li {
979
1104
  text-indent: 0;
980
1105
  padding: 0.75rem 1.5rem;
981
1106
  text-align: left;
982
1107
  }
983
-
1108
+
984
1109
  .sidebar.active .sidebar-nav li i {
985
1110
  display: inline;
986
1111
  width: 20px;
987
1112
  margin-right: 0.75rem;
988
1113
  font-size: 1rem;
989
1114
  }
990
-
1115
+
991
1116
  .sidebar.active .sidebar-footer {
992
1117
  display: flex;
993
1118
  }
994
-
1119
+
995
1120
  /* Show mobile tab bar */
996
1121
  .mobile-tab-bar {
997
1122
  display: flex !important; /* Use !important to ensure it displays */
@@ -1072,14 +1197,16 @@ textarea:focus, input[type="text"]:focus {
1072
1197
  box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.2);
1073
1198
  padding: 0;
1074
1199
  margin: 0;
1075
- /* Hide by default, only show on research-progress and research-results pages */
1076
- display: none;
1200
+ /* Instead of hiding, make it visible by default */
1201
+ display: flex;
1077
1202
  }
1078
1203
 
1079
- /* Only show log panel on research-progress and relevant pages */
1204
+ /* Updated selector to ensure it's visible when needed */
1080
1205
  .page#research-progress.active ~ .collapsible-log-panel,
1081
- .page#research-results.active ~ .collapsible-log-panel {
1082
- display: flex;
1206
+ .page#research-results.active ~ .collapsible-log-panel,
1207
+ .page#research-progress .collapsible-log-panel,
1208
+ .page#research-results .collapsible-log-panel {
1209
+ display: flex !important; /* Force display with !important */
1083
1210
  }
1084
1211
 
1085
1212
  /* Adjust for smaller screens */
@@ -1216,6 +1343,17 @@ textarea:focus, input[type="text"]:focus {
1216
1343
  padding-left: 0.5rem;
1217
1344
  }
1218
1345
 
1346
+ /* Duplicate counter badge for logs */
1347
+ .console-log-entry .duplicate-counter {
1348
+ color: var(--text-muted);
1349
+ font-size: 0.8rem;
1350
+ margin-left: 0.5rem;
1351
+ padding: 0.1rem 0.4rem;
1352
+ background-color: rgba(0, 0, 0, 0.15);
1353
+ border-radius: 10px;
1354
+ display: inline-block;
1355
+ }
1356
+
1219
1357
  .console-log-entry.log-milestone .log-badge {
1220
1358
  background-color: var(--accent-primary);
1221
1359
  color: white;
@@ -1313,4 +1451,343 @@ textarea:focus, input[type="text"]:focus {
1313
1451
  background-color: var(--accent-primary);
1314
1452
  color: white;
1315
1453
  border-color: var(--accent-primary);
1316
- }
1454
+ }
1455
+
1456
+ /* Search Controls */
1457
+ .search-controls {
1458
+ display: flex;
1459
+ align-items: center;
1460
+ margin-bottom: 1rem;
1461
+ gap: 1rem;
1462
+ }
1463
+
1464
+ .search-input {
1465
+ flex: 1;
1466
+ padding: 0.6rem 1rem;
1467
+ border-radius: 6px;
1468
+ border: 1px solid var(--border-color);
1469
+ background-color: var(--bg-tertiary);
1470
+ color: var(--text-primary);
1471
+ font-size: 0.9rem;
1472
+ }
1473
+
1474
+ .search-input:focus {
1475
+ outline: none;
1476
+ border-color: var(--accent-primary);
1477
+ box-shadow: 0 0 0 3px rgba(110, 79, 246, 0.2);
1478
+ }
1479
+
1480
+ /* Toast Notifications */
1481
+ #toast-container {
1482
+ position: fixed;
1483
+ top: 20px;
1484
+ right: 20px;
1485
+ z-index: 9999;
1486
+ display: flex;
1487
+ flex-direction: column;
1488
+ gap: 10px;
1489
+ }
1490
+
1491
+ .toast {
1492
+ display: flex;
1493
+ align-items: center;
1494
+ gap: 10px;
1495
+ background-color: var(--bg-secondary);
1496
+ color: var(--text-primary);
1497
+ padding: 12px 16px;
1498
+ border-radius: 8px;
1499
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1500
+ max-width: 350px;
1501
+ transform: translateX(120%);
1502
+ opacity: 0;
1503
+ transition: transform 0.3s ease, opacity 0.3s ease;
1504
+ border-left: 4px solid transparent;
1505
+ }
1506
+
1507
+ .toast.visible {
1508
+ transform: translateX(0);
1509
+ opacity: 1;
1510
+ }
1511
+
1512
+ .toast i {
1513
+ font-size: 1.2rem;
1514
+ }
1515
+
1516
+ .toast-success {
1517
+ border-left-color: var(--success-color);
1518
+ }
1519
+
1520
+ .toast-success i {
1521
+ color: var(--success-color);
1522
+ }
1523
+
1524
+ .toast-error {
1525
+ border-left-color: var(--error-color);
1526
+ }
1527
+
1528
+ .toast-error i {
1529
+ color: var(--error-color);
1530
+ }
1531
+
1532
+ .toast-info {
1533
+ border-left-color: var(--accent-tertiary);
1534
+ }
1535
+
1536
+ .toast-info i {
1537
+ color: var(--accent-tertiary);
1538
+ }
1539
+
1540
+ .toast-warning {
1541
+ border-left-color: var(--warning-color);
1542
+ }
1543
+
1544
+ .toast-warning i {
1545
+ color: var(--warning-color);
1546
+ }
1547
+
1548
+ /* Advanced Options */
1549
+ .advanced-options-toggle {
1550
+ display: flex;
1551
+ align-items: center;
1552
+ justify-content: flex-start;
1553
+ margin: 1.5rem 0 1rem;
1554
+ padding: 0.75rem 1rem;
1555
+ cursor: pointer;
1556
+ color: var(--accent-tertiary);
1557
+ font-weight: 600;
1558
+ transition: all 0.2s;
1559
+ border-radius: 8px;
1560
+ background-color: rgba(64, 191, 255, 0.05);
1561
+ border: 1px solid rgba(64, 191, 255, 0.1);
1562
+ }
1563
+
1564
+ .advanced-options-toggle:hover {
1565
+ color: var(--accent-secondary);
1566
+ background-color: rgba(110, 79, 246, 0.1);
1567
+ border-color: rgba(110, 79, 246, 0.2);
1568
+ }
1569
+
1570
+ .advanced-options-toggle .toggle-text {
1571
+ margin-right: 0.5rem;
1572
+ }
1573
+
1574
+ .advanced-options-toggle i {
1575
+ transition: transform 0.3s ease;
1576
+ margin-left: auto;
1577
+ }
1578
+
1579
+ .advanced-options-toggle.open i {
1580
+ transform: rotate(180deg);
1581
+ }
1582
+
1583
+ .advanced-options-panel {
1584
+ background-color: rgba(42, 42, 58, 0.5);
1585
+ border-radius: 8px;
1586
+ padding: 1.5rem;
1587
+ margin-bottom: 1.5rem;
1588
+ border: 1px solid var(--border-color);
1589
+ display: none;
1590
+ box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.1);
1591
+ }
1592
+
1593
+ .form-row {
1594
+ display: flex;
1595
+ gap: 1.5rem;
1596
+ margin-bottom: 1.5rem;
1597
+ }
1598
+
1599
+ .form-group.half {
1600
+ flex: 1;
1601
+ }
1602
+
1603
+ .input-help {
1604
+ display: block;
1605
+ font-size: 0.8rem;
1606
+ color: var(--text-muted);
1607
+ margin-top: 0.5rem;
1608
+ }
1609
+
1610
+ .form-options {
1611
+ margin: 1.5rem 0;
1612
+ }
1613
+
1614
+ .checkbox-label {
1615
+ display: flex;
1616
+ align-items: center;
1617
+ cursor: pointer;
1618
+ padding: 0.5rem;
1619
+ border-radius: 4px;
1620
+ transition: background-color 0.2s;
1621
+ }
1622
+
1623
+ .checkbox-label:hover {
1624
+ background-color: rgba(64, 191, 255, 0.05);
1625
+ }
1626
+
1627
+ .checkbox-label input[type="checkbox"] {
1628
+ margin-right: 0.75rem;
1629
+ }
1630
+
1631
+ /* Improved form controls for advanced options */
1632
+ .form-control {
1633
+ width: 100%;
1634
+ padding: 0.75rem;
1635
+ border-radius: 8px;
1636
+ border: 1px solid var(--border-color);
1637
+ background-color: var(--bg-secondary);
1638
+ color: var(--text-primary);
1639
+ font-family: inherit;
1640
+ font-size: 0.95rem;
1641
+ transition: border-color 0.2s, box-shadow 0.2s;
1642
+ }
1643
+
1644
+ select.form-control {
1645
+ appearance: none;
1646
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a8aa0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
1647
+ background-repeat: no-repeat;
1648
+ background-position: right 0.75rem center;
1649
+ background-size: 1rem;
1650
+ padding-right: 2.5rem;
1651
+ }
1652
+
1653
+ input[type="number"].form-control {
1654
+ appearance: textfield;
1655
+ -moz-appearance: textfield;
1656
+ }
1657
+
1658
+ input[type="number"].form-control::-webkit-outer-spin-button,
1659
+ input[type="number"].form-control::-webkit-inner-spin-button {
1660
+ -webkit-appearance: none;
1661
+ margin: 0;
1662
+ }
1663
+
1664
+ .form-control:focus {
1665
+ outline: none;
1666
+ border-color: var(--accent-primary);
1667
+ box-shadow: 0 0 0 3px rgba(110, 79, 246, 0.15);
1668
+ }
1669
+
1670
+ /* Notification Group Styles from app-refactoring */
1671
+ .notification-group {
1672
+ display: flex;
1673
+ align-items: center;
1674
+ justify-content: space-between;
1675
+ margin-bottom: 1rem;
1676
+ }
1677
+
1678
+ .notification-group .checkbox-label {
1679
+ display: flex;
1680
+ align-items: center;
1681
+ cursor: pointer;
1682
+ }
1683
+
1684
+ .notification-group .btn-sm {
1685
+ padding: 0.35rem 0.75rem;
1686
+ font-size: 0.85rem;
1687
+ background-color: var(--bg-tertiary);
1688
+ color: var(--text-secondary);
1689
+ border: 1px solid var(--border-color);
1690
+ }
1691
+
1692
+ .notification-group .btn-sm:hover {
1693
+ background-color: var(--accent-primary);
1694
+ color: white;
1695
+ }
1696
+
1697
+ /* Custom Dropdown Component */
1698
+ .custom-dropdown {
1699
+ position: relative;
1700
+ width: 100%;
1701
+ font-family: inherit;
1702
+ margin-bottom: 0.25rem;
1703
+ }
1704
+
1705
+ .custom-dropdown-input {
1706
+ width: 100%;
1707
+ padding: 8px 12px;
1708
+ font-size: 0.95rem;
1709
+ border: 1px solid var(--border-color);
1710
+ border-radius: 8px;
1711
+ background-color: var(--bg-tertiary);
1712
+ color: var(--text-primary);
1713
+ cursor: pointer;
1714
+ }
1715
+
1716
+ .custom-dropdown-input:focus {
1717
+ outline: none;
1718
+ border-color: var(--accent-primary);
1719
+ box-shadow: 0 0 0 3px rgba(110, 79, 246, 0.2);
1720
+ }
1721
+
1722
+ .custom-dropdown-list {
1723
+ position: absolute;
1724
+ width: 100%;
1725
+ max-height: 220px;
1726
+ overflow-y: auto;
1727
+ border: 1px solid var(--border-color);
1728
+ border-radius: 8px;
1729
+ background-color: var(--bg-secondary);
1730
+ display: none;
1731
+ z-index: 1000;
1732
+ margin-top: 4px;
1733
+ box-shadow: var(--card-shadow);
1734
+ }
1735
+
1736
+ .custom-dropdown-item {
1737
+ padding: 8px 12px;
1738
+ cursor: pointer;
1739
+ color: var(--text-primary);
1740
+ transition: background-color 0.15s ease;
1741
+ }
1742
+
1743
+ .custom-dropdown-item:hover {
1744
+ background-color: var(--bg-tertiary);
1745
+ }
1746
+
1747
+ .custom-dropdown-item.active {
1748
+ background-color: rgba(110, 79, 246, 0.2);
1749
+ }
1750
+
1751
+ .custom-dropdown-item .highlight {
1752
+ color: var(--accent-primary);
1753
+ font-weight: 500;
1754
+ }
1755
+
1756
+ .custom-dropdown-no-results {
1757
+ padding: 8px 12px;
1758
+ color: var(--text-muted);
1759
+ font-style: italic;
1760
+ }
1761
+
1762
+ .custom-dropdown-footer {
1763
+ padding: 8px 12px;
1764
+ border-top: 1px solid var(--border-color);
1765
+ color: var(--accent-tertiary);
1766
+ font-size: 0.9em;
1767
+ background-color: rgba(110, 79, 246, 0.05);
1768
+ }
1769
+
1770
+ .model-warning {
1771
+ color: var(--warning-color);
1772
+ font-size: 0.85rem;
1773
+ margin-top: 5px;
1774
+ display: none;
1775
+ }
1776
+
1777
+ /* Form Layout Helpers */
1778
+ .form-row {
1779
+ display: flex;
1780
+ gap: 1rem;
1781
+ margin-bottom: 1rem;
1782
+ }
1783
+
1784
+ .form-group.half {
1785
+ flex: 1;
1786
+ }
1787
+
1788
+ .input-help {
1789
+ display: block;
1790
+ margin-top: 0.25rem;
1791
+ font-size: 0.8rem;
1792
+ color: var(--text-muted);
1793
+ }