@rashidazarang/airtable-mcp 1.6.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 (116) 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 +1 -0
  11. package/airtable-clipper/CHANGELOG.md +198 -0
  12. package/airtable-clipper/CHROME_STORE_SUBMISSION.md +343 -0
  13. package/airtable-clipper/LAUNCH_STRATEGY.md +495 -0
  14. package/airtable-clipper/LICENSE +21 -0
  15. package/airtable-clipper/OAUTH_SETUP.md +51 -0
  16. package/airtable-clipper/PRIVACY_POLICY.md +187 -0
  17. package/airtable-clipper/README.md +575 -0
  18. package/airtable-clipper/SUBMIT_TO_CHROME_STORE.md +273 -0
  19. package/airtable-clipper/build.sh +85 -0
  20. package/airtable-clipper/docs/QUICK_START.md +99 -0
  21. package/airtable-clipper/docs/SETUP.md +291 -0
  22. package/airtable-clipper/extension/background.js +337 -0
  23. package/airtable-clipper/extension/base-setup.html +324 -0
  24. package/airtable-clipper/extension/base-setup.js +471 -0
  25. package/airtable-clipper/extension/content.js +771 -0
  26. package/airtable-clipper/extension/icons/README.md +69 -0
  27. package/airtable-clipper/extension/icons/icon-16.png +3 -0
  28. package/airtable-clipper/extension/manifest.json +73 -0
  29. package/airtable-clipper/extension/popup.html +144 -0
  30. package/airtable-clipper/extension/popup.js +475 -0
  31. package/airtable-clipper/extension/styles/content.css +229 -0
  32. package/airtable-clipper/extension/styles/popup.css +477 -0
  33. package/airtable-clipper/privacy-policy.md +63 -0
  34. package/airtable-clipper/releases/v1.0.0/background.js +337 -0
  35. package/airtable-clipper/releases/v1.0.0/base-setup.html +324 -0
  36. package/airtable-clipper/releases/v1.0.0/base-setup.js +471 -0
  37. package/airtable-clipper/releases/v1.0.0/content.js +771 -0
  38. package/airtable-clipper/releases/v1.0.0/icons/README.md +69 -0
  39. package/airtable-clipper/releases/v1.0.0/icons/icon-128.png +2 -0
  40. package/airtable-clipper/releases/v1.0.0/icons/icon-16.png +3 -0
  41. package/airtable-clipper/releases/v1.0.0/icons/icon-32.png +2 -0
  42. package/airtable-clipper/releases/v1.0.0/icons/icon-48.png +2 -0
  43. package/airtable-clipper/releases/v1.0.0/manifest.json +73 -0
  44. package/airtable-clipper/releases/v1.0.0/popup.html +144 -0
  45. package/airtable-clipper/releases/v1.0.0/popup.js +475 -0
  46. package/airtable-clipper/releases/v1.0.0/sidepanel.html +25 -0
  47. package/airtable-clipper/releases/v1.0.0/styles/content.css +229 -0
  48. package/airtable-clipper/releases/v1.0.0/styles/popup.css +477 -0
  49. package/airtable-clipper/releases/v1.0.1/background.js +337 -0
  50. package/airtable-clipper/releases/v1.0.1/base-setup.html +324 -0
  51. package/airtable-clipper/releases/v1.0.1/base-setup.js +471 -0
  52. package/airtable-clipper/releases/v1.0.1/content.js +771 -0
  53. package/airtable-clipper/releases/v1.0.1/icons/README.md +69 -0
  54. package/airtable-clipper/releases/v1.0.1/icons/icon-128.png +2 -0
  55. package/airtable-clipper/releases/v1.0.1/icons/icon-16.png +3 -0
  56. package/airtable-clipper/releases/v1.0.1/icons/icon-32.png +2 -0
  57. package/airtable-clipper/releases/v1.0.1/icons/icon-48.png +2 -0
  58. package/airtable-clipper/releases/v1.0.1/manifest.json +70 -0
  59. package/airtable-clipper/releases/v1.0.1/popup.html +157 -0
  60. package/airtable-clipper/releases/v1.0.1/popup.js +562 -0
  61. package/airtable-clipper/releases/v1.0.1/sidepanel.html +25 -0
  62. package/airtable-clipper/releases/v1.0.1/styles/content.css +229 -0
  63. package/airtable-clipper/releases/v1.0.1/styles/popup.css +647 -0
  64. package/airtable-clipper/releases/v1.0.2/background.js +337 -0
  65. package/airtable-clipper/releases/v1.0.2/base-setup.html +324 -0
  66. package/airtable-clipper/releases/v1.0.2/base-setup.js +471 -0
  67. package/airtable-clipper/releases/v1.0.2/content.js +771 -0
  68. package/airtable-clipper/releases/v1.0.2/icons/README.md +69 -0
  69. package/airtable-clipper/releases/v1.0.2/icons/icon-128.png +2 -0
  70. package/airtable-clipper/releases/v1.0.2/icons/icon-16.png +3 -0
  71. package/airtable-clipper/releases/v1.0.2/icons/icon-32.png +2 -0
  72. package/airtable-clipper/releases/v1.0.2/icons/icon-48.png +2 -0
  73. package/airtable-clipper/releases/v1.0.2/manifest.json +62 -0
  74. package/airtable-clipper/releases/v1.0.2/popup.html +157 -0
  75. package/airtable-clipper/releases/v1.0.2/popup.js +567 -0
  76. package/airtable-clipper/releases/v1.0.2/sidepanel.html +25 -0
  77. package/airtable-clipper/releases/v1.0.2/styles/content.css +229 -0
  78. package/airtable-clipper/releases/v1.0.2/styles/popup.css +647 -0
  79. package/airtable-clipper/terms-of-service.md +124 -0
  80. package/airtable-clipper/test-credentials.md +61 -0
  81. package/airtable-clipper/test-extension/background.js +337 -0
  82. package/airtable-clipper/test-extension/base-setup.html +324 -0
  83. package/airtable-clipper/test-extension/base-setup.js +471 -0
  84. package/airtable-clipper/test-extension/content.js +873 -0
  85. package/airtable-clipper/test-extension/icons/README.md +69 -0
  86. package/airtable-clipper/test-extension/icons/icon-128.png +2 -0
  87. package/airtable-clipper/test-extension/icons/icon-16.png +3 -0
  88. package/airtable-clipper/test-extension/icons/icon-32.png +2 -0
  89. package/airtable-clipper/test-extension/icons/icon-48.png +2 -0
  90. package/airtable-clipper/test-extension/manifest.json +72 -0
  91. package/airtable-clipper/test-extension/popup.html +274 -0
  92. package/airtable-clipper/test-extension/popup.js +729 -0
  93. package/airtable-clipper/test-extension/sidepanel.html +25 -0
  94. package/airtable-clipper/test-extension/styles/content.css +229 -0
  95. package/airtable-clipper/test-extension/styles/popup.css +794 -0
  96. package/airtable_mcp_v2.js +1505 -0
  97. package/airtable_mcp_v2_oauth.js +1048 -0
  98. package/airtable_mcp_v3_advanced.js +1161 -0
  99. package/airtable_simple_production.js +532 -0
  100. package/docker-compose.production.yml +366 -0
  101. package/helm/airtable-mcp/Chart.yaml +122 -0
  102. package/helm/airtable-mcp/values.yaml +538 -0
  103. package/k8s/deployment.yaml +402 -0
  104. package/k8s/namespace.yaml +108 -0
  105. package/k8s/service.yaml +194 -0
  106. package/monitoring/alerts.yml +289 -0
  107. package/monitoring/prometheus.yml +224 -0
  108. package/package.json +6 -6
  109. package/.claude/settings.local.json +0 -12
  110. package/airtable-mcp-1.1.0.tgz +0 -0
  111. package/airtable_enhanced.js +0 -499
  112. package/airtable_simple_v1.2.4_backup.js +0 -277
  113. package/airtable_v1.4.0.js +0 -654
  114. package/rashidazarang-airtable-mcp-1.1.0.tgz +0 -0
  115. package/rashidazarang-airtable-mcp-1.2.0.tgz +0 -0
  116. package/rashidazarang-airtable-mcp-1.2.1.tgz +0 -0
