vibesurf 0.1.9a6__py3-none-any.whl → 0.1.11__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.

Potentially problematic release.


This version of vibesurf might be problematic. Click here for more details.

Files changed (69) hide show
  1. vibe_surf/_version.py +2 -2
  2. vibe_surf/agents/browser_use_agent.py +68 -45
  3. vibe_surf/agents/prompts/report_writer_prompt.py +73 -0
  4. vibe_surf/agents/prompts/vibe_surf_prompt.py +85 -172
  5. vibe_surf/agents/report_writer_agent.py +380 -226
  6. vibe_surf/agents/vibe_surf_agent.py +878 -814
  7. vibe_surf/agents/views.py +130 -0
  8. vibe_surf/backend/api/activity.py +3 -1
  9. vibe_surf/backend/api/browser.py +70 -0
  10. vibe_surf/backend/api/config.py +8 -5
  11. vibe_surf/backend/api/files.py +59 -50
  12. vibe_surf/backend/api/models.py +2 -2
  13. vibe_surf/backend/api/task.py +47 -13
  14. vibe_surf/backend/database/manager.py +24 -18
  15. vibe_surf/backend/database/queries.py +199 -192
  16. vibe_surf/backend/database/schemas.py +1 -1
  17. vibe_surf/backend/main.py +80 -3
  18. vibe_surf/backend/shared_state.py +30 -35
  19. vibe_surf/backend/utils/encryption.py +3 -1
  20. vibe_surf/backend/utils/llm_factory.py +41 -36
  21. vibe_surf/browser/agent_browser_session.py +308 -62
  22. vibe_surf/browser/browser_manager.py +71 -100
  23. vibe_surf/browser/utils.py +5 -3
  24. vibe_surf/browser/watchdogs/dom_watchdog.py +0 -45
  25. vibe_surf/chrome_extension/background.js +88 -0
  26. vibe_surf/chrome_extension/manifest.json +3 -1
  27. vibe_surf/chrome_extension/scripts/api-client.js +13 -0
  28. vibe_surf/chrome_extension/scripts/file-manager.js +482 -0
  29. vibe_surf/chrome_extension/scripts/history-manager.js +658 -0
  30. vibe_surf/chrome_extension/scripts/modal-manager.js +487 -0
  31. vibe_surf/chrome_extension/scripts/session-manager.js +52 -11
  32. vibe_surf/chrome_extension/scripts/settings-manager.js +1214 -0
  33. vibe_surf/chrome_extension/scripts/ui-manager.js +1530 -3163
  34. vibe_surf/chrome_extension/sidepanel.html +47 -7
  35. vibe_surf/chrome_extension/styles/activity.css +934 -0
  36. vibe_surf/chrome_extension/styles/base.css +76 -0
  37. vibe_surf/chrome_extension/styles/history-modal.css +791 -0
  38. vibe_surf/chrome_extension/styles/input.css +568 -0
  39. vibe_surf/chrome_extension/styles/layout.css +186 -0
  40. vibe_surf/chrome_extension/styles/responsive.css +454 -0
  41. vibe_surf/chrome_extension/styles/settings-environment.css +165 -0
  42. vibe_surf/chrome_extension/styles/settings-forms.css +389 -0
  43. vibe_surf/chrome_extension/styles/settings-modal.css +141 -0
  44. vibe_surf/chrome_extension/styles/settings-profiles.css +244 -0
  45. vibe_surf/chrome_extension/styles/settings-responsive.css +144 -0
  46. vibe_surf/chrome_extension/styles/settings-utilities.css +25 -0
  47. vibe_surf/chrome_extension/styles/variables.css +54 -0
  48. vibe_surf/cli.py +5 -22
  49. vibe_surf/common.py +35 -0
  50. vibe_surf/llm/openai_compatible.py +148 -93
  51. vibe_surf/logger.py +99 -0
  52. vibe_surf/{controller/vibesurf_tools.py → tools/browser_use_tools.py} +233 -221
  53. vibe_surf/tools/file_system.py +415 -0
  54. vibe_surf/{controller → tools}/mcp_client.py +4 -3
  55. vibe_surf/tools/report_writer_tools.py +21 -0
  56. vibe_surf/tools/vibesurf_tools.py +657 -0
  57. vibe_surf/tools/views.py +120 -0
  58. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/METADATA +23 -3
  59. vibesurf-0.1.11.dist-info/RECORD +93 -0
  60. vibe_surf/chrome_extension/styles/main.css +0 -2338
  61. vibe_surf/chrome_extension/styles/settings.css +0 -1100
  62. vibe_surf/controller/file_system.py +0 -53
  63. vibe_surf/controller/views.py +0 -37
  64. vibesurf-0.1.9a6.dist-info/RECORD +0 -71
  65. /vibe_surf/{controller → tools}/__init__.py +0 -0
  66. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/WHEEL +0 -0
  67. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/entry_points.txt +0 -0
  68. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/licenses/LICENSE +0 -0
  69. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,165 @@
