vibesurf 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.

Potentially problematic release.


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

Files changed (70) hide show
  1. vibe_surf/__init__.py +12 -0
  2. vibe_surf/_version.py +34 -0
  3. vibe_surf/agents/__init__.py +0 -0
  4. vibe_surf/agents/browser_use_agent.py +1106 -0
  5. vibe_surf/agents/prompts/__init__.py +1 -0
  6. vibe_surf/agents/prompts/vibe_surf_prompt.py +176 -0
  7. vibe_surf/agents/report_writer_agent.py +360 -0
  8. vibe_surf/agents/vibe_surf_agent.py +1632 -0
  9. vibe_surf/backend/__init__.py +0 -0
  10. vibe_surf/backend/api/__init__.py +3 -0
  11. vibe_surf/backend/api/activity.py +243 -0
  12. vibe_surf/backend/api/config.py +740 -0
  13. vibe_surf/backend/api/files.py +322 -0
  14. vibe_surf/backend/api/models.py +257 -0
  15. vibe_surf/backend/api/task.py +300 -0
  16. vibe_surf/backend/database/__init__.py +13 -0
  17. vibe_surf/backend/database/manager.py +129 -0
  18. vibe_surf/backend/database/models.py +164 -0
  19. vibe_surf/backend/database/queries.py +922 -0
  20. vibe_surf/backend/database/schemas.py +100 -0
  21. vibe_surf/backend/llm_config.py +182 -0
  22. vibe_surf/backend/main.py +137 -0
  23. vibe_surf/backend/migrations/__init__.py +16 -0
  24. vibe_surf/backend/migrations/init_db.py +303 -0
  25. vibe_surf/backend/migrations/seed_data.py +236 -0
  26. vibe_surf/backend/shared_state.py +601 -0
  27. vibe_surf/backend/utils/__init__.py +7 -0
  28. vibe_surf/backend/utils/encryption.py +164 -0
  29. vibe_surf/backend/utils/llm_factory.py +225 -0
  30. vibe_surf/browser/__init__.py +8 -0
  31. vibe_surf/browser/agen_browser_profile.py +130 -0
  32. vibe_surf/browser/agent_browser_session.py +416 -0
  33. vibe_surf/browser/browser_manager.py +296 -0
  34. vibe_surf/browser/utils.py +790 -0
  35. vibe_surf/browser/watchdogs/__init__.py +0 -0
  36. vibe_surf/browser/watchdogs/action_watchdog.py +291 -0
  37. vibe_surf/browser/watchdogs/dom_watchdog.py +954 -0
  38. vibe_surf/chrome_extension/background.js +558 -0
  39. vibe_surf/chrome_extension/config.js +48 -0
  40. vibe_surf/chrome_extension/content.js +284 -0
  41. vibe_surf/chrome_extension/dev-reload.js +47 -0
  42. vibe_surf/chrome_extension/icons/convert-svg.js +33 -0
  43. vibe_surf/chrome_extension/icons/logo-preview.html +187 -0
  44. vibe_surf/chrome_extension/icons/logo.png +0 -0
  45. vibe_surf/chrome_extension/manifest.json +53 -0
  46. vibe_surf/chrome_extension/popup.html +134 -0
  47. vibe_surf/chrome_extension/scripts/api-client.js +473 -0
  48. vibe_surf/chrome_extension/scripts/main.js +491 -0
  49. vibe_surf/chrome_extension/scripts/markdown-it.min.js +3 -0
  50. vibe_surf/chrome_extension/scripts/session-manager.js +599 -0
  51. vibe_surf/chrome_extension/scripts/ui-manager.js +3687 -0
  52. vibe_surf/chrome_extension/sidepanel.html +347 -0
  53. vibe_surf/chrome_extension/styles/animations.css +471 -0
  54. vibe_surf/chrome_extension/styles/components.css +670 -0
  55. vibe_surf/chrome_extension/styles/main.css +2307 -0
  56. vibe_surf/chrome_extension/styles/settings.css +1100 -0
  57. vibe_surf/cli.py +357 -0
  58. vibe_surf/controller/__init__.py +0 -0
  59. vibe_surf/controller/file_system.py +53 -0
  60. vibe_surf/controller/mcp_client.py +68 -0
  61. vibe_surf/controller/vibesurf_controller.py +616 -0
  62. vibe_surf/controller/views.py +37 -0
  63. vibe_surf/llm/__init__.py +21 -0
  64. vibe_surf/llm/openai_compatible.py +237 -0
  65. vibesurf-0.1.0.dist-info/METADATA +97 -0
  66. vibesurf-0.1.0.dist-info/RECORD +70 -0
  67. vibesurf-0.1.0.dist-info/WHEEL +5 -0
  68. vibesurf-0.1.0.dist-info/entry_points.txt +2 -0
  69. vibesurf-0.1.0.dist-info/licenses/LICENSE +201 -0
  70. vibesurf-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1100 @@
