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
@@ -1,1100 +0,0 @@
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
- }