1
+ /* Environment Variables Management */
2
+
3
+ /* Environment Variables Tab */
4
+ .env-variables-container {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 16px;
8
+ }
9
+
10
+ .env-var-item {
11
+ display: flex;
12
+ gap: 12px;
13
+ align-items: flex-start;
14
+ padding: 16px;
15
+ background: var(--bg-secondary);
16
+ border: 1px solid var(--border-color);
17
+ border-radius: 8px;
18
+ }
19
+
20
+ .env-var-key,
21
+ .env-var-value {
22
+ flex: 1;
23
+ }
24
+
25
+ .readonly-input {
26
+ background-color: var(--bg-tertiary) !important;
27
+ color: var(--text-muted) !important;
28
+ cursor: not-allowed !important;
29
+ opacity: 0.7;
30
+ }
31
+
32
+ .readonly-input:focus {
33
+ outline: none !important;
34
+ box-shadow: none !important;
35
+ border-color: var(--border-color) !important;
36
+ }
37
+
38
+ .env-var-actions {
39
+ display: flex;
40
+ gap: 4px;
41
+ }
42
+
43
+ .env-var-btn {
44
+ width: 32px;
45
+ height: 32px;
46
+ border: none;
47
+ background: transparent;
48
+ color: var(--text-muted);
49
+ cursor: pointer;
50
+ border-radius: 6px;
51
+ transition: all 0.2s ease;
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ }
56
+
57
+ .env-var-btn:hover {
58
+ background: var(--bg-hover);
59
+ color: var(--text-primary);
60
+ }
61
+
62
+ .env-var-btn.delete:hover {
63
+ background: rgba(220, 53, 69, 0.1);
64
+ color: var(--danger-color);
65
+ }
66
+
67
+ .add-env-var-btn {
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: center;
71
+ gap: 8px;
72
+ width: 100%;
73
+ padding: 16px;
74
+ border: 1px dashed var(--border-color);
75
+ border-radius: 8px;
76
+ background: transparent;
77
+ color: var(--text-secondary);
78
+ font-size: 14px;
79
+ font-weight: 600;
80
+ cursor: pointer;
81
+ transition: all 0.3s ease;
82
+ }
83
+
84
+ .add-env-var-btn:hover {
85
+ border-color: var(--primary-color);
86
+ background: rgba(0, 122, 204, 0.05);
87
+ color: var(--primary-color);
88
+ }
89
+
90
+ /* Environment Variables Action Center */
91
+ .env-var-actions-center {
92
+ display: flex;
93
+ justify-content: center;
94
+ margin-top: 32px;
95
+ padding-top: 24px;
96
+ border-top: 1px solid var(--border-color);
97
+ }
98
+
99
+ .save-env-vars-btn-modern {
100
+ display: flex;
101
+ align-items: center;
102
+ gap: 12px;
103
+ padding: 16px 32px;
104
+ background: linear-gradient(135deg, var(--primary-color), var(--primary-hover));
105
+ color: white;
106
+ border: none;
107
+ border-radius: 12px;
108
+ font-size: 16px;
109
+ font-weight: 600;
110
+ cursor: pointer;
111
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
112
+ box-shadow: 0 4px 12px rgba(0, 122, 204, 0.2);
113
+ position: relative;
114
+ overflow: hidden;
115
+ }
116
+
117
+ .save-env-vars-btn-modern::before {
118
+ content: '';
119
+ position: absolute;
120
+ top: 0;
121
+ left: -100%;
122
+ width: 100%;
123
+ height: 100%;
124
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
125
+ transition: left 0.5s ease;
126
+ }
127
+
128
+ .save-env-vars-btn-modern:hover {
129
+ transform: translateY(-2px);
130
+ box-shadow: 0 8px 24px rgba(0, 122, 204, 0.3);
131
+ background: linear-gradient(135deg, var(--primary-hover), var(--primary-color));
132
+ }
133
+
134
+ .save-env-vars-btn-modern:hover::before {
135
+ left: 100%;
136
+ }
137
+
138
+ .save-env-vars-btn-modern:active {
139
+ transform: translateY(0);
140
+ box-shadow: 0 4px 12px rgba(0, 122, 204, 0.2);
141
+ }
142
+
143
+ .save-env-vars-btn-modern .btn-icon {
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: center;
147
+ width: 20px;
148
+ height: 20px;
149
+ }
150
+
151
+ .save-env-vars-btn-modern .btn-text {
152
+ font-weight: 600;
153
+ letter-spacing: 0.5px;
154
+ }
155
+
156
+ .save-env-vars-btn-modern:disabled {
157
+ opacity: 0.6;
158
+ cursor: not-allowed;
159
+ transform: none !important;
160
+ box-shadow: 0 4px 12px rgba(0, 122, 204, 0.1) !important;
161
+ }
162
+
163
+ .save-env-vars-btn-modern:disabled::before {
164
+ display: none;
165
+ }
@@ -0,0 +1,389 @@
1
+ /* Form Components and Validation */
2
+
3
+ /* Profile Form Modal */
4
+ .profile-form-modal {
5
+ position: fixed;
6
+ top: 0;
7
+ left: 0;
8
+ right: 0;
9
+ bottom: 0;
10
+ background: rgba(0, 0, 0, 0.5);
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ z-index: 10000;
15
+ backdrop-filter: blur(8px);
16
+ }
17
+
18
+ .profile-form-container {
19
+ background: var(--bg-primary);
20
+ border-radius: 16px;
21
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);
22
+ width: 90vw;
23
+ max-width: 600px;
24
+ max-height: 90vh;
25
+ overflow: hidden;
26
+ display: flex;
27
+ flex-direction: column;
28
+ }
29
+
30
+ .profile-form-header {
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: space-between;
34
+ padding: 24px 32px;
35
+ border-bottom: 1px solid var(--border-color);
36
+ background: linear-gradient(135deg, var(--bg-primary), var(--bg-secondary));
37
+ }
38
+
39
+ .profile-form-header h3 {
40
+ font-size: 20px;
41
+ font-weight: 600;
42
+ color: var(--text-primary);
43
+ margin: 0;
44
+ }
45
+
46
+ .profile-form-close {
47
+ width: 32px;
48
+ height: 32px;
49
+ border: none;
50
+ background: transparent;
51
+ color: var(--text-secondary);
52
+ cursor: pointer;
53
+ border-radius: 8px;
54
+ transition: all 0.2s ease;
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ }
59
+
60
+ .profile-form-close:hover {
61
+ background: var(--bg-hover);
62
+ color: var(--text-primary);
63
+ }
64
+
65
+ .profile-form-content {
66
+ flex: 1;
67
+ padding: 32px;
68
+ overflow-y: auto;
69
+ }
70
+
71
+ /* Form Groups and Labels */
72
+ .form-group {
73
+ margin-bottom: 24px;
74
+ }
75
+
76
+ .form-label {
77
+ display: block;
78
+ font-size: 14px;
79
+ font-weight: 600;
80
+ color: var(--text-primary);
81
+ margin-bottom: 8px;
82
+ }
83
+
84
+ .form-label.required::after {
85
+ content: ' *';
86
+ color: var(--danger-color);
87
+ }
88
+
89
+ /* Form Inputs */
90
+ .form-input,
91
+ .form-select,
92
+ .form-textarea {
93
+ width: 100%;
94
+ padding: 12px 16px;
95
+ border: 1px solid var(--border-color);
96
+ border-radius: 8px;
97
+ background: var(--bg-primary);
98
+ font-size: 14px;
99
+ color: var(--text-primary);
100
+ transition: all 0.3s ease;
101
+ font-family: inherit;
102
+ }
103
+
104
+ .form-input:focus,
105
+ .form-select:focus,
106
+ .form-textarea:focus {
107
+ outline: none;
108
+ border-color: var(--primary-color);
109
+ box-shadow: 0 0 0 3px rgba(0, 122, 204, 0.1);
110
+ }
111
+
112
+ .form-textarea {
113
+ resize: vertical;
114
+ min-height: 80px;
115
+ }
116
+
117
+ .form-help {
118
+ font-size: 12px;
119
+ color: var(--text-muted);
120
+ margin-top: 4px;
121
+ line-height: 1.4;
122
+ }
123
+
124
+ /* API Key Field with Toggle */
125
+ .api-key-field {
126
+ position: relative;
127
+ }
128
+
129
+ .api-key-toggle {
130
+ position: absolute;
131
+ right: 12px;
132
+ top: 50%;
133
+ transform: translateY(-50%);
134
+ background: none;
135
+ border: none;
136
+ color: var(--text-muted);
137
+ cursor: pointer;
138
+ padding: 4px;
139
+ border-radius: 4px;
140
+ transition: all 0.2s ease;
141
+ }
142
+
143
+ .api-key-toggle:hover {
144
+ color: var(--text-primary);
145
+ background: var(--bg-hover);
146
+ }
147
+
148
+ .api-key-input {
149
+ padding-right: 40px;
150
+ }
151
+
152
+ /* Form Actions */
153
+ .profile-form-actions {
154
+ display: flex;
155
+ gap: 12px;
156
+ justify-content: flex-end;
157
+ padding: 24px 32px;
158
+ border-top: 1px solid var(--border-color);
159
+ background: var(--bg-secondary);
160
+ }
161
+
162
+ .form-btn {
163
+ padding: 12px 24px;
164
+ border: none;
165
+ border-radius: 8px;
166
+ font-size: 14px;
167
+ font-weight: 600;
168
+ cursor: pointer;
169
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
170
+ min-width: 100px;
171
+ }
172
+
173
+ .form-btn.primary {
174
+ background: var(--primary-color);
175
+ color: white;
176
+ }
177
+
178
+ .form-btn.primary:hover {
179
+ background: var(--primary-hover);
180
+ transform: translateY(-1px);
181
+ box-shadow: 0 4px 16px rgba(0, 122, 204, 0.3);
182
+ }
183
+
184
+ .form-btn.secondary {
185
+ background: var(--bg-primary);
186
+ color: var(--text-primary);
187
+ border: 1px solid var(--border-color);
188
+ }
189
+
190
+ .form-btn.secondary:hover {
191
+ background: var(--bg-hover);
192
+ border-color: var(--border-hover);
193
+ }
194
+
195
+ .form-btn:disabled {
196
+ opacity: 0.5;
197
+ cursor: not-allowed;
198
+ transform: none !important;
199
+ box-shadow: none !important;
200
+ }
201
+
202
+ /* Success/Error Messages */
203
+ .form-message {
204
+ padding: 12px 16px;
205
+ border-radius: 8px;
206
+ margin-bottom: 16px;
207
+ font-size: 14px;
208
+ font-weight: 500;
209
+ }
210
+
211
+ .form-message.success {
212
+ background: rgba(40, 167, 69, 0.1);
213
+ color: var(--accent-color);
214
+ border: 1px solid rgba(40, 167, 69, 0.3);
215
+ }
216
+
217
+ .form-message.error {
218
+ background: rgba(220, 53, 69, 0.1);
219
+ color: var(--danger-color);
220
+ border: 1px solid rgba(220, 53, 69, 0.3);
221
+ }
222
+
223
+ /* Form Validation */
224
+ .form-input.error,
225
+ .form-select.error,
226
+ .form-textarea.error {
227
+ border-color: var(--danger-color);
228
+ box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1);
229
+ }
230
+
231
+ .form-error {
232
+ font-size: 12px;
233
+ color: var(--danger-color);
234
+ margin-top: 4px;
235
+ display: flex;
236
+ align-items: center;
237
+ gap: 4px;
238
+ }
239
+
240
+ .form-error::before {
241
+ content: '⚠️';
242
+ font-size: 10px;
243
+ }
244
+
245
+ /* JSON Validation Styles */
246
+ .json-input {
247
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
248
+ font-size: 13px;
249
+ line-height: 1.5;
250
+ tab-size: 2;
251
+ }
252
+
253
+ .json-input.json-valid {
254
+ border-color: var(--accent-color);
255
+ box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.1);
256
+ }
257
+
258
+ .json-input.json-invalid {
259
+ border-color: var(--danger-color);
260
+ box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1);
261
+ }
262
+
263
+ .json-validation-feedback {
264
+ margin-top: 8px;
265
+ font-size: 13px;
266
+ font-weight: 500;
267
+ min-height: 20px;
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 6px;
271
+ }
272
+
273
+ .json-success {
274
+ color: var(--accent-color);
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 6px;
278
+ }
279
+
280
+ .json-success::before {
281
+ content: '✓';
282
+ font-weight: bold;
283
+ font-size: 14px;
284
+ }
285
+
286
+ .json-error {
287
+ color: var(--danger-color);
288
+ display: flex;
289
+ align-items: center;
290
+ gap: 6px;
291
+ }
292
+
293
+ .json-error::before {
294
+ content: '✗';
295
+ font-weight: bold;
296
+ font-size: 14px;
297
+ }
298
+
299
+ /* JSON syntax highlighting for better UX */
300
+ .json-input:focus {
301
+ background: var(--bg-primary);
302
+ }
303
+
304
+ .json-input:invalid {
305
+ border-color: var(--danger-color);
306
+ }
307
+
308
+ /* Enhanced form textarea for JSON */
309
+ .form-textarea.json-input {
310
+ resize: vertical;
311
+ min-height: 120px;
312
+ white-space: pre;
313
+ word-wrap: break-word;
314
+ }
315
+
316
+ /* JSON validation feedback animations */
317
+ .json-validation-feedback {
318
+ opacity: 0;
319
+ transform: translateY(-4px);
320
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
321
+ }
322
+
323
+ .json-validation-feedback:not(:empty) {
324
+ opacity: 1;
325
+ transform: translateY(0);
326
+ }
327
+
328
+ /* Uploaded Files List Styles */
329
+ .uploaded-files-container {
330
+ margin-top: 4px;
331
+ margin-bottom: 4px;
332
+ display: none;
333
+ }
334
+
335
+ .files-items {
336
+ display: flex;
337
+ flex-wrap: wrap;
338
+ gap: 4px;
339
+ }
340
+
341
+ .file-item {
342
+ display: inline-flex;
343
+ align-items: center;
344
+ gap: 4px;
345
+ padding: 2px 6px;
346
+ background: #f0f0f0;
347
+ border: 1px solid #d0d0d0;
348
+ border-radius: 12px;
349
+ font-size: 11px;
350
+ color: #555;
351
+ max-width: 150px;
352
+ }
353
+
354
+ .file-item:hover {
355
+ background: #e8e8e8;
356
+ }
357
+
358
+ .file-name {
359
+ white-space: nowrap;
360
+ overflow: hidden;
361
+ text-overflow: ellipsis;
362
+ flex: 1;
363
+ min-width: 0;
364
+ }
365
+
366
+ .file-remove-btn {
367
+ background: #999;
368
+ color: white;
369
+ border: none;
370
+ border-radius: 50%;
371
+ width: 14px;
372
+ height: 14px;
373
+ font-size: 10px;
374
+ font-weight: bold;
375
+ cursor: pointer;
376
+ display: flex;
377
+ align-items: center;
378
+ justify-content: center;
379
+ transition: background-color 0.2s ease;
380
+ flex-shrink: 0;
381
+ }
382
+
383
+ .file-remove-btn:hover {
384
+ background: #666;
385
+ }
386
+
387
+ .file-remove-btn:active {
388
+ transform: scale(0.9);
389
+ }
@@ -0,0 +1,141 @@
1
+ /* Settings Modal Structure and Tab Navigation */
2
+
3
+ /* Settings Modal Container */
4
+ .settings-modal-content {
5
+ width: 92vw;
6
+ max-width: 1000px;
7
+ min-height: 75vh;
8
+ max-height: 90vh;
9
+ display: flex;
10
+ flex-direction: column;
11
+ border-radius: 16px;
12
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
13
+ background: var(--bg-primary);
14
+ border: 1px solid var(--border-color);
15
+ overflow: hidden;
16
+ }
17
+
18
+ /* Settings Header */
19
+ .settings-header {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ padding: 24px 32px;
24
+ border-bottom: 2px solid var(--border-color);
25
+ background: linear-gradient(135deg, var(--bg-primary), var(--bg-secondary));
26
+ }
27
+
28
+ .settings-header h3 {
29
+ font-size: 24px;
30
+ font-weight: 700;
31
+ color: var(--text-primary);
32
+ margin: 0;
33
+ letter-spacing: -0.5px;
34
+ }
35
+
36
+ /* Settings Title with Logo */
37
+ .settings-title {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: var(--spacing-sm);
41
+ font-size: 24px;
42
+ font-weight: 700;
43
+ color: var(--text-primary);
44
+ margin: 0;
45
+ letter-spacing: -0.5px;
46
+ }
47
+
48
+ .settings-logo {
49
+ width: 28px;
50
+ height: 28px;
51
+ border-radius: var(--radius-sm);
52
+ object-fit: contain;
53
+ flex-shrink: 0;
54
+ }
55
+
56
+ /* Tab Navigation */
57
+ .settings-tabs {
58
+ display: flex;
59
+ background: var(--bg-secondary);
60
+ border-bottom: 1px solid var(--border-color);
61
+ overflow-x: auto;
62
+ }
63
+
64
+ .settings-tab {
65
+ flex: 1;
66
+ padding: 16px 24px;
67
+ border: none;
68
+ background: transparent;
69
+ color: var(--text-secondary);
70
+ font-size: 15px;
71
+ font-weight: 600;
72
+ cursor: pointer;
73
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
74
+ position: relative;
75
+ white-space: nowrap;
76
+ min-width: 150px;
77
+ }
78
+
79
+ .settings-tab::before {
80
+ content: '';
81
+ position: absolute;
82
+ bottom: 0;
83
+ left: 0;
84
+ right: 0;
85
+ height: 3px;
86
+ background: var(--primary-color);
87
+ transform: scaleX(0);
88
+ transition: transform 0.3s ease;
89
+ }
90
+
91
+ .settings-tab:hover {
92
+ color: var(--text-primary);
93
+ background: rgba(0, 122, 204, 0.05);
94
+ }
95
+
96
+ .settings-tab.active {
97
+ color: var(--primary-color);
98
+ background: var(--bg-primary);
99
+ }
100
+
101
+ .settings-tab.active::before {
102
+ transform: scaleX(1);
103
+ }
104
+
105
+ /* Tab Content Container */
106
+ .settings-content {
107
+ flex: 1;
108
+ overflow: hidden;
109
+ display: flex;
110
+ flex-direction: column;
111
+ }
112
+
113
+ .settings-tab-content {
114
+ flex: 1;
115
+ padding: 32px;
116
+ overflow-y: auto;
117
+ display: none;
118
+ }
119
+
120
+ .settings-tab-content.active {
121
+ display: flex;
122
+ flex-direction: column;
123
+ }
124
+
125
+ .settings-tab-content::-webkit-scrollbar {
126
+ width: 8px;
127
+ }
128
+
129
+ .settings-tab-content::-webkit-scrollbar-track {
130
+ background: var(--bg-tertiary);
131
+ border-radius: 4px;
132
+ }
133
+
134
+ .settings-tab-content::-webkit-scrollbar-thumb {
135
+ background: var(--border-color);
136
+ border-radius: 4px;
137
+ }
138
+
139
+ .settings-tab-content::-webkit-scrollbar-thumb:hover {
140
+ background: var(--text-secondary);
141
+ }