1
+ /* Settings Modal Styles - Modern Three-Tab Design */
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
+ }
142
+
143
+ /* Profile Cards */
144
+ .profiles-container {
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 16px;
148
+ margin-bottom: 24px;
149
+ }
150
+
151
+ .profile-card {
152
+ background: var(--bg-secondary);
153
+ border: 1px solid var(--border-color);
154
+ border-radius: 12px;
155
+ padding: 20px;
156
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
157
+ position: relative;
158
+ overflow: hidden;
159
+ }
160
+
161
+ .profile-card::before {
162
+ content: '';
163
+ position: absolute;
164
+ top: 0;
165
+ left: 0;
166
+ right: 0;
167
+ height: 4px;
168
+ background: linear-gradient(90deg, var(--primary-color), var(--accent-color));
169
+ transform: scaleX(0);
170
+ transition: transform 0.3s ease;
171
+ }
172
+
173
+ .profile-card:hover {
174
+ border-color: var(--primary-color);
175
+ background: var(--bg-hover);
176
+ transform: translateY(-2px);
177
+ box-shadow: 0 8px 24px rgba(0, 122, 204, 0.15);
178
+ }
179
+
180
+ .profile-card:hover::before {
181
+ transform: scaleX(1);
182
+ }
183
+
184
+ .profile-header {
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: space-between;
188
+ margin-bottom: 12px;
189
+ }
190
+
191
+ .profile-name {
192
+ font-size: 18px;
193
+ font-weight: 600;
194
+ color: var(--text-primary);
195
+ margin: 0;
196
+ }
197
+
198
+ .profile-badges {
199
+ display: flex;
200
+ align-items: center;
201
+ gap: 8px;
202
+ }
203
+
204
+ .profile-badge {
205
+ padding: 4px 10px;
206
+ border-radius: 8px;
207
+ font-size: 12px;
208
+ font-weight: 600;
209
+ text-transform: uppercase;
210
+ letter-spacing: 0.5px;
211
+ }
212
+
213
+ .profile-badge.default {
214
+ background: linear-gradient(135deg, rgba(40, 167, 69, 0.1), rgba(40, 167, 69, 0.2));
215
+ color: var(--accent-color);
216
+ border: 1px solid rgba(40, 167, 69, 0.3);
217
+ }
218
+
219
+ .profile-badge.active {
220
+ background: linear-gradient(135deg, rgba(0, 122, 204, 0.1), rgba(0, 122, 204, 0.2));
221
+ color: var(--primary-color);
222
+ border: 1px solid rgba(0, 122, 204, 0.3);
223
+ }
224
+
225
+ .profile-badge.inactive {
226
+ background: linear-gradient(135deg, rgba(108, 117, 125, 0.1), rgba(108, 117, 125, 0.2));
227
+ color: var(--text-muted);
228
+ border: 1px solid rgba(108, 117, 125, 0.3);
229
+ }
230
+
231
+ .profile-details {
232
+ font-size: 14px;
233
+ color: var(--text-secondary);
234
+ margin-bottom: 16px;
235
+ line-height: 1.5;
236
+ }
237
+
238
+ .profile-meta {
239
+ display: grid;
240
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
241
+ gap: 12px;
242
+ margin-bottom: 16px;
243
+ }
244
+
245
+ .profile-meta-item {
246
+ display: flex;
247
+ flex-direction: column;
248
+ }
249
+
250
+ .profile-meta-label {
251
+ font-size: 12px;
252
+ font-weight: 600;
253
+ color: var(--text-muted);
254
+ text-transform: uppercase;
255
+ letter-spacing: 0.5px;
256
+ margin-bottom: 4px;
257
+ }
258
+
259
+ .profile-meta-value {
260
+ font-size: 14px;
261
+ color: var(--text-primary);
262
+ font-weight: 500;
263
+ word-break: break-word;
264
+ }
265
+
266
+ .profile-actions {
267
+ display: flex;
268
+ gap: 8px;
269
+ justify-content: flex-end;
270
+ }
271
+
272
+ .profile-btn {
273
+ padding: 8px 16px;
274
+ border: 1px solid var(--border-color);
275
+ border-radius: 8px;
276
+ background: var(--bg-primary);
277
+ color: var(--text-primary);
278
+ font-size: 13px;
279
+ font-weight: 600;
280
+ cursor: pointer;
281
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
282
+ }
283
+
284
+ .profile-btn:hover {
285
+ transform: translateY(-1px);
286
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
287
+ }
288
+
289
+ .profile-btn.edit {
290
+ border-color: var(--primary-color);
291
+ color: var(--primary-color);
292
+ }
293
+
294
+ .profile-btn.edit:hover {
295
+ background: var(--primary-color);
296
+ color: white;
297
+ }
298
+
299
+ .profile-btn.delete {
300
+ border-color: var(--danger-color);
301
+ color: var(--danger-color);
302
+ }
303
+
304
+ .profile-btn.delete:hover {
305
+ background: var(--danger-color);
306
+ color: white;
307
+ }
308
+
309
+ .profile-btn.toggle {
310
+ border-color: var(--accent-color);
311
+ color: var(--accent-color);
312
+ }
313
+
314
+ .profile-btn.toggle:hover {
315
+ background: var(--accent-color);
316
+ color: white;
317
+ }
318
+
319
+ /* Add Profile Button */
320
+ .add-profile-btn {
321
+ display: flex;
322
+ align-items: center;
323
+ justify-content: center;
324
+ gap: 12px;
325
+ width: 100%;
326
+ padding: 20px;
327
+ border: 2px dashed var(--border-color);
328
+ border-radius: 12px;
329
+ background: linear-gradient(135deg, var(--bg-secondary), var(--bg-tertiary));
330
+ color: var(--text-secondary);
331
+ font-size: 16px;
332
+ font-weight: 600;
333
+ cursor: pointer;
334
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
335
+ margin-top: 16px;
336
+ }
337
+
338
+ .add-profile-btn:hover {
339
+ border-color: var(--primary-color);
340
+ background: linear-gradient(135deg, var(--bg-hover), var(--bg-secondary));
341
+ color: var(--primary-color);
342
+ transform: translateY(-2px);
343
+ box-shadow: 0 8px 24px rgba(0, 122, 204, 0.15);
344
+ }
345
+
346
+ .add-profile-btn svg {
347
+ width: 20px;
348
+ height: 20px;
349
+ }
350
+
351
+ /* Empty State */
352
+ .profiles-empty-state {
353
+ display: flex;
354
+ flex-direction: column;
355
+ align-items: center;
356
+ justify-content: center;
357
+ padding: 60px 40px;
358
+ text-align: center;
359
+ color: var(--text-muted);
360
+ background: linear-gradient(135deg, var(--bg-secondary), var(--bg-tertiary));
361
+ border-radius: 16px;
362
+ border: 2px dashed var(--border-color);
363
+ margin-bottom: 24px;
364
+ }
365
+
366
+ .profiles-empty-icon {
367
+ font-size: 64px;
368
+ margin-bottom: 20px;
369
+ opacity: 0.6;
370
+ }
371
+
372
+ .profiles-empty-title {
373
+ font-size: 20px;
374
+ font-weight: 600;
375
+ color: var(--text-secondary);
376
+ margin-bottom: 12px;
377
+ }
378
+
379
+ .profiles-empty-description {
380
+ font-size: 15px;
381
+ line-height: 1.6;
382
+ opacity: 0.8;
383
+ max-width: 320px;
384
+ }
385
+
386
+ /* Profile Form Modal */
387
+ .profile-form-modal {
388
+ position: fixed;
389
+ top: 0;
390
+ left: 0;
391
+ right: 0;
392
+ bottom: 0;
393
+ background: rgba(0, 0, 0, 0.5);
394
+ display: flex;
395
+ align-items: center;
396
+ justify-content: center;
397
+ z-index: 10000;
398
+ backdrop-filter: blur(8px);
399
+ }
400
+
401
+ .profile-form-container {
402
+ background: var(--bg-primary);
403
+ border-radius: 16px;
404
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);
405
+ width: 90vw;
406
+ max-width: 600px;
407
+ max-height: 90vh;
408
+ overflow: hidden;
409
+ display: flex;
410
+ flex-direction: column;
411
+ }
412
+
413
+ .profile-form-header {
414
+ display: flex;
415
+ align-items: center;
416
+ justify-content: space-between;
417
+ padding: 24px 32px;
418
+ border-bottom: 1px solid var(--border-color);
419
+ background: linear-gradient(135deg, var(--bg-primary), var(--bg-secondary));
420
+ }
421
+
422
+ .profile-form-header h3 {
423
+ font-size: 20px;
424
+ font-weight: 600;
425
+ color: var(--text-primary);
426
+ margin: 0;
427
+ }
428
+
429
+ .profile-form-close {
430
+ width: 32px;
431
+ height: 32px;
432
+ border: none;
433
+ background: transparent;
434
+ color: var(--text-secondary);
435
+ cursor: pointer;
436
+ border-radius: 8px;
437
+ transition: all 0.2s ease;
438
+ display: flex;
439
+ align-items: center;
440
+ justify-content: center;
441
+ }
442
+
443
+ .profile-form-close:hover {
444
+ background: var(--bg-hover);
445
+ color: var(--text-primary);
446
+ }
447
+
448
+ .profile-form-content {
449
+ flex: 1;
450
+ padding: 32px;
451
+ overflow-y: auto;
452
+ }
453
+
454
+ .form-group {
455
+ margin-bottom: 24px;
456
+ }
457
+
458
+ .form-label {
459
+ display: block;
460
+ font-size: 14px;
461
+ font-weight: 600;
462
+ color: var(--text-primary);
463
+ margin-bottom: 8px;
464
+ }
465
+
466
+ .form-label.required::after {
467
+ content: ' *';
468
+ color: var(--danger-color);
469
+ }
470
+
471
+ .form-input,
472
+ .form-select,
473
+ .form-textarea {
474
+ width: 100%;
475
+ padding: 12px 16px;
476
+ border: 1px solid var(--border-color);
477
+ border-radius: 8px;
478
+ background: var(--bg-primary);
479
+ font-size: 14px;
480
+ color: var(--text-primary);
481
+ transition: all 0.3s ease;
482
+ font-family: inherit;
483
+ }
484
+
485
+ .form-input:focus,
486
+ .form-select:focus,
487
+ .form-textarea:focus {
488
+ outline: none;
489
+ border-color: var(--primary-color);
490
+ box-shadow: 0 0 0 3px rgba(0, 122, 204, 0.1);
491
+ }
492
+
493
+ .form-textarea {
494
+ resize: vertical;
495
+ min-height: 80px;
496
+ }
497
+
498
+ .form-help {
499
+ font-size: 12px;
500
+ color: var(--text-muted);
501
+ margin-top: 4px;
502
+ line-height: 1.4;
503
+ }
504
+
505
+ /* API Key Field with Toggle */
506
+ .api-key-field {
507
+ position: relative;
508
+ }
509
+
510
+ .api-key-toggle {
511
+ position: absolute;
512
+ right: 12px;
513
+ top: 50%;
514
+ transform: translateY(-50%);
515
+ background: none;
516
+ border: none;
517
+ color: var(--text-muted);
518
+ cursor: pointer;
519
+ padding: 4px;
520
+ border-radius: 4px;
521
+ transition: all 0.2s ease;
522
+ }
523
+
524
+ .api-key-toggle:hover {
525
+ color: var(--text-primary);
526
+ background: var(--bg-hover);
527
+ }
528
+
529
+ .api-key-input {
530
+ padding-right: 40px;
531
+ }
532
+
533
+ /* Form Actions */
534
+ .profile-form-actions {
535
+ display: flex;
536
+ gap: 12px;
537
+ justify-content: flex-end;
538
+ padding: 24px 32px;
539
+ border-top: 1px solid var(--border-color);
540
+ background: var(--bg-secondary);
541
+ }
542
+
543
+ .form-btn {
544
+ padding: 12px 24px;
545
+ border: none;
546
+ border-radius: 8px;
547
+ font-size: 14px;
548
+ font-weight: 600;
549
+ cursor: pointer;
550
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
551
+ min-width: 100px;
552
+ }
553
+
554
+ .form-btn.primary {
555
+ background: var(--primary-color);
556
+ color: white;
557
+ }
558
+
559
+ .form-btn.primary:hover {
560
+ background: var(--primary-hover);
561
+ transform: translateY(-1px);
562
+ box-shadow: 0 4px 16px rgba(0, 122, 204, 0.3);
563
+ }
564
+
565
+ .form-btn.secondary {
566
+ background: var(--bg-primary);
567
+ color: var(--text-primary);
568
+ border: 1px solid var(--border-color);
569
+ }
570
+
571
+ .form-btn.secondary:hover {
572
+ background: var(--bg-hover);
573
+ border-color: var(--border-hover);
574
+ }
575
+
576
+ .form-btn:disabled {
577
+ opacity: 0.5;
578
+ cursor: not-allowed;
579
+ transform: none !important;
580
+ box-shadow: none !important;
581
+ }
582
+
583
+ /* Environment Variables Tab */
584
+ .env-variables-container {
585
+ display: flex;
586
+ flex-direction: column;
587
+ gap: 16px;
588
+ }
589
+
590
+ .env-var-item {
591
+ display: flex;
592
+ gap: 12px;
593
+ align-items: flex-start;
594
+ padding: 16px;
595
+ background: var(--bg-secondary);
596
+ border: 1px solid var(--border-color);
597
+ border-radius: 8px;
598
+ }
599
+
600
+ .env-var-key,
601
+ .env-var-value {
602
+ flex: 1;
603
+ }
604
+
605
+ .readonly-input {
606
+ background-color: var(--bg-tertiary) !important;
607
+ color: var(--text-muted) !important;
608
+ cursor: not-allowed !important;
609
+ opacity: 0.7;
610
+ }
611
+
612
+ .readonly-input:focus {
613
+ outline: none !important;
614
+ box-shadow: none !important;
615
+ border-color: var(--border-color) !important;
616
+ }
617
+
618
+ .env-var-actions {
619
+ display: flex;
620
+ gap: 4px;
621
+ }
622
+
623
+ .env-var-btn {
624
+ width: 32px;
625
+ height: 32px;
626
+ border: none;
627
+ background: transparent;
628
+ color: var(--text-muted);
629
+ cursor: pointer;
630
+ border-radius: 6px;
631
+ transition: all 0.2s ease;
632
+ display: flex;
633
+ align-items: center;
634
+ justify-content: center;
635
+ }
636
+
637
+ .env-var-btn:hover {
638
+ background: var(--bg-hover);
639
+ color: var(--text-primary);
640
+ }
641
+
642
+ .env-var-btn.delete:hover {
643
+ background: rgba(220, 53, 69, 0.1);
644
+ color: var(--danger-color);
645
+ }
646
+
647
+ .add-env-var-btn {
648
+ display: flex;
649
+ align-items: center;
650
+ justify-content: center;
651
+ gap: 8px;
652
+ width: 100%;
653
+ padding: 16px;
654
+ border: 1px dashed var(--border-color);
655
+ border-radius: 8px;
656
+ background: transparent;
657
+ color: var(--text-secondary);
658
+ font-size: 14px;
659
+ font-weight: 600;
660
+ cursor: pointer;
661
+ transition: all 0.3s ease;
662
+ }
663
+
664
+ .add-env-var-btn:hover {
665
+ border-color: var(--primary-color);
666
+ background: rgba(0, 122, 204, 0.05);
667
+ color: var(--primary-color);
668
+ }
669
+
670
+ /* Environment Variables Action Center */
671
+ .env-var-actions-center {
672
+ display: flex;
673
+ justify-content: center;
674
+ margin-top: 32px;
675
+ padding-top: 24px;
676
+ border-top: 1px solid var(--border-color);
677
+ }
678
+
679
+ .save-env-vars-btn-modern {
680
+ display: flex;
681
+ align-items: center;
682
+ gap: 12px;
683
+ padding: 16px 32px;
684
+ background: linear-gradient(135deg, var(--primary-color), var(--primary-hover));
685
+ color: white;
686
+ border: none;
687
+ border-radius: 12px;
688
+ font-size: 16px;
689
+ font-weight: 600;
690
+ cursor: pointer;
691
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
692
+ box-shadow: 0 4px 12px rgba(0, 122, 204, 0.2);
693
+ position: relative;
694
+ overflow: hidden;
695
+ }
696
+
697
+ .save-env-vars-btn-modern::before {
698
+ content: '';
699
+ position: absolute;
700
+ top: 0;
701
+ left: -100%;
702
+ width: 100%;
703
+ height: 100%;
704
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
705
+ transition: left 0.5s ease;
706
+ }
707
+
708
+ .save-env-vars-btn-modern:hover {
709
+ transform: translateY(-2px);
710
+ box-shadow: 0 8px 24px rgba(0, 122, 204, 0.3);
711
+ background: linear-gradient(135deg, var(--primary-hover), var(--primary-color));
712
+ }
713
+
714
+ .save-env-vars-btn-modern:hover::before {
715
+ left: 100%;
716
+ }
717
+
718
+ .save-env-vars-btn-modern:active {
719
+ transform: translateY(0);
720
+ box-shadow: 0 4px 12px rgba(0, 122, 204, 0.2);
721
+ }
722
+
723
+ .save-env-vars-btn-modern .btn-icon {
724
+ display: flex;
725
+ align-items: center;
726
+ justify-content: center;
727
+ width: 20px;
728
+ height: 20px;
729
+ }
730
+
731
+ .save-env-vars-btn-modern .btn-text {
732
+ font-weight: 600;
733
+ letter-spacing: 0.5px;
734
+ }
735
+
736
+ .save-env-vars-btn-modern:disabled {
737
+ opacity: 0.6;
738
+ cursor: not-allowed;
739
+ transform: none !important;
740
+ box-shadow: 0 4px 12px rgba(0, 122, 204, 0.1) !important;
741
+ }
742
+
743
+ .save-env-vars-btn-modern:disabled::before {
744
+ display: none;
745
+ }
746
+
747
+ /* Responsive Design */
748
+ @media (max-width: 768px) {
749
+ .settings-modal-content {
750
+ width: 95vw;
751
+ max-height: 95vh;
752
+ border-radius: 12px;
753
+ }
754
+
755
+ .settings-header {
756
+ padding: 20px 24px;
757
+ }
758
+
759
+ .settings-header h3 {
760
+ font-size: 20px;
761
+ }
762
+
763
+ .settings-tab {
764
+ padding: 14px 20px;
765
+ font-size: 14px;
766
+ min-width: 120px;
767
+ }
768
+
769
+ .settings-tab-content {
770
+ padding: 24px;
771
+ }
772
+
773
+ .profile-card {
774
+ padding: 16px;
775
+ }
776
+
777
+ .profile-name {
778
+ font-size: 16px;
779
+ }
780
+
781
+ .profile-meta {
782
+ grid-template-columns: 1fr;
783
+ }
784
+
785
+ .profile-actions {
786
+ flex-direction: column;
787
+ }
788
+
789
+ .profile-btn {
790
+ width: 100%;
791
+ justify-content: center;
792
+ }
793
+
794
+ .profile-form-container {
795
+ width: 95vw;
796
+ }
797
+
798
+ .profile-form-header {
799
+ padding: 20px 24px;
800
+ }
801
+
802
+ .profile-form-content {
803
+ padding: 24px;
804
+ }
805
+
806
+ .profile-form-actions {
807
+ padding: 20px 24px;
808
+ flex-direction: column;
809
+ }
810
+
811
+ .form-btn {
812
+ width: 100%;
813
+ }
814
+ }
815
+
816
+ @media (max-width: 480px) {
817
+ .settings-header {
818
+ padding: 16px 20px;
819
+ }
820
+
821
+ .settings-header h3 {
822
+ font-size: 18px;
823
+ }
824
+
825
+ .settings-tab {
826
+ padding: 12px 16px;
827
+ font-size: 13px;
828
+ min-width: 100px;
829
+ }
830
+
831
+ .settings-tab-content {
832
+ padding: 20px;
833
+ }
834
+
835
+ .profile-card {
836
+ padding: 12px;
837
+ }
838
+
839
+ .profile-header {
840
+ flex-direction: column;
841
+ align-items: flex-start;
842
+ gap: 12px;
843
+ }
844
+
845
+ .profile-badges {
846
+ align-self: flex-end;
847
+ }
848
+
849
+ .env-var-item {
850
+ flex-direction: column;
851
+ gap: 8px;
852
+ }
853
+
854
+ .env-var-actions {
855
+ align-self: flex-end;
856
+ }
857
+ }
858
+
859
+ /* Loading States */
860
+ .profiles-loading {
861
+ display: flex;
862
+ align-items: center;
863
+ justify-content: center;
864
+ padding: 60px;
865
+ color: var(--text-muted);
866
+ }
867
+
868
+ .loading-spinner {
869
+ width: 32px;
870
+ height: 32px;
871
+ border: 3px solid var(--border-color);
872
+ border-top: 3px solid var(--primary-color);
873
+ border-radius: 50%;
874
+ animation: spin 1s linear infinite;
875
+ margin-right: 16px;
876
+ }
877
+
878
+ @keyframes spin {
879
+ 0% { transform: rotate(0deg); }
880
+ 100% { transform: rotate(360deg); }
881
+ }
882
+
883
+ /* Success/Error Messages */
884
+ .form-message {
885
+ padding: 12px 16px;
886
+ border-radius: 8px;
887
+ margin-bottom: 16px;
888
+ font-size: 14px;
889
+ font-weight: 500;
890
+ }
891
+
892
+ .form-message.success {
893
+ background: rgba(40, 167, 69, 0.1);
894
+ color: var(--accent-color);
895
+ border: 1px solid rgba(40, 167, 69, 0.3);
896
+ }
897
+
898
+ .form-message.error {
899
+ background: rgba(220, 53, 69, 0.1);
900
+ color: var(--danger-color);
901
+ border: 1px solid rgba(220, 53, 69, 0.3);
902
+ }
903
+
904
+ /* Form Validation */
905
+ .form-input.error,
906
+ .form-select.error,
907
+ .form-textarea.error {
908
+ border-color: var(--danger-color);
909
+ box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1);
910
+ }
911
+
912
+ .form-error {
913
+ font-size: 12px;
914
+ color: var(--danger-color);
915
+ margin-top: 4px;
916
+ display: flex;
917
+ align-items: center;
918
+ gap: 4px;
919
+ }
920
+
921
+ .form-error::before {
922
+ content: '⚠️';
923
+ font-size: 10px;
924
+ }
925
+
926
+ /* JSON Validation Styles */
927
+ .json-input {
928
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
929
+ font-size: 13px;
930
+ line-height: 1.5;
931
+ tab-size: 2;
932
+ }
933
+
934
+ .json-input.json-valid {
935
+ border-color: var(--accent-color);
936
+ box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.1);
937
+ }
938
+
939
+ .json-input.json-invalid {
940
+ border-color: var(--danger-color);
941
+ box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1);
942
+ }
943
+
944
+ .json-validation-feedback {
945
+ margin-top: 8px;
946
+ font-size: 13px;
947
+ font-weight: 500;
948
+ min-height: 20px;
949
+ display: flex;
950
+ align-items: center;
951
+ gap: 6px;
952
+ }
953
+
954
+ .json-success {
955
+ color: var(--accent-color);
956
+ display: flex;
957
+ align-items: center;
958
+ gap: 6px;
959
+ }
960
+
961
+ .json-success::before {
962
+ content: '✓';
963
+ font-weight: bold;
964
+ font-size: 14px;
965
+ }
966
+
967
+ .json-error {
968
+ color: var(--danger-color);
969
+ display: flex;
970
+ align-items: center;
971
+ gap: 6px;
972
+ }
973
+
974
+ .json-error::before {
975
+ content: '✗';
976
+ font-weight: bold;
977
+ font-size: 14px;
978
+ }
979
+
980
+ /* JSON syntax highlighting for better UX */
981
+ .json-input:focus {
982
+ background: var(--bg-primary);
983
+ }
984
+
985
+ .json-input:invalid {
986
+ border-color: var(--danger-color);
987
+ }
988
+
989
+ /* Enhanced form textarea for JSON */
990
+ .form-textarea.json-input {
991
+ resize: vertical;
992
+ min-height: 120px;
993
+ white-space: pre;
994
+ word-wrap: break-word;
995
+ }
996
+
997
+ /* JSON validation feedback animations */
998
+ .json-validation-feedback {
999
+ opacity: 0;
1000
+ transform: translateY(-4px);
1001
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1002
+ }
1003
+
1004
+ .json-validation-feedback:not(:empty) {
1005
+ opacity: 1;
1006
+ transform: translateY(0);
1007
+ }
1008
+
1009
+ /* Accessibility */
1010
+ @media (prefers-reduced-motion: reduce) {
1011
+ * {
1012
+ animation-duration: 0.01ms !important;
1013
+ animation-iteration-count: 1 !important;
1014
+ transition-duration: 0.01ms !important;
1015
+ }
1016
+ }
1017
+
1018
+ /* High contrast mode */
1019
+ @media (prefers-contrast: high) {
1020
+ .profile-card,
1021
+ .form-input,
1022
+ .form-select,
1023
+ .form-textarea {
1024
+ border-width: 2px;
1025
+ }
1026
+
1027
+ .settings-tab::before {
1028
+ height: 4px;
1029
+ }
1030
+ }
1031
+
1032
+ /* Dark mode support (for future enhancement) */
1033
+ @media (prefers-color-scheme: dark) {
1034
+ .profile-form-modal {
1035
+ backdrop-filter: blur(12px);
1036
+ }
1037
+ }
1038
+
1039
+ /* Uploaded Files List Styles */
1040
+ .uploaded-files-container {
1041
+ margin-top: 4px;
1042
+ margin-bottom: 4px;
1043
+ display: none;
1044
+ }
1045
+
1046
+ .files-items {
1047
+ display: flex;
1048
+ flex-wrap: wrap;
1049
+ gap: 4px;
1050
+ }
1051
+
1052
+ .file-item {
1053
+ display: inline-flex;
1054
+ align-items: center;
1055
+ gap: 4px;
1056
+ padding: 2px 6px;
1057
+ background: #f0f0f0;
1058
+ border: 1px solid #d0d0d0;
1059
+ border-radius: 12px;
1060
+ font-size: 11px;
1061
+ color: #555;
1062
+ max-width: 150px;
1063
+ }
1064
+
1065
+ .file-item:hover {
1066
+ background: #e8e8e8;
1067
+ }
1068
+
1069
+ .file-name {
1070
+ white-space: nowrap;
1071
+ overflow: hidden;
1072
+ text-overflow: ellipsis;
1073
+ flex: 1;
1074
+ min-width: 0;
1075
+ }
1076
+
1077
+ .file-remove-btn {
1078
+ background: #999;
1079
+ color: white;
1080
+ border: none;
1081
+ border-radius: 50%;
1082
+ width: 14px;
1083
+ height: 14px;
1084
+ font-size: 10px;
1085
+ font-weight: bold;
1086
+ cursor: pointer;
1087
+ display: flex;
1088
+ align-items: center;
1089
+ justify-content: center;
1090
+ transition: background-color 0.2s ease;
1091
+ flex-shrink: 0;
1092
+ }
1093
+
1094
+ .file-remove-btn:hover {
1095
+ background: #666;
1096
+ }
1097
+
1098
+ .file-remove-btn:active {
1099
+ transform: scale(0.9);
1100
+ }