@rashidazarang/airtable-mcp 1.5.0 → 2.1.0

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 (119) hide show
  1. package/.github/ISSUE_TEMPLATE/bug-report.yml +173 -0
  2. package/.github/ISSUE_TEMPLATE/feature-request.yml +209 -0
  3. package/.github/ISSUE_TEMPLATE/security-report.yml +216 -0
  4. package/.github/pull_request_template.md +245 -0
  5. package/.github/workflows/ci-cd.yml +408 -0
  6. package/.github/workflows/security-audit.yml +316 -0
  7. package/API_DOCUMENTATION.md +897 -0
  8. package/CODE_OF_CONDUCT.md +181 -0
  9. package/Dockerfile.production +127 -0
  10. package/README.md +55 -10
  11. package/RELEASE_NOTES_v1.6.0.md +248 -0
  12. package/airtable-clipper/CHANGELOG.md +198 -0
  13. package/airtable-clipper/CHROME_STORE_SUBMISSION.md +343 -0
  14. package/airtable-clipper/LAUNCH_STRATEGY.md +495 -0
  15. package/airtable-clipper/LICENSE +21 -0
  16. package/airtable-clipper/OAUTH_SETUP.md +51 -0
  17. package/airtable-clipper/PRIVACY_POLICY.md +187 -0
  18. package/airtable-clipper/README.md +575 -0
  19. package/airtable-clipper/SUBMIT_TO_CHROME_STORE.md +273 -0
  20. package/airtable-clipper/build.sh +85 -0
  21. package/airtable-clipper/docs/QUICK_START.md +99 -0
  22. package/airtable-clipper/docs/SETUP.md +291 -0
  23. package/airtable-clipper/extension/background.js +337 -0
  24. package/airtable-clipper/extension/base-setup.html +324 -0
  25. package/airtable-clipper/extension/base-setup.js +471 -0
  26. package/airtable-clipper/extension/content.js +771 -0
  27. package/airtable-clipper/extension/icons/README.md +69 -0
  28. package/airtable-clipper/extension/icons/icon-16.png +3 -0
  29. package/airtable-clipper/extension/manifest.json +73 -0
  30. package/airtable-clipper/extension/popup.html +144 -0
  31. package/airtable-clipper/extension/popup.js +475 -0
  32. package/airtable-clipper/extension/styles/content.css +229 -0
  33. package/airtable-clipper/extension/styles/popup.css +477 -0
  34. package/airtable-clipper/privacy-policy.md +63 -0
  35. package/airtable-clipper/releases/v1.0.0/background.js +337 -0
  36. package/airtable-clipper/releases/v1.0.0/base-setup.html +324 -0
  37. package/airtable-clipper/releases/v1.0.0/base-setup.js +471 -0
  38. package/airtable-clipper/releases/v1.0.0/content.js +771 -0
  39. package/airtable-clipper/releases/v1.0.0/icons/README.md +69 -0
  40. package/airtable-clipper/releases/v1.0.0/icons/icon-128.png +2 -0
  41. package/airtable-clipper/releases/v1.0.0/icons/icon-16.png +3 -0
  42. package/airtable-clipper/releases/v1.0.0/icons/icon-32.png +2 -0
  43. package/airtable-clipper/releases/v1.0.0/icons/icon-48.png +2 -0
  44. package/airtable-clipper/releases/v1.0.0/manifest.json +73 -0
  45. package/airtable-clipper/releases/v1.0.0/popup.html +144 -0
  46. package/airtable-clipper/releases/v1.0.0/popup.js +475 -0
  47. package/airtable-clipper/releases/v1.0.0/sidepanel.html +25 -0
  48. package/airtable-clipper/releases/v1.0.0/styles/content.css +229 -0
  49. package/airtable-clipper/releases/v1.0.0/styles/popup.css +477 -0
  50. package/airtable-clipper/releases/v1.0.1/background.js +337 -0
  51. package/airtable-clipper/releases/v1.0.1/base-setup.html +324 -0
  52. package/airtable-clipper/releases/v1.0.1/base-setup.js +471 -0
  53. package/airtable-clipper/releases/v1.0.1/content.js +771 -0
  54. package/airtable-clipper/releases/v1.0.1/icons/README.md +69 -0
  55. package/airtable-clipper/releases/v1.0.1/icons/icon-128.png +2 -0
  56. package/airtable-clipper/releases/v1.0.1/icons/icon-16.png +3 -0
  57. package/airtable-clipper/releases/v1.0.1/icons/icon-32.png +2 -0
  58. package/airtable-clipper/releases/v1.0.1/icons/icon-48.png +2 -0
  59. package/airtable-clipper/releases/v1.0.1/manifest.json +70 -0
  60. package/airtable-clipper/releases/v1.0.1/popup.html +157 -0
  61. package/airtable-clipper/releases/v1.0.1/popup.js +562 -0
  62. package/airtable-clipper/releases/v1.0.1/sidepanel.html +25 -0
  63. package/airtable-clipper/releases/v1.0.1/styles/content.css +229 -0
  64. package/airtable-clipper/releases/v1.0.1/styles/popup.css +647 -0
  65. package/airtable-clipper/releases/v1.0.2/background.js +337 -0
  66. package/airtable-clipper/releases/v1.0.2/base-setup.html +324 -0
  67. package/airtable-clipper/releases/v1.0.2/base-setup.js +471 -0
  68. package/airtable-clipper/releases/v1.0.2/content.js +771 -0
  69. package/airtable-clipper/releases/v1.0.2/icons/README.md +69 -0
  70. package/airtable-clipper/releases/v1.0.2/icons/icon-128.png +2 -0
  71. package/airtable-clipper/releases/v1.0.2/icons/icon-16.png +3 -0
  72. package/airtable-clipper/releases/v1.0.2/icons/icon-32.png +2 -0
  73. package/airtable-clipper/releases/v1.0.2/icons/icon-48.png +2 -0
  74. package/airtable-clipper/releases/v1.0.2/manifest.json +62 -0
  75. package/airtable-clipper/releases/v1.0.2/popup.html +157 -0
  76. package/airtable-clipper/releases/v1.0.2/popup.js +567 -0
  77. package/airtable-clipper/releases/v1.0.2/sidepanel.html +25 -0
  78. package/airtable-clipper/releases/v1.0.2/styles/content.css +229 -0
  79. package/airtable-clipper/releases/v1.0.2/styles/popup.css +647 -0
  80. package/airtable-clipper/terms-of-service.md +124 -0
  81. package/airtable-clipper/test-credentials.md +61 -0
  82. package/airtable-clipper/test-extension/background.js +337 -0
  83. package/airtable-clipper/test-extension/base-setup.html +324 -0
  84. package/airtable-clipper/test-extension/base-setup.js +471 -0
  85. package/airtable-clipper/test-extension/content.js +873 -0
  86. package/airtable-clipper/test-extension/icons/README.md +69 -0
  87. package/airtable-clipper/test-extension/icons/icon-128.png +2 -0
  88. package/airtable-clipper/test-extension/icons/icon-16.png +3 -0
  89. package/airtable-clipper/test-extension/icons/icon-32.png +2 -0
  90. package/airtable-clipper/test-extension/icons/icon-48.png +2 -0
  91. package/airtable-clipper/test-extension/manifest.json +72 -0
  92. package/airtable-clipper/test-extension/popup.html +274 -0
  93. package/airtable-clipper/test-extension/popup.js +729 -0
  94. package/airtable-clipper/test-extension/sidepanel.html +25 -0
  95. package/airtable-clipper/test-extension/styles/content.css +229 -0
  96. package/airtable-clipper/test-extension/styles/popup.css +794 -0
  97. package/airtable_mcp_v2.js +1505 -0
  98. package/airtable_mcp_v2_oauth.js +1048 -0
  99. package/airtable_mcp_v3_advanced.js +1161 -0
  100. package/airtable_simple.js +447 -1
  101. package/airtable_simple_production.js +532 -0
  102. package/docker-compose.production.yml +366 -0
  103. package/helm/airtable-mcp/Chart.yaml +122 -0
  104. package/helm/airtable-mcp/values.yaml +538 -0
  105. package/k8s/deployment.yaml +402 -0
  106. package/k8s/namespace.yaml +108 -0
  107. package/k8s/service.yaml +194 -0
  108. package/monitoring/alerts.yml +289 -0
  109. package/monitoring/prometheus.yml +224 -0
  110. package/package.json +6 -6
  111. package/test_v1.6.0_comprehensive.sh +187 -0
  112. package/.claude/settings.local.json +0 -12
  113. package/airtable-mcp-1.1.0.tgz +0 -0
  114. package/airtable_enhanced.js +0 -499
  115. package/airtable_simple_v1.2.4_backup.js +0 -277
  116. package/airtable_v1.4.0.js +0 -654
  117. package/rashidazarang-airtable-mcp-1.1.0.tgz +0 -0
  118. package/rashidazarang-airtable-mcp-1.2.0.tgz +0 -0
  119. package/rashidazarang-airtable-mcp-1.2.1.tgz +0 -0