@@ -0,0 +1,229 @@
1
+ /* Airtable Clipper Content Script Styles */
2
+
3
+ /* Floating Action Button */
4
+ #airtable-clipper-fab {
5
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
6
+ }
7
+
8
+ #airtable-clipper-fab .fab-main {
9
+ transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
10
+ }
11
+
12
+ #airtable-clipper-fab .fab-main:hover {
13
+ transform: scale(1.1) rotate(5deg);
14
+ }
15
+
16
+ #airtable-clipper-fab .fab-main:active {
17
+ transform: scale(0.95);
18
+ }
19
+
20
+ /* Selection Toolbar */
21
+ #airtable-clipper-selection-toolbar {
22
+ animation: fadeInUp 0.2s ease;
23
+ }
24
+
25
+ #airtable-clipper-selection-toolbar .selection-btn:hover {
26
+ background: rgba(255, 255, 255, 0.1);
27
+ }
28
+
29
+ /* Bulk Mode Overlay */
30
+ #airtable-clipper-bulk-overlay {
31
+ animation: slideDown 0.3s ease;
32
+ }
33
+
34
+ #airtable-clipper-bulk-overlay .bulk-btn:hover {
35
+ background: rgba(255, 255, 255, 0.3);
36
+ transform: translateY(-1px);
37
+ }
38
+
39
+ /* Bulk Selection Highlights */
40
+ .airtable-clipper-selected {
41
+ background: rgba(102, 126, 234, 0.1) !important;
42
+ border: 2px solid #667eea !important;
43
+ border-radius: 4px;
44
+ transition: all 0.2s ease;
45
+ }
46
+
47
+ .airtable-clipper-selectable:hover {
48
+ background: rgba(102, 126, 234, 0.05) !important;
49
+ cursor: pointer;
50
+ }
51
+
52
+ /* Notifications */
53
+ #airtable-clipper-notification {
54
+ animation: slideInRight 0.3s ease;
55
+ backdrop-filter: blur(10px);
56
+ }
57
+
58
+ /* Animations */
59
+ @keyframes fadeInUp {
60
+ from {
61
+ opacity: 0;
62
+ transform: translateY(10px);
63
+ }
64
+ to {
65
+ opacity: 1;
66
+ transform: translateY(0);
67
+ }
68
+ }
69
+
70
+ @keyframes slideDown {
71
+ from {
72
+ transform: translateY(-100%);
73
+ }
74
+ to {
75
+ transform: translateY(0);
76
+ }
77
+ }
78
+
79
+ @keyframes slideInRight {
80
+ from {
81
+ transform: translateX(100%);
82
+ opacity: 0;
83
+ }
84
+ to {
85
+ transform: translateX(0);
86
+ opacity: 1;
87
+ }
88
+ }
89
+
90
+ @keyframes pulse {
91
+ 0%, 100% {
92
+ opacity: 1;
93
+ }
94
+ 50% {
95
+ opacity: 0.7;
96
+ }
97
+ }
98
+
99
+ /* Loading States */
100
+ .airtable-clipper-loading {
101
+ position: relative;
102
+ opacity: 0.7;
103
+ }
104
+
105
+ .airtable-clipper-loading::after {
106
+ content: '';
107
+ position: absolute;
108
+ top: 50%;
109
+ left: 50%;
110
+ width: 20px;
111
+ height: 20px;
112
+ margin: -10px 0 0 -10px;
113
+ border: 2px solid #667eea;
114
+ border-top: 2px solid transparent;
115
+ border-radius: 50%;
116
+ animation: spin 1s linear infinite;
117
+ }
118
+
119
+ @keyframes spin {
120
+ 0% { transform: rotate(0deg); }
121
+ 100% { transform: rotate(360deg); }
122
+ }
123
+
124
+ /* Site-specific enhancements */
125
+
126
+ /* LinkedIn */
127
+ body[class*="linkedin"] .airtable-clipper-selected,
128
+ [data-test-id*="search-result"] .airtable-clipper-selected {
129
+ box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
130
+ }
131
+
132
+ /* GitHub */
133
+ .repository-content .airtable-clipper-selected,
134
+ .Box .airtable-clipper-selected {
135
+ border-radius: 6px;
136
+ }
137
+
138
+ /* Stack Overflow */
139
+ .question-summary .airtable-clipper-selected,
140
+ .answer .airtable-clipper-selected {
141
+ border-left: 4px solid #667eea;
142
+ padding-left: 8px;
143
+ }
144
+
145
+ /* Medium */
146
+ article .airtable-clipper-selected {
147
+ border-radius: 8px;
148
+ padding: 8px;
149
+ margin: 4px 0;
150
+ }
151
+
152
+ /* Responsive Design */
153
+ @media (max-width: 768px) {
154
+ #airtable-clipper-fab {
155
+ bottom: 80px; /* Above mobile browser UI */
156
+ right: 16px;
157
+ z-index: 10000;
158
+ }
159
+
160
+ #airtable-clipper-fab .fab-main {
161
+ width: 48px;
162
+ height: 48px;
163
+ font-size: 18px;
164
+ }
165
+
166
+ #airtable-clipper-bulk-overlay {
167
+ font-size: 12px;
168
+ padding: 8px 12px;
169
+ }
170
+
171
+ #airtable-clipper-bulk-overlay .bulk-header {
172
+ flex-direction: column;
173
+ gap: 8px;
174
+ align-items: flex-start;
175
+ }
176
+
177
+ #airtable-clipper-bulk-overlay .bulk-actions {
178
+ display: flex;
179
+ gap: 8px;
180
+ }
181
+
182
+ #airtable-clipper-notification {
183
+ top: 10px;
184
+ right: 10px;
185
+ left: 10px;
186
+ max-width: none;
187
+ font-size: 13px;
188
+ }
189
+ }
190
+
191
+ /* Dark Mode Support */
192
+ @media (prefers-color-scheme: dark) {
193
+ .airtable-clipper-selected {
194
+ background: rgba(102, 126, 234, 0.2) !important;
195
+ border-color: #818cf8 !important;
196
+ }
197
+
198
+ .airtable-clipper-selectable:hover {
199
+ background: rgba(102, 126, 234, 0.1) !important;
200
+ }
201
+ }
202
+
203
+ /* High Contrast Mode */
204
+ @media (prefers-contrast: high) {
205
+ #airtable-clipper-fab .fab-main {
206
+ border: 2px solid #000;
207
+ }
208
+
209
+ .airtable-clipper-selected {
210
+ border-width: 3px !important;
211
+ background: rgba(102, 126, 234, 0.3) !important;
212
+ }
213
+ }
214
+
215
+ /* Reduced Motion */
216
+ @media (prefers-reduced-motion: reduce) {
217
+ #airtable-clipper-fab .fab-main,
218
+ #airtable-clipper-notification,
219
+ #airtable-clipper-selection-toolbar,
220
+ #airtable-clipper-bulk-overlay,
221
+ .airtable-clipper-selected {
222
+ animation: none !important;
223
+ transition: none !important;
224
+ }
225
+
226
+ #airtable-clipper-fab .fab-main:hover {
227
+ transform: none !important;
228
+ }
229
+ }
@@ -0,0 +1,477 @@
1
+ /* Airtable Clipper Popup Styles */
2
+
3
+ * {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ body {
10
+ width: 320px;
11
+ min-height: 400px;
12
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
13
+ font-size: 14px;
14
+ line-height: 1.5;
15
+ color: #1f2937;
16
+ background-color: #ffffff;
17
+ }
18
+
19
+ /* Header */
20
+ .header {
21
+ display: flex;
22
+ justify-content: space-between;
23
+ align-items: center;
24
+ padding: 16px;
25
+ border-bottom: 1px solid #e5e7eb;
26
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
27
+ color: white;
28
+ }
29
+
30
+ .logo {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 8px;
34
+ }
35
+
36
+ .logo-icon {
37
+ width: 24px;
38
+ height: 24px;
39
+ }
40
+
41
+ .logo h1 {
42
+ font-size: 16px;
43
+ font-weight: 600;
44
+ }
45
+
46
+ .connection-status {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 6px;
50
+ font-size: 12px;
51
+ }
52
+
53
+ .status-dot {
54
+ width: 8px;
55
+ height: 8px;
56
+ border-radius: 50%;
57
+ background-color: #ef4444;
58
+ }
59
+
60
+ .status-dot.connected {
61
+ background-color: #10b981;
62
+ }
63
+
64
+ .status-dot.connecting {
65
+ background-color: #f59e0b;
66
+ animation: pulse 2s infinite;
67
+ }
68
+
69
+ @keyframes pulse {
70
+ 0%, 100% { opacity: 1; }
71
+ 50% { opacity: 0.5; }
72
+ }
73
+
74
+ /* Quick Actions */
75
+ .quick-actions {
76
+ padding: 16px;
77
+ }
78
+
79
+ .action-btn {
80
+ display: flex;
81
+ align-items: center;
82
+ width: 100%;
83
+ padding: 12px;
84
+ border: none;
85
+ border-radius: 8px;
86
+ cursor: pointer;
87
+ transition: all 0.2s ease;
88
+ font-size: 14px;
89
+ font-weight: 500;
90
+ margin-bottom: 8px;
91
+ }
92
+
93
+ .action-btn.primary {
94
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
95
+ color: white;
96
+ box-shadow: 0 2px 4px rgba(102, 126, 234, 0.3);
97
+ }
98
+
99
+ .action-btn.primary:hover {
100
+ transform: translateY(-1px);
101
+ box-shadow: 0 4px 8px rgba(102, 126, 234, 0.4);
102
+ }
103
+
104
+ .action-btn.secondary {
105
+ background-color: #f3f4f6;
106
+ color: #374151;
107
+ border: 1px solid #d1d5db;
108
+ }
109
+
110
+ .action-btn.secondary:hover {
111
+ background-color: #e5e7eb;
112
+ }
113
+
114
+ .action-btn:disabled {
115
+ opacity: 0.5;
116
+ cursor: not-allowed;
117
+ transform: none !important;
118
+ }
119
+
120
+ .btn-icon {
121
+ font-size: 18px;
122
+ margin-right: 10px;
123
+ }
124
+
125
+ .btn-content {
126
+ display: flex;
127
+ flex-direction: column;
128
+ align-items: flex-start;
129
+ flex: 1;
130
+ }
131
+
132
+ .btn-text {
133
+ font-weight: 500;
134
+ }
135
+
136
+ .btn-subtext {
137
+ font-size: 12px;
138
+ opacity: 0.8;
139
+ margin-top: 2px;
140
+ }
141
+
142
+ .action-row {
143
+ display: grid;
144
+ grid-template-columns: 1fr 1fr;
145
+ gap: 8px;
146
+ }
147
+
148
+ .action-row .action-btn {
149
+ margin-bottom: 0;
150
+ padding: 10px 8px;
151
+ font-size: 13px;
152
+ }
153
+
154
+ .action-row .btn-text {
155
+ font-size: 12px;
156
+ }
157
+
158
+ /* Configuration */
159
+ .configuration {
160
+ padding: 16px;
161
+ }
162
+
163
+ .config-section h3 {
164
+ font-size: 16px;
165
+ font-weight: 600;
166
+ margin-bottom: 8px;
167
+ color: #111827;
168
+ }
169
+
170
+ .help-text {
171
+ font-size: 13px;
172
+ color: #6b7280;
173
+ margin-bottom: 16px;
174
+ }
175
+
176
+ .form-group {
177
+ margin-bottom: 16px;
178
+ }
179
+
180
+ .form-group label {
181
+ display: block;
182
+ font-size: 13px;
183
+ font-weight: 500;
184
+ margin-bottom: 4px;
185
+ color: #374151;
186
+ }
187
+
188
+ .form-group input,
189
+ .form-group select {
190
+ width: 100%;
191
+ padding: 8px 12px;
192
+ border: 1px solid #d1d5db;
193
+ border-radius: 6px;
194
+ font-size: 14px;
195
+ transition: border-color 0.2s ease;
196
+ }
197
+
198
+ .form-group input:focus,
199
+ .form-group select:focus {
200
+ outline: none;
201
+ border-color: #667eea;
202
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
203
+ }
204
+
205
+ .help-link {
206
+ display: inline-block;
207
+ font-size: 12px;
208
+ color: #667eea;
209
+ text-decoration: none;
210
+ margin-top: 4px;
211
+ }
212
+
213
+ .help-link:hover {
214
+ text-decoration: underline;
215
+ }
216
+
217
+ .btn {
218
+ padding: 10px 16px;
219
+ border: none;
220
+ border-radius: 6px;
221
+ font-size: 14px;
222
+ font-weight: 500;
223
+ cursor: pointer;
224
+ transition: all 0.2s ease;
225
+ }
226
+
227
+ .btn.primary {
228
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
229
+ color: white;
230
+ }
231
+
232
+ .btn.primary:hover {
233
+ transform: translateY(-1px);
234
+ box-shadow: 0 2px 4px rgba(102, 126, 234, 0.3);
235
+ }
236
+
237
+ .btn.full-width {
238
+ width: 100%;
239
+ }
240
+
241
+ .btn-loading {
242
+ margin-right: 8px;
243
+ }
244
+
245
+ /* Settings */
246
+ .settings {
247
+ padding: 16px;
248
+ border-top: 1px solid #e5e7eb;
249
+ }
250
+
251
+ .setting-item {
252
+ margin-bottom: 16px;
253
+ }
254
+
255
+ .setting-item label {
256
+ display: block;
257
+ font-size: 13px;
258
+ font-weight: 500;
259
+ margin-bottom: 4px;
260
+ color: #374151;
261
+ }
262
+
263
+ .setting-item select {
264
+ width: 100%;
265
+ padding: 6px 10px;
266
+ border: 1px solid #d1d5db;
267
+ border-radius: 4px;
268
+ font-size: 13px;
269
+ }
270
+
271
+ /* Checkbox styling */
272
+ .checkbox-label {
273
+ display: flex !important;
274
+ align-items: center;
275
+ cursor: pointer;
276
+ font-size: 13px !important;
277
+ margin-bottom: 0 !important;
278
+ }
279
+
280
+ .checkbox-label input[type="checkbox"] {
281
+ display: none;
282
+ }
283
+
284
+ .checkmark {
285
+ width: 16px;
286
+ height: 16px;
287
+ border: 2px solid #d1d5db;
288
+ border-radius: 3px;
289
+ margin-right: 8px;
290
+ position: relative;
291
+ transition: all 0.2s ease;
292
+ }
293
+
294
+ .checkbox-label input[type="checkbox"]:checked + .checkmark {
295
+ background-color: #667eea;
296
+ border-color: #667eea;
297
+ }
298
+
299
+ .checkbox-label input[type="checkbox"]:checked + .checkmark::after {
300
+ content: '✓';
301
+ position: absolute;
302
+ top: -2px;
303
+ left: 2px;
304
+ color: white;
305
+ font-size: 12px;
306
+ font-weight: bold;
307
+ }
308
+
309
+ /* Status Messages */
310
+ .status-message {
311
+ position: absolute;
312
+ top: 60px;
313
+ left: 16px;
314
+ right: 16px;
315
+ background-color: #f0fdf4;
316
+ border: 1px solid #bbf7d0;
317
+ border-radius: 6px;
318
+ padding: 12px;
319
+ z-index: 1000;
320
+ animation: slideIn 0.3s ease;
321
+ }
322
+
323
+ .status-message.error {
324
+ background-color: #fef2f2;
325
+ border-color: #fecaca;
326
+ }
327
+
328
+ .status-content {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 8px;
332
+ }
333
+
334
+ .status-icon {
335
+ font-size: 16px;
336
+ }
337
+
338
+ .status-text {
339
+ flex: 1;
340
+ font-size: 13px;
341
+ font-weight: 500;
342
+ }
343
+
344
+ .status-close {
345
+ background: none;
346
+ border: none;
347
+ font-size: 16px;
348
+ cursor: pointer;
349
+ color: #6b7280;
350
+ }
351
+
352
+ @keyframes slideIn {
353
+ from {
354
+ transform: translateY(-10px);
355
+ opacity: 0;
356
+ }
357
+ to {
358
+ transform: translateY(0);
359
+ opacity: 1;
360
+ }
361
+ }
362
+
363
+ /* Footer */
364
+ .footer {
365
+ border-top: 1px solid #e5e7eb;
366
+ padding: 12px 16px;
367
+ background-color: #f9fafb;
368
+ }
369
+
370
+ .footer-links {
371
+ display: flex;
372
+ justify-content: space-between;
373
+ margin-bottom: 8px;
374
+ }
375
+
376
+ .footer-link {
377
+ background: none;
378
+ border: none;
379
+ color: #667eea;
380
+ font-size: 12px;
381
+ cursor: pointer;
382
+ text-decoration: none;
383
+ }
384
+
385
+ .footer-link:hover {
386
+ text-decoration: underline;
387
+ }
388
+
389
+ .usage-info {
390
+ text-align: center;
391
+ }
392
+
393
+ .usage-text {
394
+ font-size: 11px;
395
+ color: #6b7280;
396
+ }
397
+
398
+ /* Loading Overlay */
399
+ .loading-overlay {
400
+ position: absolute;
401
+ top: 0;
402
+ left: 0;
403
+ right: 0;
404
+ bottom: 0;
405
+ background-color: rgba(255, 255, 255, 0.9);
406
+ display: flex;
407
+ flex-direction: column;
408
+ align-items: center;
409
+ justify-content: center;
410
+ z-index: 2000;
411
+ }
412
+
413
+ .loading-spinner {
414
+ width: 32px;
415
+ height: 32px;
416
+ border: 3px solid #e5e7eb;
417
+ border-top: 3px solid #667eea;
418
+ border-radius: 50%;
419
+ animation: spin 1s linear infinite;
420
+ margin-bottom: 12px;
421
+ }
422
+
423
+ .loading-text {
424
+ font-size: 14px;
425
+ color: #6b7280;
426
+ }
427
+
428
+ @keyframes spin {
429
+ 0% { transform: rotate(0deg); }
430
+ 100% { transform: rotate(360deg); }
431
+ }
432
+
433
+ /* Responsive adjustments */
434
+ @media (max-width: 350px) {
435
+ body {
436
+ width: 300px;
437
+ }
438
+
439
+ .action-row {
440
+ grid-template-columns: 1fr;
441
+ }
442
+ }
443
+
444
+ /* Dark mode support */
445
+ @media (prefers-color-scheme: dark) {
446
+ body {
447
+ background-color: #1f2937;
448
+ color: #f3f4f6;
449
+ }
450
+
451
+ .header {
452
+ border-bottom-color: #374151;
453
+ }
454
+
455
+ .action-btn.secondary {
456
+ background-color: #374151;
457
+ color: #f3f4f6;
458
+ border-color: #4b5563;
459
+ }
460
+
461
+ .action-btn.secondary:hover {
462
+ background-color: #4b5563;
463
+ }
464
+
465
+ .form-group input,
466
+ .form-group select,
467
+ .setting-item select {
468
+ background-color: #374151;
469
+ border-color: #4b5563;
470
+ color: #f3f4f6;
471
+ }
472
+
473
+ .footer {
474
+ background-color: #374151;
475
+ border-top-color: #4b5563;
476
+ }
477
+ }