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
@@ -0,0 +1,1223 @@
1
+ /* Settings Dashboard Styles */
2
+
3
+ /* Container */
4
+ .settings-container {
5
+ max-width: 100%;
6
+ margin: 0 auto;
7
+ padding: 0;
8
+ }
9
+
10
+ .settings-header {
11
+ margin-bottom: 1.5rem;
12
+ }
13
+
14
+ .settings-header h1 {
15
+ margin-bottom: 0.5rem;
16
+ font-size: 1.8rem;
17
+ font-weight: 600;
18
+ }
19
+
20
+ .settings-description {
21
+ color: var(--text-secondary);
22
+ margin-bottom: 1.5rem;
23
+ font-size: 0.95rem;
24
+ }
25
+
26
+ /* Card styling improvements */
27
+ .card {
28
+ background-color: var(--bg-secondary);
29
+ border-radius: 12px;
30
+ box-shadow: var(--card-shadow);
31
+ margin-bottom: 1.5rem;
32
+ overflow: hidden;
33
+ border: 1px solid var(--border-color);
34
+ }
35
+
36
+ .card-content {
37
+ padding: 1.75rem;
38
+ }
39
+
40
+ /* Form */
41
+ .settings-form {
42
+ margin-top: 1rem;
43
+ }
44
+
45
+ /* Tabs */
46
+ .settings-tabs {
47
+ display: flex;
48
+ margin: 0 0 1.5rem 0;
49
+ overflow-x: auto;
50
+ white-space: nowrap;
51
+ gap: 0.75rem;
52
+ }
53
+
54
+ .settings-tab {
55
+ padding: 0.6rem 1.2rem;
56
+ cursor: pointer;
57
+ color: var(--text-secondary);
58
+ font-weight: 500;
59
+ background-color: var(--bg-tertiary);
60
+ border-radius: 2rem;
61
+ transition: all 0.2s;
62
+ text-align: center;
63
+ border: 1px solid var(--border-color);
64
+ }
65
+
66
+ .settings-tab:hover {
67
+ color: var(--text-primary);
68
+ background-color: rgba(110, 79, 246, 0.1);
69
+ }
70
+
71
+ .settings-tab.active {
72
+ color: var(--text-primary);
73
+ background-color: var(--accent-primary);
74
+ box-shadow: 0 0 10px rgba(110, 79, 246, 0.3);
75
+ border-color: var(--accent-primary);
76
+ }
77
+
78
+ /* Remove the underline since we're using background color */
79
+ .settings-tab.active::after {
80
+ display: none;
81
+ }
82
+
83
+ /* Cards */
84
+ .settings-cards {
85
+ display: grid;
86
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
87
+ gap: 1rem;
88
+ margin-bottom: 1.5rem;
89
+ }
90
+
91
+ .settings-card {
92
+ background-color: rgba(30, 35, 45, 0.7);
93
+ border-radius: 8px;
94
+ padding: 1.5rem;
95
+ border: 1px solid rgba(255, 255, 255, 0.1);
96
+ transition: transform 0.2s, box-shadow 0.2s;
97
+ }
98
+
99
+ .settings-card:hover {
100
+ transform: translateY(-2px);
101
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
102
+ border-color: rgba(255, 255, 255, 0.2);
103
+ }
104
+
105
+ .settings-card-icon {
106
+ width: 48px;
107
+ height: 48px;
108
+ border-radius: 50%;
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ margin-bottom: 1rem;
113
+ font-size: 1.5rem;
114
+ color: var(--text-primary);
115
+ background-color: rgba(255, 255, 255, 0.1);
116
+ }
117
+
118
+ .settings-card h3 {
119
+ font-size: 1.2rem;
120
+ margin-bottom: 0.5rem;
121
+ font-weight: 500;
122
+ }
123
+
124
+ .settings-card p {
125
+ color: var(--text-secondary);
126
+ font-size: 0.9rem;
127
+ margin-bottom: 1rem;
128
+ }
129
+
130
+ .settings-card-footer {
131
+ margin-top: auto;
132
+ display: flex;
133
+ justify-content: flex-end;
134
+ }
135
+
136
+ /* Sections */
137
+ .settings-section {
138
+ margin-bottom: 1.5rem;
139
+ background-color: var(--bg-tertiary);
140
+ border: 1px solid var(--border-color);
141
+ border-radius: 0.5rem;
142
+ overflow: hidden;
143
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
144
+ }
145
+
146
+ .settings-section-header {
147
+ display: flex;
148
+ justify-content: space-between;
149
+ align-items: center;
150
+ padding: 1rem 1.25rem;
151
+ cursor: pointer;
152
+ background-color: rgba(40, 45, 60, 0.5);
153
+ border-bottom: 1px solid var(--border-color);
154
+ transition: background-color 0.2s;
155
+ }
156
+
157
+ .settings-section-header:hover {
158
+ background-color: rgba(50, 55, 70, 0.9);
159
+ }
160
+
161
+ .settings-section-title {
162
+ font-weight: 600;
163
+ font-size: 1rem;
164
+ color: var(--text-primary);
165
+ display: flex;
166
+ align-items: center;
167
+ max-width: 80%;
168
+ white-space: nowrap;
169
+ overflow: hidden;
170
+ text-overflow: ellipsis;
171
+ }
172
+
173
+ .settings-section-title i {
174
+ margin-right: 0.5rem;
175
+ color: var(--accent-primary);
176
+ opacity: 0.8;
177
+ }
178
+
179
+ .settings-toggle-icon {
180
+ transition: transform 0.3s;
181
+ color: var(--accent-primary);
182
+ }
183
+
184
+ .settings-section-header.collapsed .settings-toggle-icon {
185
+ transform: rotate(-90deg);
186
+ }
187
+
188
+ .settings-section-body {
189
+ padding: 1.25rem;
190
+ border-top: none;
191
+ }
192
+
193
+ .settings-group {
194
+ margin-bottom: 1.5rem;
195
+ }
196
+
197
+ .settings-group-title {
198
+ font-size: 1rem;
199
+ font-weight: 500;
200
+ margin-bottom: 1rem;
201
+ color: var(--text-primary);
202
+ display: flex;
203
+ align-items: center;
204
+ }
205
+
206
+ .settings-group-title i {
207
+ margin-right: 8px;
208
+ }
209
+
210
+ .settings-row {
211
+ display: grid;
212
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
213
+ gap: 1rem;
214
+ margin-bottom: 1rem;
215
+ }
216
+
217
+ .settings-item {
218
+ margin-bottom: 1.25rem;
219
+ padding-bottom: 1.25rem;
220
+ border-bottom: 1px solid var(--border-color);
221
+ }
222
+
223
+ .settings-item:last-child {
224
+ margin-bottom: 0;
225
+ padding-bottom: 0;
226
+ border-bottom: none;
227
+ }
228
+
229
+ .settings-item-header {
230
+ display: flex;
231
+ align-items: flex-start;
232
+ margin-bottom: 0.75rem;
233
+ min-height: 28px;
234
+ }
235
+
236
+ .settings-item-header label {
237
+ font-weight: 600;
238
+ margin-right: 0.5rem;
239
+ color: var(--text-primary);
240
+ max-width: 400px;
241
+ white-space: nowrap;
242
+ overflow: hidden;
243
+ text-overflow: ellipsis;
244
+ }
245
+
246
+ .settings-item-header label[title] {
247
+ cursor: help;
248
+ }
249
+
250
+ .settings-item label {
251
+ font-weight: 600;
252
+ margin-right: 0.5rem;
253
+ color: var(--text-primary);
254
+ }
255
+
256
+ .settings-tooltip {
257
+ color: var(--text-secondary);
258
+ cursor: help;
259
+ }
260
+
261
+ .settings-tooltip:hover::after {
262
+ content: attr(title);
263
+ position: absolute;
264
+ top: 100%;
265
+ right: 0;
266
+ background-color: rgba(0, 0, 0, 0.9);
267
+ color: #fff;
268
+ padding: 6px 10px;
269
+ border-radius: 4px;
270
+ font-size: 0.8rem;
271
+ width: 200px;
272
+ white-space: normal;
273
+ z-index: 10;
274
+ margin-top: 5px;
275
+ }
276
+
277
+ .settings-tooltip:hover::before {
278
+ content: '';
279
+ position: absolute;
280
+ top: 100%;
281
+ right: 5px;
282
+ border-width: 5px;
283
+ border-style: solid;
284
+ border-color: transparent transparent rgba(0, 0, 0, 0.9) transparent;
285
+ z-index: 10;
286
+ }
287
+
288
+ /* Inputs */
289
+ .settings-input,
290
+ .settings-textarea,
291
+ .settings-select {
292
+ width: 100%;
293
+ padding: 0.75rem;
294
+ font-size: 0.9rem;
295
+ background-color: var(--bg-secondary);
296
+ color: var(--text-primary);
297
+ border: 1px solid var(--border-color);
298
+ border-radius: 0.375rem;
299
+ transition: border-color 0.2s, box-shadow 0.2s;
300
+ }
301
+
302
+ .settings-textarea {
303
+ min-height: 120px;
304
+ font-family: monospace;
305
+ white-space: pre;
306
+ }
307
+
308
+ .settings-textarea.json-content {
309
+ font-family: 'Courier New', Courier, monospace;
310
+ }
311
+
312
+ .settings-input:focus,
313
+ .settings-textarea:focus,
314
+ .settings-select:focus {
315
+ outline: none;
316
+ border-color: var(--accent-primary);
317
+ box-shadow: 0 0 0 2px rgba(110, 79, 246, 0.3);
318
+ }
319
+
320
+ .settings-select {
321
+ appearance: none;
322
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%236b7280' viewBox='0 0 16 16'%3E%3Cpath d='M8 11l-6-6 1.5-1.5L8 8l4.5-4.5L14 5l-6 6z'/%3E%3C/svg%3E");
323
+ background-repeat: no-repeat;
324
+ background-position: right 0.75rem center;
325
+ background-size: 16px 12px;
326
+ padding-right: 2.5rem;
327
+ }
328
+
329
+ .settings-checkbox-container {
330
+ margin: 0.5rem 0;
331
+ }
332
+
333
+ .settings-checkbox-container .checkbox-label {
334
+ margin-bottom: 0.25rem;
335
+ }
336
+
337
+ .json-property-item .checkbox-label {
338
+ display: flex;
339
+ align-items: center;
340
+ margin: 0;
341
+ padding: 0;
342
+ }
343
+
344
+ .settings-checkbox {
345
+ width: 18px;
346
+ height: 18px;
347
+ background-color: rgba(20, 25, 35, 0.7);
348
+ border: 1px solid rgba(255, 255, 255, 0.2);
349
+ }
350
+
351
+ .settings-range {
352
+ flex: 1;
353
+ }
354
+
355
+ .settings-range-container {
356
+ display: flex;
357
+ align-items: center;
358
+ }
359
+
360
+ .settings-range-value {
361
+ min-width: 40px;
362
+ margin-left: 1rem;
363
+ padding: 0.25rem 0.5rem;
364
+ background-color: var(--accent-primary);
365
+ color: white;
366
+ border-radius: 0.25rem;
367
+ text-align: center;
368
+ font-size: 0.85rem;
369
+ }
370
+
371
+ .settings-help {
372
+ margin-top: 0.5rem;
373
+ font-size: 0.85rem;
374
+ color: var(--text-secondary);
375
+ padding-left: 24px;
376
+ }
377
+
378
+ .settings-error {
379
+ border-color: var(--error-color) !important;
380
+ }
381
+
382
+ .settings-error-message {
383
+ color: var(--error-color);
384
+ font-size: 0.85rem;
385
+ margin-top: 0.5rem;
386
+ }
387
+
388
+ /* Form Actions */
389
+ .form-actions {
390
+ display: flex;
391
+ justify-content: flex-end;
392
+ gap: 1rem;
393
+ margin-top: 1.5rem;
394
+ padding-top: 1.5rem;
395
+ border-top: 1px solid rgba(255, 255, 255, 0.05);
396
+ }
397
+
398
+ .settings-actions {
399
+ margin-top: 20px;
400
+ display: flex;
401
+ justify-content: flex-end;
402
+ gap: 1.5rem;
403
+ }
404
+
405
+ .settings-modified {
406
+ position: relative;
407
+ }
408
+
409
+ .json-content {
410
+ font-family: monospace;
411
+ white-space: pre-wrap;
412
+ overflow-x: auto;
413
+ font-size: 0.9rem;
414
+ background-color: rgba(20, 25, 35, 0.7);
415
+ }
416
+
417
+ .settings-json-editor {
418
+ position: relative;
419
+ display: flex;
420
+ flex-direction: column;
421
+ }
422
+
423
+ .settings-json-toolbar {
424
+ display: flex;
425
+ justify-content: flex-end;
426
+ gap: 5px;
427
+ margin-bottom: 5px;
428
+ background-color: rgba(40, 45, 55, 0.9);
429
+ padding: 5px;
430
+ border-radius: 4px;
431
+ }
432
+
433
+ .json-toolbar-btn {
434
+ background-color: rgba(30, 35, 45, 0.7);
435
+ border: none;
436
+ color: var(--text-primary);
437
+ padding: 2px 8px;
438
+ border-radius: 4px;
439
+ cursor: pointer;
440
+ font-size: 0.8rem;
441
+ }
442
+
443
+ .json-toolbar-btn:hover {
444
+ background-color: rgba(50, 55, 65, 0.9);
445
+ }
446
+
447
+ .json-format-btn {
448
+ display: flex;
449
+ align-items: center;
450
+ }
451
+
452
+ .json-copy-btn {
453
+ display: flex;
454
+ align-items: center;
455
+ }
456
+
457
+ /* Alert Messages */
458
+ .alert {
459
+ padding: 0.75rem 1.25rem;
460
+ margin-bottom: 1rem;
461
+ border-radius: 0.375rem;
462
+ display: flex;
463
+ align-items: center;
464
+ }
465
+
466
+ .alert i {
467
+ margin-right: 0.75rem;
468
+ }
469
+
470
+ .alert-success {
471
+ background-color: rgba(10, 207, 151, 0.2);
472
+ color: var(--success-color);
473
+ border-left: 4px solid var(--success-color);
474
+ }
475
+
476
+ .alert-error, .alert-danger {
477
+ background-color: rgba(250, 92, 124, 0.2);
478
+ color: var(--error-color);
479
+ border-left: 4px solid var(--error-color);
480
+ }
481
+
482
+ .alert-info {
483
+ background-color: rgba(64, 191, 255, 0.2);
484
+ color: var(--accent-tertiary);
485
+ border-left: 4px solid var(--accent-tertiary);
486
+ }
487
+
488
+ .alert-warning {
489
+ background-color: rgba(249, 188, 11, 0.2);
490
+ color: var(--warning-color);
491
+ border-left: 4px solid var(--warning-color);
492
+ }
493
+
494
+ /* Misc */
495
+ .empty-state {
496
+ text-align: center;
497
+ padding: 2rem;
498
+ color: var(--text-secondary);
499
+ }
500
+
501
+ /* Loading indicator */
502
+ .loading-spinner {
503
+ display: flex;
504
+ flex-direction: column;
505
+ align-items: center;
506
+ justify-content: center;
507
+ padding: 2rem 0;
508
+ }
509
+
510
+ .loading-spinner.centered {
511
+ position: absolute;
512
+ top: 50%;
513
+ left: 50%;
514
+ transform: translate(-50%, -50%);
515
+ width: 100%;
516
+ }
517
+
518
+ .spinner {
519
+ width: 40px;
520
+ height: 40px;
521
+ border: 3px solid rgba(255, 255, 255, 0.1);
522
+ border-radius: 50%;
523
+ border-top-color: var(--accent-primary);
524
+ animation: spin 1s ease-in-out infinite;
525
+ margin-bottom: 1rem;
526
+ position: relative;
527
+ left: 0;
528
+ top: 0;
529
+ }
530
+
531
+ @keyframes spin {
532
+ to { transform: rotate(360deg); }
533
+ }
534
+
535
+ /* Additional styles for main settings page */
536
+ .settings-section h2 {
537
+ margin-bottom: 1rem;
538
+ color: var(--accent-primary);
539
+ font-size: 1.3rem;
540
+ }
541
+
542
+ .form-group {
543
+ margin-bottom: 1rem;
544
+ }
545
+
546
+ .form-group label {
547
+ display: block;
548
+ margin-bottom: 0.5rem;
549
+ font-weight: 500;
550
+ }
551
+
552
+ .form-control {
553
+ width: 100%;
554
+ padding: 0.5rem;
555
+ border: 1px solid var(--border-color);
556
+ border-radius: 4px;
557
+ background-color: var(--bg-secondary);
558
+ color: var(--text-primary);
559
+ }
560
+
561
+ .form-row {
562
+ display: flex;
563
+ gap: 1rem;
564
+ }
565
+
566
+ .form-group.half {
567
+ flex: 1;
568
+ }
569
+
570
+ .input-help {
571
+ font-size: 0.85rem;
572
+ color: var(--text-secondary);
573
+ margin-top: 0.3rem;
574
+ line-height: 1.3;
575
+ }
576
+
577
+ .checkbox-group {
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 0.5rem;
581
+ }
582
+
583
+ .checkbox-group input {
584
+ margin: 0;
585
+ }
586
+
587
+ .checkbox-group label {
588
+ margin: 0;
589
+ }
590
+
591
+ .range-value {
592
+ display: inline-block;
593
+ margin-left: 0.5rem;
594
+ }
595
+
596
+ .config-raw {
597
+ margin-top: 2rem;
598
+ background-color: var(--bg-quaternary);
599
+ padding: 1rem;
600
+ border-radius: 4px;
601
+ overflow: auto;
602
+ font-family: monospace;
603
+ font-size: 0.9rem;
604
+ color: var(--text-primary);
605
+ white-space: pre;
606
+ min-height: 200px;
607
+ max-height: 600px;
608
+ border: 1px solid var(--border-color);
609
+ }
610
+
611
+ .toggle-raw-config {
612
+ cursor: pointer;
613
+ display: flex;
614
+ align-items: center;
615
+ gap: 0.5rem;
616
+ margin-top: 2rem;
617
+ margin-bottom: 1rem;
618
+ color: var(--accent-primary);
619
+ font-weight: 500;
620
+ padding: 0.5rem 1rem;
621
+ background-color: rgba(74, 108, 247, 0.1);
622
+ border-radius: 4px;
623
+ width: fit-content;
624
+ }
625
+
626
+ .toggle-raw-config:hover {
627
+ background-color: rgba(74, 108, 247, 0.2);
628
+ }
629
+
630
+ .config-raw-editor {
631
+ background-color: var(--bg-quaternary);
632
+ color: var(--text-primary);
633
+ font-family: monospace;
634
+ font-size: 0.9rem;
635
+ padding: 1rem;
636
+ border: 1px solid var(--border-color);
637
+ border-radius: 4px;
638
+ width: 100%;
639
+ min-height: 400px;
640
+ resize: vertical;
641
+ display: block !important;
642
+ }
643
+
644
+ .editor-header {
645
+ background-color: var(--bg-tertiary);
646
+ padding: 0.75rem 1rem;
647
+ border-bottom: 1px solid var(--border-color);
648
+ display: flex;
649
+ justify-content: space-between;
650
+ align-items: center;
651
+ }
652
+
653
+ .editor-header h3 {
654
+ margin: 0;
655
+ font-size: 1rem;
656
+ color: var(--text-primary);
657
+ }
658
+
659
+ .editor-lang {
660
+ background-color: var(--accent-primary);
661
+ font-size: 0.8rem;
662
+ padding: 0.25rem 0.5rem;
663
+ border-radius: 4px;
664
+ }
665
+
666
+ /* Search controls */
667
+ .search-controls {
668
+ margin-bottom: 1.5rem;
669
+ }
670
+
671
+ .search-input {
672
+ width: 100%;
673
+ padding: 0.75rem 1rem;
674
+ border-radius: 0.5rem;
675
+ border: 1px solid var(--border-color);
676
+ background-color: var(--bg-tertiary);
677
+ color: var(--text-primary);
678
+ font-size: 0.95rem;
679
+ transition: all 0.2s;
680
+ }
681
+
682
+ .search-input:focus {
683
+ border-color: var(--accent-primary);
684
+ box-shadow: 0 0 0 2px rgba(110, 79, 246, 0.2);
685
+ outline: none;
686
+ }
687
+
688
+ /* Settings-specific colorful info boxes */
689
+ .provider-info,
690
+ .search-info,
691
+ .report-info,
692
+ .app-info {
693
+ margin-bottom: 1.5rem;
694
+ padding: 1rem;
695
+ border-radius: 0.375rem;
696
+ border-left-width: 4px;
697
+ border-left-style: solid;
698
+ }
699
+
700
+ .provider-info {
701
+ background-color: rgba(110, 79, 246, 0.1);
702
+ border-left-color: var(--accent-primary);
703
+ }
704
+
705
+ .provider-info h3 {
706
+ color: var(--accent-primary);
707
+ }
708
+
709
+ .search-info {
710
+ background-color: rgba(249, 188, 11, 0.1);
711
+ border-left-color: var(--warning-color);
712
+ }
713
+
714
+ .search-info h3 {
715
+ color: var(--warning-color);
716
+ }
717
+
718
+ .report-info {
719
+ background-color: rgba(10, 207, 151, 0.1);
720
+ border-left-color: var(--success-color);
721
+ }
722
+
723
+ .report-info h3 {
724
+ color: var(--success-color);
725
+ }
726
+
727
+ .app-info {
728
+ background-color: rgba(110, 79, 246, 0.15);
729
+ border-left-color: var(--accent-secondary);
730
+ }
731
+
732
+ .app-info h3 {
733
+ color: var(--accent-secondary);
734
+ }
735
+
736
+ .provider-info h3,
737
+ .search-info h3,
738
+ .report-info h3,
739
+ .app-info h3 {
740
+ margin-bottom: 0.5rem;
741
+ font-size: 1.1rem;
742
+ }
743
+
744
+ .provider-info p,
745
+ .search-info p,
746
+ .report-info p,
747
+ .app-info p {
748
+ margin-bottom: 0.5rem;
749
+ font-size: 0.9rem;
750
+ }
751
+
752
+ .provider-info ul,
753
+ .search-info ul,
754
+ .report-info ul,
755
+ .app-info ul {
756
+ margin-bottom: 0;
757
+ padding-left: 1.5rem;
758
+ }
759
+
760
+ .provider-info li,
761
+ .search-info li,
762
+ .report-info li,
763
+ .app-info li {
764
+ font-size: 0.9rem;
765
+ margin-bottom: 0.25rem;
766
+ }
767
+
768
+ /* Collections config specific */
769
+ .file-path {
770
+ background-color: var(--bg-secondary);
771
+ padding: 0.75rem;
772
+ border-radius: 4px;
773
+ font-family: monospace;
774
+ margin: 1rem 0;
775
+ word-break: break-all;
776
+ color: var(--text-primary);
777
+ }
778
+
779
+ .config-example {
780
+ background-color: var(--bg-quaternary);
781
+ color: var(--text-primary);
782
+ font-family: monospace;
783
+ font-size: 0.9rem;
784
+ padding: 1rem;
785
+ border-radius: 4px;
786
+ overflow: auto;
787
+ white-space: pre;
788
+ margin: 1rem 0;
789
+ }
790
+
791
+ /* Button Styles */
792
+ .btn {
793
+ display: inline-flex;
794
+ align-items: center;
795
+ justify-content: center;
796
+ padding: 0.6rem 1.2rem;
797
+ font-size: 0.9rem;
798
+ font-weight: 500;
799
+ border-radius: 2rem;
800
+ cursor: pointer;
801
+ transition: all 0.2s;
802
+ border: 1px solid transparent;
803
+ gap: 0.5rem;
804
+ }
805
+
806
+ .btn i {
807
+ font-size: 1rem;
808
+ }
809
+
810
+ .btn-primary {
811
+ background-color: var(--accent-primary);
812
+ color: var(--text-primary);
813
+ box-shadow: 0 0 10px rgba(110, 79, 246, 0.3);
814
+ }
815
+
816
+ .btn-primary:hover {
817
+ background-color: var(--accent-secondary);
818
+ transform: translateY(-1px);
819
+ box-shadow: 0 4px 12px rgba(110, 79, 246, 0.4);
820
+ }
821
+
822
+ .btn-outline {
823
+ background-color: transparent;
824
+ color: var(--text-secondary);
825
+ border: 1px solid var(--border-color);
826
+ }
827
+
828
+ .btn-outline:hover {
829
+ color: var(--text-primary);
830
+ border-color: var(--accent-primary);
831
+ background-color: rgba(110, 79, 246, 0.1);
832
+ }
833
+
834
+ /* Raw JSON Configuration */
835
+ .raw-config-section {
836
+ margin-top: 2rem;
837
+ border-top: 1px solid rgba(255, 255, 255, 0.05);
838
+ padding-top: 1.5rem;
839
+ }
840
+
841
+ .section-header {
842
+ margin-bottom: 1.5rem;
843
+ }
844
+
845
+ .section-header h3 {
846
+ font-size: 1.2rem;
847
+ margin-bottom: 0.5rem;
848
+ color: var(--text-primary);
849
+ font-weight: 500;
850
+ }
851
+
852
+ .section-description {
853
+ color: var(--text-secondary);
854
+ font-size: 0.9rem;
855
+ }
856
+
857
+ .json-editor {
858
+ width: 100%;
859
+ min-height: 300px;
860
+ padding: 1rem;
861
+ background-color: var(--bg-tertiary);
862
+ color: var(--text-primary);
863
+ border: 1px solid var(--border-color);
864
+ border-radius: 0.5rem;
865
+ font-family: 'Courier New', monospace;
866
+ font-size: 0.9rem;
867
+ resize: vertical;
868
+ white-space: pre;
869
+ overflow-x: auto;
870
+ }
871
+
872
+ .json-editor:focus {
873
+ outline: none;
874
+ border-color: var(--accent-primary);
875
+ box-shadow: 0 0 0 2px rgba(110, 79, 246, 0.2);
876
+ }
877
+
878
+ .toggle-raw-config {
879
+ display: inline-flex;
880
+ align-items: center;
881
+ padding: 0.6rem 1.2rem;
882
+ margin-top: 2rem;
883
+ background-color: var(--bg-tertiary);
884
+ border: 1px solid var(--border-color);
885
+ border-radius: 2rem;
886
+ cursor: pointer;
887
+ color: var(--text-secondary);
888
+ font-weight: 500;
889
+ transition: all 0.2s;
890
+ gap: 0.5rem;
891
+ }
892
+
893
+ .toggle-raw-config:hover {
894
+ color: var(--text-primary);
895
+ background-color: rgba(110, 79, 246, 0.1);
896
+ border-color: var(--accent-primary);
897
+ }
898
+
899
+ /* JSON Expanded Controls */
900
+ .json-expanded-controls {
901
+ background-color: rgba(30, 35, 45, 0.5);
902
+ border-radius: 8px;
903
+ padding: 1rem;
904
+ margin-bottom: 1rem;
905
+ border: 1px solid var(--border-color);
906
+ }
907
+
908
+ .json-property-controls {
909
+ display: grid;
910
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
911
+ gap: 1rem;
912
+ }
913
+
914
+ .json-property-item {
915
+ margin-bottom: 0.5rem;
916
+ padding: 1rem;
917
+ background-color: rgba(25, 30, 40, 0.8);
918
+ border-radius: 6px;
919
+ border: 1px solid var(--border-color);
920
+ transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
921
+ }
922
+
923
+ .json-property-item:hover {
924
+ transform: translateY(-2px);
925
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
926
+ border-color: rgba(110, 79, 246, 0.4);
927
+ }
928
+
929
+ /* Property label with ellipsis for long text */
930
+ .json-property-item .property-label {
931
+ display: block;
932
+ margin-bottom: 0.75rem;
933
+ font-weight: 500;
934
+ color: var(--text-primary);
935
+ font-size: 0.95rem;
936
+ white-space: nowrap;
937
+ overflow: hidden;
938
+ text-overflow: ellipsis;
939
+ max-width: 100%;
940
+ cursor: pointer;
941
+ }
942
+
943
+ /* Add explicit title for hover tooltip on long labels */
944
+ .json-property-item .property-label:hover {
945
+ color: var(--accent-primary);
946
+ }
947
+
948
+ /* Checkbox wrapper for clickable area */
949
+ .checkbox-wrapper {
950
+ cursor: pointer;
951
+ padding: 0.5rem;
952
+ margin: -0.5rem;
953
+ border-radius: 4px;
954
+ transition: background-color 0.2s;
955
+ }
956
+
957
+ .checkbox-wrapper:hover {
958
+ background-color: rgba(110, 79, 246, 0.1);
959
+ }
960
+
961
+ .json-property-item .checkbox-label {
962
+ display: flex;
963
+ align-items: center;
964
+ gap: 0.75rem;
965
+ margin-top: 0.5rem;
966
+ cursor: pointer;
967
+ }
968
+
969
+ .json-property-item .checkbox-text {
970
+ font-size: 0.9rem;
971
+ color: var(--text-primary);
972
+ cursor: pointer;
973
+ }
974
+
975
+ .json-property-item .settings-input,
976
+ .json-property-item .settings-select {
977
+ width: 100%;
978
+ padding: 0.7rem;
979
+ font-size: 0.9rem;
980
+ background-color: var(--bg-secondary);
981
+ border: 1px solid var(--border-color);
982
+ color: var(--text-primary);
983
+ border-radius: 4px;
984
+ }
985
+
986
+ .json-property-item .settings-input:focus,
987
+ .json-property-item .settings-select:focus {
988
+ outline: none;
989
+ border-color: var(--accent-primary);
990
+ box-shadow: 0 0 0 2px rgba(110, 79, 246, 0.3);
991
+ }
992
+
993
+ .json-property-item .settings-help {
994
+ color: var(--text-secondary);
995
+ font-size: 0.8rem;
996
+ margin-top: 0.5rem;
997
+ opacity: 0.8;
998
+ }
999
+
1000
+ /* Animations for expanded controls */
1001
+ .json-expanded-controls {
1002
+ animation: fadeIn 0.3s ease-in-out;
1003
+ }
1004
+
1005
+ @keyframes fadeIn {
1006
+ from { opacity: 0; transform: translateY(-10px); }
1007
+ to { opacity: 1; transform: translateY(0); }
1008
+ }
1009
+
1010
+ /* Checkbox styling */
1011
+ .checkbox-label {
1012
+ display: flex;
1013
+ align-items: center;
1014
+ margin-bottom: 0.5rem;
1015
+ padding-left: 0;
1016
+ cursor: pointer;
1017
+ position: relative;
1018
+ }
1019
+
1020
+ .checkbox-label input[type="checkbox"] {
1021
+ position: relative;
1022
+ width: 18px;
1023
+ height: 18px;
1024
+ appearance: none;
1025
+ -webkit-appearance: none;
1026
+ -moz-appearance: none;
1027
+ border: 2px solid var(--accent-primary);
1028
+ border-radius: 3px;
1029
+ background-color: var(--bg-surface);
1030
+ cursor: pointer;
1031
+ margin: 0 8px 0 0;
1032
+ padding: 0;
1033
+ vertical-align: middle;
1034
+ transition: all 0.2s;
1035
+ }
1036
+
1037
+ .checkbox-label input[type="checkbox"]:checked {
1038
+ background-color: var(--accent-primary);
1039
+ border-color: var(--accent-primary);
1040
+ }
1041
+
1042
+ .checkbox-label input[type="checkbox"]:checked::after {
1043
+ content: '✓';
1044
+ color: white;
1045
+ font-size: 12px;
1046
+ position: absolute;
1047
+ top: 50%;
1048
+ left: 50%;
1049
+ transform: translate(-50%, -50%);
1050
+ }
1051
+
1052
+ .checkbox-label input[type="checkbox"]:focus {
1053
+ outline: none;
1054
+ box-shadow: 0 0 0 2px rgba(110, 79, 246, 0.3);
1055
+ }
1056
+
1057
+ .checkbox-text {
1058
+ margin-left: 0;
1059
+ color: var(--text-primary);
1060
+ font-size: 14px;
1061
+ vertical-align: middle;
1062
+ }
1063
+
1064
+ .settings-item .checkbox-label {
1065
+ margin-top: 0;
1066
+ padding-left: 0;
1067
+ display: flex;
1068
+ align-items: center;
1069
+ }
1070
+
1071
+ /* Boolean property items */
1072
+ .json-property-item.boolean-property {
1073
+ cursor: pointer;
1074
+ transition: background-color 0.2s, transform 0.2s, box-shadow 0.2s, border-color 0.2s;
1075
+ position: relative;
1076
+ }
1077
+
1078
+ .json-property-item.boolean-property:hover {
1079
+ background-color: rgba(25, 35, 55, 0.9);
1080
+ border-color: var(--accent-primary);
1081
+ transform: translateY(-2px);
1082
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.25);
1083
+ }
1084
+
1085
+ .json-property-item.boolean-property:active {
1086
+ transform: translateY(0px);
1087
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
1088
+ }
1089
+
1090
+ .json-property-item.boolean-property:after {
1091
+ content: '';
1092
+ position: absolute;
1093
+ top: 0;
1094
+ left: 0;
1095
+ right: 0;
1096
+ bottom: 0;
1097
+ z-index: 1;
1098
+ cursor: pointer;
1099
+ }
1100
+
1101
+ .json-property-item.boolean-property .checkbox-wrapper,
1102
+ .json-property-item.boolean-property .checkbox-label {
1103
+ background-color: transparent;
1104
+ cursor: pointer;
1105
+ padding: 0;
1106
+ margin: 0;
1107
+ position: relative;
1108
+ z-index: 2;
1109
+ }
1110
+
1111
+ .json-property-item.boolean-property .checkbox-wrapper:hover {
1112
+ background-color: transparent;
1113
+ }
1114
+
1115
+ .json-property-item.boolean-property .checkbox-text {
1116
+ cursor: pointer;
1117
+ position: relative;
1118
+ z-index: 2;
1119
+ }
1120
+
1121
+ .json-property-item.boolean-property .property-label {
1122
+ cursor: pointer;
1123
+ position: relative;
1124
+ z-index: 2;
1125
+ }
1126
+
1127
+ .json-property-item.boolean-property input[type="checkbox"] {
1128
+ cursor: pointer;
1129
+ margin-right: 8px;
1130
+ position: relative;
1131
+ z-index: 3;
1132
+ }
1133
+
1134
+ /* Add styling for Reset to Defaults button */
1135
+ #reset-to-defaults-button {
1136
+ margin-left: 10px;
1137
+ background-color: #e74c3c;
1138
+ color: #fff;
1139
+ border: none;
1140
+ }
1141
+
1142
+ #reset-to-defaults-button:hover {
1143
+ background-color: #c0392b;
1144
+ }
1145
+
1146
+ /* Add styling for Fix Corrupted Settings button */
1147
+ #fix-corrupted-button {
1148
+ margin-left: 10px;
1149
+ background-color: #3498db;
1150
+ color: #fff;
1151
+ border: none;
1152
+ }
1153
+
1154
+ #fix-corrupted-button:hover {
1155
+ background-color: #2980b9;
1156
+ }
1157
+
1158
+ .settings-item .checkbox-label {
1159
+ margin-top: 8px;
1160
+ padding-left: 0;
1161
+ }
1162
+
1163
+ /* Saving indicator styles */
1164
+ .saving {
1165
+ position: relative;
1166
+ }
1167
+
1168
+ .saving:before {
1169
+ content: '';
1170
+ position: absolute;
1171
+ left: -20px;
1172
+ top: 50%;
1173
+ transform: translateY(-50%);
1174
+ width: 10px;
1175
+ height: 10px;
1176
+ border: 2px solid rgba(100, 100, 255, 0.3);
1177
+ border-radius: 50%;
1178
+ border-top-color: #6060ff;
1179
+ animation: spinner 0.8s linear infinite;
1180
+ z-index: 10;
1181
+ }
1182
+
1183
+ .checkbox-label.saving:before {
1184
+ left: -20px;
1185
+ top: 50%;
1186
+ }
1187
+
1188
+ .settings-item.saving:before {
1189
+ left: -20px;
1190
+ }
1191
+
1192
+ .form-group.saving:before {
1193
+ left: -20px;
1194
+ }
1195
+
1196
+ @keyframes spinner {
1197
+ to {transform: translateY(-50%) rotate(360deg);}
1198
+ }
1199
+
1200
+ /* Add styles for alert container and close button */
1201
+ .settings-alert-container {
1202
+ margin-bottom: 1rem;
1203
+ width: 100%;
1204
+ }
1205
+
1206
+ .settings-alert-container .alert {
1207
+ position: relative;
1208
+ padding-right: 30px;
1209
+ }
1210
+
1211
+ .alert-close {
1212
+ position: absolute;
1213
+ right: 10px;
1214
+ top: 8px;
1215
+ font-size: 1.2rem;
1216
+ font-weight: bold;
1217
+ cursor: pointer;
1218
+ opacity: 0.7;
1219
+ }
1220
+
1221
+ .alert-close:hover {
1222
+ opacity: 1;
1223
+ }