@rashidazarang/airtable-mcp 2.1.0 → 2.2.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 (155) hide show
  1. package/README.md +1 -1
  2. package/airtable_simple_production.js +387 -5
  3. package/examples/claude_simple_config.json +0 -9
  4. package/package.json +10 -1
  5. package/.github/ISSUE_TEMPLATE/bug-report.yml +0 -173
  6. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  7. package/.github/ISSUE_TEMPLATE/custom.md +0 -10
  8. package/.github/ISSUE_TEMPLATE/feature-request.yml +0 -209
  9. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  10. package/.github/ISSUE_TEMPLATE/security-report.yml +0 -216
  11. package/.github/pull_request_template.md +0 -245
  12. package/.github/workflows/ci-cd.yml +0 -408
  13. package/.github/workflows/security-audit.yml +0 -316
  14. package/API_DOCUMENTATION.md +0 -897
  15. package/CAPABILITY_REPORT.md +0 -118
  16. package/CLAUDE_INTEGRATION.md +0 -96
  17. package/CODE_OF_CONDUCT.md +0 -181
  18. package/CONTRIBUTING.md +0 -81
  19. package/DEVELOPMENT.md +0 -190
  20. package/Dockerfile +0 -39
  21. package/Dockerfile.node +0 -20
  22. package/Dockerfile.production +0 -127
  23. package/IMPROVEMENT_PROPOSAL.md +0 -371
  24. package/INSTALLATION.md +0 -183
  25. package/ISSUE_RESPONSES.md +0 -171
  26. package/MCP_REVIEW_SUMMARY.md +0 -142
  27. package/QUICK_START.md +0 -60
  28. package/RELEASE_NOTES_v1.2.0.md +0 -50
  29. package/RELEASE_NOTES_v1.2.1.md +0 -40
  30. package/RELEASE_NOTES_v1.2.2.md +0 -48
  31. package/RELEASE_NOTES_v1.2.3.md +0 -105
  32. package/RELEASE_NOTES_v1.2.4.md +0 -60
  33. package/RELEASE_NOTES_v1.4.0.md +0 -104
  34. package/RELEASE_NOTES_v1.5.0.md +0 -185
  35. package/RELEASE_NOTES_v1.6.0.md +0 -248
  36. package/SECURITY_NOTICE.md +0 -40
  37. package/airtable-clipper/CHANGELOG.md +0 -198
  38. package/airtable-clipper/CHROME_STORE_SUBMISSION.md +0 -343
  39. package/airtable-clipper/LAUNCH_STRATEGY.md +0 -495
  40. package/airtable-clipper/LICENSE +0 -21
  41. package/airtable-clipper/OAUTH_SETUP.md +0 -51
  42. package/airtable-clipper/PRIVACY_POLICY.md +0 -187
  43. package/airtable-clipper/README.md +0 -575
  44. package/airtable-clipper/SUBMIT_TO_CHROME_STORE.md +0 -273
  45. package/airtable-clipper/build.sh +0 -85
  46. package/airtable-clipper/docs/QUICK_START.md +0 -99
  47. package/airtable-clipper/docs/SETUP.md +0 -291
  48. package/airtable-clipper/extension/background.js +0 -337
  49. package/airtable-clipper/extension/base-setup.html +0 -324
  50. package/airtable-clipper/extension/base-setup.js +0 -471
  51. package/airtable-clipper/extension/content.js +0 -771
  52. package/airtable-clipper/extension/icons/README.md +0 -69
  53. package/airtable-clipper/extension/icons/icon-16.png +0 -3
  54. package/airtable-clipper/extension/manifest.json +0 -73
  55. package/airtable-clipper/extension/popup.html +0 -144
  56. package/airtable-clipper/extension/popup.js +0 -475
  57. package/airtable-clipper/extension/styles/content.css +0 -229
  58. package/airtable-clipper/extension/styles/popup.css +0 -477
  59. package/airtable-clipper/privacy-policy.md +0 -63
  60. package/airtable-clipper/releases/v1.0.0/background.js +0 -337
  61. package/airtable-clipper/releases/v1.0.0/base-setup.html +0 -324
  62. package/airtable-clipper/releases/v1.0.0/base-setup.js +0 -471
  63. package/airtable-clipper/releases/v1.0.0/content.js +0 -771
  64. package/airtable-clipper/releases/v1.0.0/icons/README.md +0 -69
  65. package/airtable-clipper/releases/v1.0.0/icons/icon-128.png +0 -2
  66. package/airtable-clipper/releases/v1.0.0/icons/icon-16.png +0 -3
  67. package/airtable-clipper/releases/v1.0.0/icons/icon-32.png +0 -2
  68. package/airtable-clipper/releases/v1.0.0/icons/icon-48.png +0 -2
  69. package/airtable-clipper/releases/v1.0.0/manifest.json +0 -73
  70. package/airtable-clipper/releases/v1.0.0/popup.html +0 -144
  71. package/airtable-clipper/releases/v1.0.0/popup.js +0 -475
  72. package/airtable-clipper/releases/v1.0.0/sidepanel.html +0 -25
  73. package/airtable-clipper/releases/v1.0.0/styles/content.css +0 -229
  74. package/airtable-clipper/releases/v1.0.0/styles/popup.css +0 -477
  75. package/airtable-clipper/releases/v1.0.1/background.js +0 -337
  76. package/airtable-clipper/releases/v1.0.1/base-setup.html +0 -324
  77. package/airtable-clipper/releases/v1.0.1/base-setup.js +0 -471
  78. package/airtable-clipper/releases/v1.0.1/content.js +0 -771
  79. package/airtable-clipper/releases/v1.0.1/icons/README.md +0 -69
  80. package/airtable-clipper/releases/v1.0.1/icons/icon-128.png +0 -2
  81. package/airtable-clipper/releases/v1.0.1/icons/icon-16.png +0 -3
  82. package/airtable-clipper/releases/v1.0.1/icons/icon-32.png +0 -2
  83. package/airtable-clipper/releases/v1.0.1/icons/icon-48.png +0 -2
  84. package/airtable-clipper/releases/v1.0.1/manifest.json +0 -70
  85. package/airtable-clipper/releases/v1.0.1/popup.html +0 -157
  86. package/airtable-clipper/releases/v1.0.1/popup.js +0 -562
  87. package/airtable-clipper/releases/v1.0.1/sidepanel.html +0 -25
  88. package/airtable-clipper/releases/v1.0.1/styles/content.css +0 -229
  89. package/airtable-clipper/releases/v1.0.1/styles/popup.css +0 -647
  90. package/airtable-clipper/releases/v1.0.2/background.js +0 -337
  91. package/airtable-clipper/releases/v1.0.2/base-setup.html +0 -324
  92. package/airtable-clipper/releases/v1.0.2/base-setup.js +0 -471
  93. package/airtable-clipper/releases/v1.0.2/content.js +0 -771
  94. package/airtable-clipper/releases/v1.0.2/icons/README.md +0 -69
  95. package/airtable-clipper/releases/v1.0.2/icons/icon-128.png +0 -2
  96. package/airtable-clipper/releases/v1.0.2/icons/icon-16.png +0 -3
  97. package/airtable-clipper/releases/v1.0.2/icons/icon-32.png +0 -2
  98. package/airtable-clipper/releases/v1.0.2/icons/icon-48.png +0 -2
  99. package/airtable-clipper/releases/v1.0.2/manifest.json +0 -62
  100. package/airtable-clipper/releases/v1.0.2/popup.html +0 -157
  101. package/airtable-clipper/releases/v1.0.2/popup.js +0 -567
  102. package/airtable-clipper/releases/v1.0.2/sidepanel.html +0 -25
  103. package/airtable-clipper/releases/v1.0.2/styles/content.css +0 -229
  104. package/airtable-clipper/releases/v1.0.2/styles/popup.css +0 -647
  105. package/airtable-clipper/terms-of-service.md +0 -124
  106. package/airtable-clipper/test-credentials.md +0 -61
  107. package/airtable-clipper/test-extension/background.js +0 -337
  108. package/airtable-clipper/test-extension/base-setup.html +0 -324
  109. package/airtable-clipper/test-extension/base-setup.js +0 -471
  110. package/airtable-clipper/test-extension/content.js +0 -873
  111. package/airtable-clipper/test-extension/icons/README.md +0 -69
  112. package/airtable-clipper/test-extension/icons/icon-128.png +0 -2
  113. package/airtable-clipper/test-extension/icons/icon-16.png +0 -3
  114. package/airtable-clipper/test-extension/icons/icon-32.png +0 -2
  115. package/airtable-clipper/test-extension/icons/icon-48.png +0 -2
  116. package/airtable-clipper/test-extension/manifest.json +0 -72
  117. package/airtable-clipper/test-extension/popup.html +0 -274
  118. package/airtable-clipper/test-extension/popup.js +0 -729
  119. package/airtable-clipper/test-extension/sidepanel.html +0 -25
  120. package/airtable-clipper/test-extension/styles/content.css +0 -229
  121. package/airtable-clipper/test-extension/styles/popup.css +0 -794
  122. package/airtable_mcp/__init__.py +0 -5
  123. package/airtable_mcp/src/server.py +0 -329
  124. package/airtable_mcp_v2.js +0 -1505
  125. package/airtable_mcp_v2_oauth.js +0 -1048
  126. package/airtable_mcp_v3_advanced.js +0 -1161
  127. package/cleanup.sh +0 -71
  128. package/docker-compose.production.yml +0 -366
  129. package/helm/airtable-mcp/Chart.yaml +0 -122
  130. package/helm/airtable-mcp/values.yaml +0 -538
  131. package/index.js +0 -179
  132. package/inspector.py +0 -148
  133. package/inspector_server.py +0 -337
  134. package/k8s/deployment.yaml +0 -402
  135. package/k8s/namespace.yaml +0 -108
  136. package/k8s/service.yaml +0 -194
  137. package/monitoring/alerts.yml +0 -289
  138. package/monitoring/prometheus.yml +0 -224
  139. package/publish-steps.txt +0 -27
  140. package/quick_test.sh +0 -30
  141. package/requirements.txt +0 -10
  142. package/setup.py +0 -29
  143. package/simple_airtable_server.py +0 -151
  144. package/smithery.yaml +0 -45
  145. package/test_all_features.sh +0 -146
  146. package/test_all_operations.sh +0 -120
  147. package/test_client.py +0 -70
  148. package/test_enhanced_features.js +0 -389
  149. package/test_mcp_comprehensive.js +0 -163
  150. package/test_mock_server.js +0 -180
  151. package/test_v1.4.0_final.sh +0 -131
  152. package/test_v1.5.0_comprehensive.sh +0 -96
  153. package/test_v1.5.0_final.sh +0 -224
  154. package/test_v1.6.0_comprehensive.sh +0 -187
  155. package/test_webhooks.sh +0 -105
@@ -1,647 +0,0 @@
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
- }