@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.
- package/.github/ISSUE_TEMPLATE/bug-report.yml +173 -0
- package/.github/ISSUE_TEMPLATE/feature-request.yml +209 -0
- package/.github/ISSUE_TEMPLATE/security-report.yml +216 -0
- package/.github/pull_request_template.md +245 -0
- package/.github/workflows/ci-cd.yml +408 -0
- package/.github/workflows/security-audit.yml +316 -0
- package/API_DOCUMENTATION.md +897 -0
- package/CODE_OF_CONDUCT.md +181 -0
- package/Dockerfile.production +127 -0
- package/README.md +55 -10
- package/RELEASE_NOTES_v1.6.0.md +248 -0
- package/airtable-clipper/CHANGELOG.md +198 -0
- package/airtable-clipper/CHROME_STORE_SUBMISSION.md +343 -0
- package/airtable-clipper/LAUNCH_STRATEGY.md +495 -0
- package/airtable-clipper/LICENSE +21 -0
- package/airtable-clipper/OAUTH_SETUP.md +51 -0
- package/airtable-clipper/PRIVACY_POLICY.md +187 -0
- package/airtable-clipper/README.md +575 -0
- package/airtable-clipper/SUBMIT_TO_CHROME_STORE.md +273 -0
- package/airtable-clipper/build.sh +85 -0
- package/airtable-clipper/docs/QUICK_START.md +99 -0
- package/airtable-clipper/docs/SETUP.md +291 -0
- package/airtable-clipper/extension/background.js +337 -0
- package/airtable-clipper/extension/base-setup.html +324 -0
- package/airtable-clipper/extension/base-setup.js +471 -0
- package/airtable-clipper/extension/content.js +771 -0
- package/airtable-clipper/extension/icons/README.md +69 -0
- package/airtable-clipper/extension/icons/icon-16.png +3 -0
- package/airtable-clipper/extension/manifest.json +73 -0
- package/airtable-clipper/extension/popup.html +144 -0
- package/airtable-clipper/extension/popup.js +475 -0
- package/airtable-clipper/extension/styles/content.css +229 -0
- package/airtable-clipper/extension/styles/popup.css +477 -0
- package/airtable-clipper/privacy-policy.md +63 -0
- package/airtable-clipper/releases/v1.0.0/background.js +337 -0
- package/airtable-clipper/releases/v1.0.0/base-setup.html +324 -0
- package/airtable-clipper/releases/v1.0.0/base-setup.js +471 -0
- package/airtable-clipper/releases/v1.0.0/content.js +771 -0
- package/airtable-clipper/releases/v1.0.0/icons/README.md +69 -0
- package/airtable-clipper/releases/v1.0.0/icons/icon-128.png +2 -0
- package/airtable-clipper/releases/v1.0.0/icons/icon-16.png +3 -0
- package/airtable-clipper/releases/v1.0.0/icons/icon-32.png +2 -0
- package/airtable-clipper/releases/v1.0.0/icons/icon-48.png +2 -0
- package/airtable-clipper/releases/v1.0.0/manifest.json +73 -0
- package/airtable-clipper/releases/v1.0.0/popup.html +144 -0
- package/airtable-clipper/releases/v1.0.0/popup.js +475 -0
- package/airtable-clipper/releases/v1.0.0/sidepanel.html +25 -0
- package/airtable-clipper/releases/v1.0.0/styles/content.css +229 -0
- package/airtable-clipper/releases/v1.0.0/styles/popup.css +477 -0
- package/airtable-clipper/releases/v1.0.1/background.js +337 -0
- package/airtable-clipper/releases/v1.0.1/base-setup.html +324 -0
- package/airtable-clipper/releases/v1.0.1/base-setup.js +471 -0
- package/airtable-clipper/releases/v1.0.1/content.js +771 -0
- package/airtable-clipper/releases/v1.0.1/icons/README.md +69 -0
- package/airtable-clipper/releases/v1.0.1/icons/icon-128.png +2 -0
- package/airtable-clipper/releases/v1.0.1/icons/icon-16.png +3 -0
- package/airtable-clipper/releases/v1.0.1/icons/icon-32.png +2 -0
- package/airtable-clipper/releases/v1.0.1/icons/icon-48.png +2 -0
- package/airtable-clipper/releases/v1.0.1/manifest.json +70 -0
- package/airtable-clipper/releases/v1.0.1/popup.html +157 -0
- package/airtable-clipper/releases/v1.0.1/popup.js +562 -0
- package/airtable-clipper/releases/v1.0.1/sidepanel.html +25 -0
- package/airtable-clipper/releases/v1.0.1/styles/content.css +229 -0
- package/airtable-clipper/releases/v1.0.1/styles/popup.css +647 -0
- package/airtable-clipper/releases/v1.0.2/background.js +337 -0
- package/airtable-clipper/releases/v1.0.2/base-setup.html +324 -0
- package/airtable-clipper/releases/v1.0.2/base-setup.js +471 -0
- package/airtable-clipper/releases/v1.0.2/content.js +771 -0
- package/airtable-clipper/releases/v1.0.2/icons/README.md +69 -0
- package/airtable-clipper/releases/v1.0.2/icons/icon-128.png +2 -0
- package/airtable-clipper/releases/v1.0.2/icons/icon-16.png +3 -0
- package/airtable-clipper/releases/v1.0.2/icons/icon-32.png +2 -0
- package/airtable-clipper/releases/v1.0.2/icons/icon-48.png +2 -0
- package/airtable-clipper/releases/v1.0.2/manifest.json +62 -0
- package/airtable-clipper/releases/v1.0.2/popup.html +157 -0
- package/airtable-clipper/releases/v1.0.2/popup.js +567 -0
- package/airtable-clipper/releases/v1.0.2/sidepanel.html +25 -0
- package/airtable-clipper/releases/v1.0.2/styles/content.css +229 -0
- package/airtable-clipper/releases/v1.0.2/styles/popup.css +647 -0
- package/airtable-clipper/terms-of-service.md +124 -0
- package/airtable-clipper/test-credentials.md +61 -0
- package/airtable-clipper/test-extension/background.js +337 -0
- package/airtable-clipper/test-extension/base-setup.html +324 -0
- package/airtable-clipper/test-extension/base-setup.js +471 -0
- package/airtable-clipper/test-extension/content.js +873 -0
- package/airtable-clipper/test-extension/icons/README.md +69 -0
- package/airtable-clipper/test-extension/icons/icon-128.png +2 -0
- package/airtable-clipper/test-extension/icons/icon-16.png +3 -0
- package/airtable-clipper/test-extension/icons/icon-32.png +2 -0
- package/airtable-clipper/test-extension/icons/icon-48.png +2 -0
- package/airtable-clipper/test-extension/manifest.json +72 -0
- package/airtable-clipper/test-extension/popup.html +274 -0
- package/airtable-clipper/test-extension/popup.js +729 -0
- package/airtable-clipper/test-extension/sidepanel.html +25 -0
- package/airtable-clipper/test-extension/styles/content.css +229 -0
- package/airtable-clipper/test-extension/styles/popup.css +794 -0
- package/airtable_mcp_v2.js +1505 -0
- package/airtable_mcp_v2_oauth.js +1048 -0
- package/airtable_mcp_v3_advanced.js +1161 -0
- package/airtable_simple.js +447 -1
- package/airtable_simple_production.js +532 -0
- package/docker-compose.production.yml +366 -0
- package/helm/airtable-mcp/Chart.yaml +122 -0
- package/helm/airtable-mcp/values.yaml +538 -0
- package/k8s/deployment.yaml +402 -0
- package/k8s/namespace.yaml +108 -0
- package/k8s/service.yaml +194 -0
- package/monitoring/alerts.yml +289 -0
- package/monitoring/prometheus.yml +224 -0
- package/package.json +6 -6
- package/test_v1.6.0_comprehensive.sh +187 -0
- package/.claude/settings.local.json +0 -12
- package/airtable-mcp-1.1.0.tgz +0 -0
- package/airtable_enhanced.js +0 -499
- package/airtable_simple_v1.2.4_backup.js +0 -277
- package/airtable_v1.4.0.js +0 -654
- package/rashidazarang-airtable-mcp-1.1.0.tgz +0 -0
- package/rashidazarang-airtable-mcp-1.2.0.tgz +0 -0
- package/rashidazarang-airtable-mcp-1.2.1.tgz +0 -0
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Privacy Policy for Airtable Clipper
|
|
2
|
+
|
|
3
|
+
**Last updated: August 15, 2025**
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Airtable Clipper is a Chrome extension that allows users to save web content to their Airtable bases. We are committed to protecting your privacy and being transparent about our data practices.
|
|
8
|
+
|
|
9
|
+
## Information We Collect
|
|
10
|
+
|
|
11
|
+
### Authentication Information
|
|
12
|
+
- **Airtable Personal Access Token**: Stored locally in your browser to authenticate with your Airtable account
|
|
13
|
+
- **Airtable Base ID**: Stored locally to identify which Airtable base to save content to
|
|
14
|
+
|
|
15
|
+
### Website Content
|
|
16
|
+
- **Page Information**: When you save a page, we collect the page title, URL, and any content you choose to save
|
|
17
|
+
- **LinkedIn Profile Data**: When saving LinkedIn profiles, we extract publicly available profile information (name, title, company, etc.)
|
|
18
|
+
|
|
19
|
+
## How We Use Your Information
|
|
20
|
+
|
|
21
|
+
- **Authentication**: Your Airtable credentials are used solely to save content to your chosen Airtable base
|
|
22
|
+
- **Content Saving**: Website content is processed and sent directly to your Airtable base
|
|
23
|
+
- **Local Storage**: All authentication data is stored locally in your browser using Chrome's secure storage API
|
|
24
|
+
|
|
25
|
+
## Data Sharing and Third Parties
|
|
26
|
+
|
|
27
|
+
- **No Data Sale**: We do not sell, rent, or trade your personal information to third parties
|
|
28
|
+
- **Airtable Integration**: Content is sent directly to your Airtable account via their official API
|
|
29
|
+
- **No External Servers**: We do not store your data on our servers or send it anywhere except directly to your Airtable account
|
|
30
|
+
|
|
31
|
+
## Data Security
|
|
32
|
+
|
|
33
|
+
- **Local Storage**: Authentication credentials are stored securely in your browser using Chrome's encrypted storage
|
|
34
|
+
- **HTTPS**: All communications with Airtable use secure HTTPS connections
|
|
35
|
+
- **No Logging**: We do not log or track your usage of the extension
|
|
36
|
+
|
|
37
|
+
## Data Retention
|
|
38
|
+
|
|
39
|
+
- **Local Storage**: Data is stored locally until you disconnect the extension or uninstall it
|
|
40
|
+
- **User Control**: You can disconnect and clear all stored data at any time through the extension's settings
|
|
41
|
+
|
|
42
|
+
## Your Rights
|
|
43
|
+
|
|
44
|
+
- **Access**: You control all data stored by the extension
|
|
45
|
+
- **Deletion**: You can disconnect the extension to remove all stored authentication data
|
|
46
|
+
- **Portability**: All saved content goes directly to your Airtable account, which you control
|
|
47
|
+
|
|
48
|
+
## Changes to This Policy
|
|
49
|
+
|
|
50
|
+
We may update this privacy policy occasionally. Changes will be posted on this page with an updated revision date.
|
|
51
|
+
|
|
52
|
+
## Contact Us
|
|
53
|
+
|
|
54
|
+
If you have questions about this privacy policy or the extension, please contact us at:
|
|
55
|
+
- GitHub: https://github.com/rashidazarang/airtable-clipper/issues
|
|
56
|
+
|
|
57
|
+
## Compliance
|
|
58
|
+
|
|
59
|
+
This extension complies with:
|
|
60
|
+
- Chrome Web Store Developer Program Policies
|
|
61
|
+
- General Data Protection Regulation (GDPR)
|
|
62
|
+
- California Consumer Privacy Act (CCPA)
|
|
63
|
+
- Airtable's Terms of Service and API Usage Guidelines
|