@@ -0,0 +1,647 @@
1
+ /* Airtable Clipper - Pocket-inspired Design */
2
+
3
+ * {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ body {
10
+ width: 340px;
11
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
12
+ font-size: 14px;
13
+ line-height: 1.4;
14
+ color: #2d3748;
15
+ background-color: #ffffff;
16
+ overflow: hidden;
17
+ }
18
+
19
+ /* ===== SETUP VIEW (Not Connected) ===== */
20
+ .popup-container {
21
+ min-height: 420px;
22
+ display: flex;
23
+ flex-direction: column;
24
+ }
25
+
26
+ .header-simple {
27
+ text-align: center;
28
+ padding: 32px 24px 24px 24px;
29
+ background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
30
+ color: white;
31
+ }
32
+
33
+ .header-simple h2 {
34
+ font-size: 20px;
35
+ font-weight: 600;
36
+ margin-bottom: 4px;
37
+ }
38
+
39
+ .subtitle {
40
+ font-size: 14px;
41
+ opacity: 0.9;
42
+ font-weight: 400;
43
+ }
44
+
45
+ .setup-form {
46
+ flex: 1;
47
+ padding: 24px;
48
+ display: flex;
49
+ flex-direction: column;
50
+ justify-content: center;
51
+ }
52
+
53
+ .setup-steps {
54
+ margin-bottom: 24px;
55
+ }
56
+
57
+ .setup-steps h3 {
58
+ font-size: 16px;
59
+ font-weight: 600;
60
+ color: #2d3748;
61
+ margin-bottom: 16px;
62
+ text-align: center;
63
+ }
64
+
65
+ .step {
66
+ display: flex;
67
+ align-items: flex-start;
68
+ gap: 12px;
69
+ margin-bottom: 16px;
70
+ padding: 16px;
71
+ background: #f8fafc;
72
+ border-radius: 8px;
73
+ border-left: 3px solid #2563eb;
74
+ }
75
+
76
+ .step-number {
77
+ background: #2563eb;
78
+ color: white;
79
+ width: 24px;
80
+ height: 24px;
81
+ border-radius: 50%;
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ font-size: 12px;
86
+ font-weight: 600;
87
+ flex-shrink: 0;
88
+ margin-top: 2px;
89
+ }
90
+
91
+ .step-content {
92
+ flex: 1;
93
+ }
94
+
95
+ .step-content p {
96
+ margin-bottom: 4px;
97
+ font-size: 14px;
98
+ color: #2d3748;
99
+ }
100
+
101
+ .step-content .help-text {
102
+ font-size: 12px;
103
+ color: #718096;
104
+ margin-top: 4px;
105
+ margin-bottom: 0;
106
+ }
107
+
108
+ .highlight {
109
+ background: #fef3c7;
110
+ padding: 1px 4px;
111
+ border-radius: 3px;
112
+ font-weight: 600;
113
+ }
114
+
115
+ .help-link {
116
+ color: #2563eb;
117
+ text-decoration: none;
118
+ font-size: 13px;
119
+ font-weight: 500;
120
+ }
121
+
122
+ .help-link:hover {
123
+ text-decoration: underline;
124
+ }
125
+
126
+ .connect-form {
127
+ margin-bottom: 24px;
128
+ }
129
+
130
+ .connect-description {
131
+ font-size: 13px;
132
+ color: #718096;
133
+ margin-top: 12px;
134
+ line-height: 1.4;
135
+ }
136
+
137
+ .base-selection {
138
+ margin-bottom: 24px;
139
+ }
140
+
141
+ .base-selection label {
142
+ display: block;
143
+ font-size: 14px;
144
+ font-weight: 500;
145
+ color: #2d3748;
146
+ margin-bottom: 8px;
147
+ }
148
+
149
+ .base-select {
150
+ width: 100%;
151
+ padding: 12px 16px;
152
+ border: 2px solid #e2e8f0;
153
+ border-radius: 8px;
154
+ font-size: 14px;
155
+ background: white;
156
+ color: #2d3748;
157
+ margin-bottom: 16px;
158
+ }
159
+
160
+ .base-select:focus {
161
+ outline: none;
162
+ border-color: #667eea;
163
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
164
+ }
165
+
166
+ .connect-btn.secondary {
167
+ background: #f7fafc;
168
+ border: 2px solid #e2e8f0;
169
+ color: #4a5568;
170
+ }
171
+
172
+ .connect-btn.secondary:hover {
173
+ background: #edf2f7;
174
+ border-color: #cbd5e0;
175
+ transform: translateY(-1px);
176
+ }
177
+
178
+ .manual-connect {
179
+ border: 1px solid #e2e8f0;
180
+ border-radius: 8px;
181
+ padding: 16px;
182
+ }
183
+
184
+ .manual-connect summary {
185
+ cursor: pointer;
186
+ font-size: 13px;
187
+ color: #718096;
188
+ margin-bottom: 16px;
189
+ }
190
+
191
+ .manual-connect[open] summary {
192
+ border-bottom: 1px solid #e2e8f0;
193
+ padding-bottom: 12px;
194
+ }
195
+
196
+ .input-group {
197
+ margin-bottom: 20px;
198
+ }
199
+
200
+ .token-input,
201
+ .base-input {
202
+ width: 100%;
203
+ padding: 14px 16px;
204
+ border: 2px solid #e2e8f0;
205
+ border-radius: 12px;
206
+ font-size: 14px;
207
+ transition: all 0.2s ease;
208
+ background: #ffffff;
209
+ }
210
+
211
+ .token-input:focus,
212
+ .base-input:focus {
213
+ outline: none;
214
+ border-color: #2563eb;
215
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
216
+ }
217
+
218
+ .help-text {
219
+ margin-top: 8px;
220
+ font-size: 13px;
221
+ color: #718096;
222
+ }
223
+
224
+ .help-text a {
225
+ color: #2563eb;
226
+ text-decoration: none;
227
+ font-weight: 500;
228
+ }
229
+
230
+ .help-text a:hover {
231
+ text-decoration: underline;
232
+ }
233
+
234
+ .connect-btn {
235
+ width: 100%;
236
+ padding: 14px 24px;
237
+ background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
238
+ border: none;
239
+ border-radius: 12px;
240
+ color: white;
241
+ font-size: 15px;
242
+ font-weight: 600;
243
+ cursor: pointer;
244
+ transition: all 0.2s ease;
245
+ display: flex;
246
+ align-items: center;
247
+ justify-content: center;
248
+ gap: 8px;
249
+ margin-bottom: 24px;
250
+ }
251
+
252
+ .connect-btn:hover {
253
+ transform: translateY(-1px);
254
+ box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3);
255
+ }
256
+
257
+ .connect-btn:disabled {
258
+ opacity: 0.7;
259
+ cursor: not-allowed;
260
+ transform: none;
261
+ }
262
+
263
+ .btn-spinner {
264
+ width: 16px;
265
+ height: 16px;
266
+ border: 2px solid rgba(255, 255, 255, 0.3);
267
+ border-top: 2px solid white;
268
+ border-radius: 50%;
269
+ animation: spin 1s linear infinite;
270
+ display: none;
271
+ }
272
+
273
+ @keyframes spin {
274
+ 0% { transform: rotate(0deg); }
275
+ 100% { transform: rotate(360deg); }
276
+ }
277
+
278
+ .quick-setup {
279
+ text-align: center;
280
+ padding-top: 16px;
281
+ border-top: 1px solid #e2e8f0;
282
+ }
283
+
284
+ .quick-setup p {
285
+ font-size: 13px;
286
+ color: #718096;
287
+ margin-bottom: 12px;
288
+ }
289
+
290
+ .setup-btn {
291
+ background: none;
292
+ border: 1px solid #e2e8f0;
293
+ padding: 10px 16px;
294
+ border-radius: 8px;
295
+ color: #667eea;
296
+ font-size: 13px;
297
+ font-weight: 500;
298
+ cursor: pointer;
299
+ transition: all 0.2s ease;
300
+ }
301
+
302
+ .setup-btn:hover {
303
+ background: #f7fafc;
304
+ border-color: #2563eb;
305
+ }
306
+
307
+ /* ===== CONNECTED VIEW ===== */
308
+ .popup-container.connected {
309
+ min-height: 380px;
310
+ }
311
+
312
+ .header-connected {
313
+ display: flex;
314
+ align-items: center;
315
+ justify-content: space-between;
316
+ padding: 16px 20px;
317
+ background: #f8fafc;
318
+ border-bottom: 1px solid #e2e8f0;
319
+ }
320
+
321
+ .site-info {
322
+ display: flex;
323
+ align-items: center;
324
+ gap: 12px;
325
+ flex: 1;
326
+ }
327
+
328
+ .site-icon {
329
+ font-size: 24px;
330
+ width: 32px;
331
+ height: 32px;
332
+ display: flex;
333
+ align-items: center;
334
+ justify-content: center;
335
+ }
336
+
337
+ .site-details {
338
+ flex: 1;
339
+ min-width: 0;
340
+ }
341
+
342
+ .site-name {
343
+ font-size: 15px;
344
+ font-weight: 600;
345
+ color: #2d3748;
346
+ white-space: nowrap;
347
+ overflow: hidden;
348
+ text-overflow: ellipsis;
349
+ }
350
+
351
+ .site-url {
352
+ font-size: 12px;
353
+ color: #718096;
354
+ white-space: nowrap;
355
+ overflow: hidden;
356
+ text-overflow: ellipsis;
357
+ }
358
+
359
+ .connection-indicator {
360
+ margin-left: 12px;
361
+ }
362
+
363
+ .status-dot {
364
+ width: 8px;
365
+ height: 8px;
366
+ border-radius: 50%;
367
+ background-color: #48bb78;
368
+ }
369
+
370
+ .actions {
371
+ padding: 20px;
372
+ }
373
+
374
+ .save-btn {
375
+ width: 100%;
376
+ display: flex;
377
+ align-items: center;
378
+ gap: 12px;
379
+ padding: 16px 20px;
380
+ background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
381
+ border: none;
382
+ border-radius: 12px;
383
+ color: white;
384
+ cursor: pointer;
385
+ transition: all 0.2s ease;
386
+ margin-bottom: 16px;
387
+ }
388
+
389
+ .save-btn:hover {
390
+ transform: translateY(-1px);
391
+ box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3);
392
+ }
393
+
394
+ .save-icon {
395
+ font-size: 20px;
396
+ flex-shrink: 0;
397
+ }
398
+
399
+ .save-content {
400
+ flex: 1;
401
+ text-align: left;
402
+ }
403
+
404
+ .save-text {
405
+ display: block;
406
+ font-size: 15px;
407
+ font-weight: 600;
408
+ line-height: 1.2;
409
+ }
410
+
411
+ .save-subtitle {
412
+ display: block;
413
+ font-size: 13px;
414
+ opacity: 0.9;
415
+ margin-top: 2px;
416
+ }
417
+
418
+ .secondary-actions {
419
+ display: grid;
420
+ grid-template-columns: repeat(3, 1fr);
421
+ gap: 8px;
422
+ }
423
+
424
+ .action-btn {
425
+ display: flex;
426
+ flex-direction: column;
427
+ align-items: center;
428
+ gap: 4px;
429
+ padding: 12px 8px;
430
+ background: #ffffff;
431
+ border: 1px solid #e2e8f0;
432
+ border-radius: 8px;
433
+ cursor: pointer;
434
+ transition: all 0.2s ease;
435
+ font-size: 12px;
436
+ color: #4a5568;
437
+ }
438
+
439
+ .action-btn:hover {
440
+ background: #f7fafc;
441
+ border-color: #cbd5e0;
442
+ transform: translateY(-1px);
443
+ }
444
+
445
+ .action-icon {
446
+ font-size: 16px;
447
+ }
448
+
449
+ .action-text {
450
+ font-weight: 500;
451
+ text-align: center;
452
+ line-height: 1.2;
453
+ }
454
+
455
+ /* ===== SETTINGS PANEL ===== */
456
+ .settings-panel {
457
+ position: absolute;
458
+ top: 0;
459
+ left: 0;
460
+ right: 0;
461
+ bottom: 0;
462
+ background: white;
463
+ z-index: 100;
464
+ overflow-y: auto;
465
+ }
466
+
467
+ .settings-header {
468
+ display: flex;
469
+ align-items: center;
470
+ justify-content: space-between;
471
+ padding: 16px 20px;
472
+ border-bottom: 1px solid #e2e8f0;
473
+ background: #f8fafc;
474
+ }
475
+
476
+ .settings-header h3 {
477
+ font-size: 16px;
478
+ font-weight: 600;
479
+ color: #2d3748;
480
+ }
481
+
482
+ .close-btn {
483
+ width: 28px;
484
+ height: 28px;
485
+ border: none;
486
+ background: none;
487
+ font-size: 18px;
488
+ color: #718096;
489
+ cursor: pointer;
490
+ display: flex;
491
+ align-items: center;
492
+ justify-content: center;
493
+ border-radius: 6px;
494
+ transition: all 0.2s ease;
495
+ }
496
+
497
+ .close-btn:hover {
498
+ background: #e2e8f0;
499
+ color: #4a5568;
500
+ }
501
+
502
+ .setting-item {
503
+ padding: 16px 20px;
504
+ border-bottom: 1px solid #f1f5f9;
505
+ }
506
+
507
+ .setting-item:last-child {
508
+ border-bottom: none;
509
+ }
510
+
511
+ .setting-item label {
512
+ display: block;
513
+ font-size: 14px;
514
+ font-weight: 500;
515
+ color: #2d3748;
516
+ margin-bottom: 8px;
517
+ }
518
+
519
+ .setting-item select {
520
+ width: 100%;
521
+ padding: 10px 12px;
522
+ border: 1px solid #e2e8f0;
523
+ border-radius: 8px;
524
+ background: white;
525
+ font-size: 14px;
526
+ color: #2d3748;
527
+ }
528
+
529
+ .toggle-label {
530
+ display: flex !important;
531
+ align-items: center;
532
+ gap: 12px;
533
+ cursor: pointer;
534
+ margin-bottom: 0 !important;
535
+ }
536
+
537
+ .toggle-switch {
538
+ position: relative;
539
+ width: 44px;
540
+ height: 24px;
541
+ background: #e2e8f0;
542
+ border-radius: 12px;
543
+ transition: all 0.2s ease;
544
+ flex-shrink: 0;
545
+ }
546
+
547
+ .toggle-switch::after {
548
+ content: '';
549
+ position: absolute;
550
+ top: 2px;
551
+ left: 2px;
552
+ width: 20px;
553
+ height: 20px;
554
+ background: white;
555
+ border-radius: 50%;
556
+ transition: all 0.2s ease;
557
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
558
+ }
559
+
560
+ input[type="checkbox"]:checked + .toggle-switch {
561
+ background: #2563eb;
562
+ }
563
+
564
+ input[type="checkbox"]:checked + .toggle-switch::after {
565
+ transform: translateX(20px);
566
+ }
567
+
568
+ input[type="checkbox"] {
569
+ display: none;
570
+ }
571
+
572
+ .disconnect-btn {
573
+ width: 100%;
574
+ padding: 12px 16px;
575
+ background: #fed7d7;
576
+ border: 1px solid #feb2b2;
577
+ border-radius: 8px;
578
+ color: #e53e3e;
579
+ font-size: 14px;
580
+ font-weight: 500;
581
+ cursor: pointer;
582
+ transition: all 0.2s ease;
583
+ }
584
+
585
+ .disconnect-btn:hover {
586
+ background: #fbb6ce;
587
+ border-color: #f687b3;
588
+ }
589
+
590
+ /* ===== TOAST NOTIFICATIONS ===== */
591
+ .toast {
592
+ position: absolute;
593
+ bottom: 20px;
594
+ left: 50%;
595
+ transform: translateX(-50%) translateY(100px);
596
+ background: rgba(45, 55, 72, 0.95);
597
+ color: white;
598
+ padding: 12px 16px;
599
+ border-radius: 8px;
600
+ font-size: 13px;
601
+ font-weight: 500;
602
+ opacity: 0;
603
+ transition: all 0.3s ease;
604
+ z-index: 200;
605
+ backdrop-filter: blur(10px);
606
+ max-width: 280px;
607
+ }
608
+
609
+ .toast.show {
610
+ opacity: 1;
611
+ transform: translateX(-50%) translateY(0);
612
+ }
613
+
614
+ .toast-content {
615
+ display: flex;
616
+ align-items: center;
617
+ gap: 8px;
618
+ }
619
+
620
+ .toast-icon {
621
+ font-size: 16px;
622
+ }
623
+
624
+ .toast-message {
625
+ flex: 1;
626
+ }
627
+
628
+ /* ===== ANIMATIONS ===== */
629
+ @keyframes fadeIn {
630
+ from { opacity: 0; transform: translateY(10px); }
631
+ to { opacity: 1; transform: translateY(0); }
632
+ }
633
+
634
+ .popup-container {
635
+ animation: fadeIn 0.2s ease;
636
+ }
637
+
638
+ /* ===== RESPONSIVE ===== */
639
+ @media (max-width: 320px) {
640
+ body {
641
+ width: 300px;
642
+ }
643
+
644
+ .secondary-actions {
645
+ grid-template-columns: 1fr 1fr;
646
+ }
647
+ }