@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,69 @@
1
+ # Extension Icons
2
+
3
+ This directory contains the required icon files for the Chrome extension.
4
+
5
+ ## Required Sizes
6
+
7
+ - **icon-16.png** (16x16) - Extension management page
8
+ - **icon-32.png** (32x32) - Extension management page & Windows
9
+ - **icon-48.png** (48x48) - Extensions page
10
+ - **icon-128.png** (128x128) - Chrome Web Store & install dialog
11
+
12
+ ## Design Guidelines
13
+
14
+ ### Visual Style
15
+ - **Symbol**: Simple paperclip or clipboard icon
16
+ - **Colors**: Airtable brand colors (blue #667eea to purple #764ba2 gradient)
17
+ - **Style**: Modern, clean, professional
18
+ - **Background**: Transparent PNG
19
+
20
+ ### Technical Requirements
21
+ - **Format**: PNG with transparent background
22
+ - **Quality**: High resolution, crisp at all sizes
23
+ - **Colors**: Web-safe colors that work on light and dark themes
24
+ - **Consistency**: Same design scaled to different sizes
25
+
26
+ ### Design Inspiration
27
+ The icon should represent:
28
+ - 📎 **Clipping/Saving**: Paperclip, clipboard, or save symbol
29
+ - 🔗 **Connection**: Link between web and Airtable
30
+ - ⚡ **Speed**: Quick, efficient data capture
31
+ - 🎯 **Precision**: Accurate data extraction
32
+
33
+ ## Creating Icons
34
+
35
+ ### Tools
36
+ - **Figma**: For vector-based design
37
+ - **Sketch**: Professional icon design
38
+ - **Adobe Illustrator**: Vector graphics
39
+ - **GIMP/Photoshop**: Raster editing
40
+
41
+ ### Process
42
+ 1. Design at highest resolution (128x128)
43
+ 2. Use vector graphics for scalability
44
+ 3. Export as PNG with transparent background
45
+ 4. Test visibility on Chrome toolbar
46
+ 5. Ensure clarity at 16x16 size
47
+
48
+ ## Placeholder Status
49
+
50
+ ⚠️ **Current files are placeholders**
51
+
52
+ The current icon files are text placeholders. For production deployment, replace with actual PNG icons following the design guidelines above.
53
+
54
+ ## Quick Icon Generation
55
+
56
+ For rapid prototyping, you can generate simple icons using:
57
+
58
+ ```bash
59
+ # Create simple colored squares as placeholders
60
+ convert -size 16x16 xc:'#667eea' extension/icons/icon-16.png
61
+ convert -size 32x32 xc:'#667eea' extension/icons/icon-32.png
62
+ convert -size 48x48 xc:'#667eea' extension/icons/icon-48.png
63
+ convert -size 128x128 xc:'#667eea' extension/icons/icon-128.png
64
+ ```
65
+
66
+ Or use online icon generators:
67
+ - [Favicon.io](https://favicon.io/)
68
+ - [RealFaviconGenerator](https://realfavicongenerator.net/)
69
+ - [Canva Icon Maker](https://canva.com)
@@ -0,0 +1,2 @@
1
+ # Placeholder icon - 128x128 pixels
2
+ # For production, replace with actual PNG file
@@ -0,0 +1,3 @@
1
+ # Placeholder icon - 16x16 pixels
2
+ # In a real deployment, this would be an actual PNG file
3
+ # For now, creating a text placeholder
@@ -0,0 +1,2 @@
1
+ # Placeholder icon - 32x32 pixels
2
+ # For production, replace with actual PNG file
@@ -0,0 +1,2 @@
1
+ # Placeholder icon - 48x48 pixels
2
+ # For production, replace with actual PNG file
@@ -0,0 +1,72 @@
1
+ {
2
+ "manifest_version": 3,
3
+ "name": "Airtable Clipper",
4
+ "version": "1.0.0",
5
+ "description": "Save anything from the web to Airtable with one click. Perfect for CRM, research, and data collection.",
6
+ "author": "Rashid Azarang",
7
+
8
+ "permissions": [
9
+ "activeTab",
10
+ "storage",
11
+ "contextMenus",
12
+ "notifications",
13
+ "scripting",
14
+ "identity"
15
+ ],
16
+
17
+ "host_permissions": [
18
+ "https://api.airtable.com/*"
19
+ ],
20
+
21
+ "background": {
22
+ "service_worker": "background.js",
23
+ "type": "module"
24
+ },
25
+
26
+ "action": {
27
+ "default_popup": "popup.html",
28
+ "default_icon": {
29
+ "16": "icons/icon-16.png",
30
+ "32": "icons/icon-32.png",
31
+ "48": "icons/icon-48.png",
32
+ "128": "icons/icon-128.png"
33
+ }
34
+ },
35
+
36
+ "side_panel": {
37
+ "default_path": "sidepanel.html"
38
+ },
39
+
40
+ "web_accessible_resources": [
41
+ {
42
+ "resources": [
43
+ "lib/*.js",
44
+ "styles/*.css",
45
+ "icons/*.png",
46
+ "base-setup.html",
47
+ "base-setup.js"
48
+ ],
49
+ "matches": ["https://api.airtable.com/*"]
50
+ }
51
+ ],
52
+
53
+ "icons": {
54
+ "16": "icons/icon-16.png",
55
+ "32": "icons/icon-32.png",
56
+ "48": "icons/icon-48.png",
57
+ "128": "icons/icon-128.png"
58
+ },
59
+
60
+ "oauth2": {
61
+ "client_id": "db9710e0-7d4b-4be6-bb15-2621448b0425",
62
+ "scopes": [
63
+ "data.records:read",
64
+ "data.records:write",
65
+ "schema.bases:read"
66
+ ]
67
+ },
68
+
69
+ "content_security_policy": {
70
+ "extension_pages": "script-src 'self'; object-src 'self';"
71
+ }
72
+ }
@@ -0,0 +1,274 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Airtable Clipper</title>
7
+ <link rel="stylesheet" href="styles/popup.css">
8
+ </head>
9
+ <body>
10
+ <!-- Setup State -->
11
+ <div class="container" id="setupContainer">
12
+ <div class="header">
13
+ <div class="brand">
14
+ <div class="logo">
15
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none">
16
+ <path d="M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3ZM19 19H5V5H19V19Z" fill="currentColor"/>
17
+ <path d="M7 7H17V9H7V7ZM7 11H17V13H7V11ZM7 15H13V17H7V15Z" fill="currentColor"/>
18
+ </svg>
19
+ <span class="logo-text">Airtable Clipper</span>
20
+ </div>
21
+ <div class="status-badge" id="statusBadge">
22
+ <span class="status-dot"></span>
23
+ <span class="status-text">Disconnected</span>
24
+ </div>
25
+ </div>
26
+ <p class="subtitle">Save anything from the web to Airtable</p>
27
+ </div>
28
+
29
+ <div class="auth-container">
30
+ <!-- Primary OAuth Flow -->
31
+ <div class="auth-section">
32
+ <button class="btn btn-primary" id="oauthBtn">
33
+ <svg class="btn-icon" width="20" height="20" viewBox="0 0 24 24" fill="none">
34
+ <path d="M12 2L13.09 8.26L20 9L13.09 9.74L12 16L10.91 9.74L4 9L10.91 8.26L12 2Z" fill="currentColor"/>
35
+ </svg>
36
+ <span class="btn-text">Connect with Airtable</span>
37
+ <div class="btn-spinner" id="oauthSpinner"></div>
38
+ </button>
39
+ <p class="auth-description">Secure OAuth authentication with one click</p>
40
+ </div>
41
+
42
+ <!-- Base Selection (hidden initially) -->
43
+ <div class="base-selector" id="baseSelector" style="display: none;">
44
+ <div class="form-field">
45
+ <label class="field-label">Choose your workspace</label>
46
+ <div class="select-wrapper">
47
+ <select class="field-select" id="baseSelect">
48
+ <option value="">Select a base...</option>
49
+ </select>
50
+ <svg class="select-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none">
51
+ <path d="M7 10L12 15L17 10H7Z" fill="currentColor"/>
52
+ </svg>
53
+ </div>
54
+ </div>
55
+ <button class="btn btn-secondary" id="confirmBaseBtn">
56
+ <span class="btn-text">Start Clipping</span>
57
+ </button>
58
+ </div>
59
+
60
+ <!-- Alternative Manual Auth -->
61
+ <div class="divider">
62
+ <span class="divider-text">or</span>
63
+ </div>
64
+
65
+ <div class="manual-auth" style="border: 1px solid var(--gray-200); border-radius: var(--radius-lg); overflow: hidden;">
66
+ <div class="manual-summary" style="display: flex; align-items: center; gap: var(--space-3); padding: var(--space-4); font-size: var(--font-sm); font-weight: 500; color: var(--gray-700); background: var(--gray-50); border-bottom: 1px solid var(--gray-200);">
67
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none">
68
+ <path d="M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z" fill="currentColor"/>
69
+ </svg>
70
+ Connect manually with API token
71
+ </div>
72
+
73
+ <div class="manual-content" style="padding: var(--space-5);">
74
+ <div class="form-field">
75
+ <label class="field-label">Personal Access Token</label>
76
+ <div class="input-wrapper">
77
+ <input type="password" class="field-input" id="tokenInput" placeholder="pat_xxxxxxxxxxxxxxxx">
78
+ <a href="https://airtable.com/create/tokens" target="_blank" class="input-help">
79
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none">
80
+ <path d="M14 3V5H17.59L7.76 14.83L9.17 16.24L19 6.41V10H21V3H14ZM19 19H5V5H12V3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V12H19V19Z" fill="currentColor"/>
81
+ </svg>
82
+ Create token
83
+ </a>
84
+ </div>
85
+ </div>
86
+
87
+ <div class="form-field">
88
+ <label class="field-label">Base ID</label>
89
+ <div class="input-wrapper">
90
+ <input type="text" class="field-input" id="baseInput" placeholder="appXXXXXXXXXXXXXX">
91
+ <div class="input-hint">Found in your Airtable URL</div>
92
+ </div>
93
+ </div>
94
+
95
+ <button class="btn btn-primary" id="manualConnectBtn" onclick="console.log('Button clicked directly!')" style="background: #3b82f6 !important; color: white !important; pointer-events: auto !important; position: relative !important; z-index: 999 !important;">
96
+ <span class="btn-text">Connect</span>
97
+ <div class="btn-spinner" id="manualSpinner" style="display: none;"></div>
98
+ </button>
99
+ </div>
100
+ </div>
101
+ </div>
102
+
103
+ <div class="footer-actions">
104
+ <button class="btn btn-ghost" id="setupBtn">
105
+ <svg class="btn-icon" width="16" height="16" viewBox="0 0 24 24" fill="none">
106
+ <path d="M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3ZM19 19H5V5H19V19Z" fill="currentColor"/>
107
+ <path d="M12 7V17M7 12H17" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
108
+ </svg>
109
+ Create optimized database
110
+ </button>
111
+ </div>
112
+ </div>
113
+
114
+ <!-- Connected State -->
115
+ <div class="container" id="connectedContainer" style="display: none;">
116
+ <div class="header">
117
+ <div class="brand">
118
+ <div class="page-info">
119
+ <div class="page-icon" id="pageIcon">🌐</div>
120
+ <div class="page-details">
121
+ <h3 class="page-title" id="pageTitle">Current Page</h3>
122
+ <p class="page-url" id="pageUrl">example.com</p>
123
+ </div>
124
+ </div>
125
+ <div class="status-badge connected">
126
+ <span class="status-dot"></span>
127
+ <span class="status-text">Connected</span>
128
+ </div>
129
+ </div>
130
+ </div>
131
+
132
+ <!-- Primary Action -->
133
+ <div class="action-section">
134
+ <button class="btn btn-primary action-primary" id="saveBtn">
135
+ <svg class="btn-icon" width="20" height="20" viewBox="0 0 24 24" fill="none">
136
+ <path d="M12 2L13.09 8.26L20 9L13.09 9.74L12 16L10.91 9.74L4 9L10.91 8.26L12 2Z" fill="currentColor"/>
137
+ </svg>
138
+ <div class="btn-content">
139
+ <span class="btn-text">Save Page</span>
140
+ <span class="btn-subtitle" id="saveTarget">to Web Clips</span>
141
+ </div>
142
+ <div class="btn-spinner" id="saveSpinner"></div>
143
+ </button>
144
+ </div>
145
+
146
+ <!-- Secondary Actions -->
147
+ <div class="actions-grid">
148
+ <button class="action-card" id="linkedinBtn" style="display: none;">
149
+ <div class="action-icon">
150
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none">
151
+ <path d="M19 3A2 2 0 0 1 21 5V19A2 2 0 0 1 19 21H5A2 2 0 0 1 3 19V5A2 2 0 0 1 5 3H19ZM18.5 18.5V13.2A3.26 3.26 0 0 0 15.24 9.94C14.39 9.94 13.4 10.46 12.92 11.24V10.13H10.13V18.5H12.92V13.57C12.92 12.8 13.54 12.17 14.31 12.17A1.4 1.4 0 0 1 15.71 13.57V18.5H18.5ZM6.88 8.56A1.68 1.68 0 0 0 8.56 6.88C8.56 5.95 7.81 5.19 6.88 5.19A1.69 1.69 0 0 0 5.19 6.88C5.19 7.81 5.95 8.56 6.88 8.56ZM8.27 18.5V10.13H5.5V18.5H8.27Z" fill="currentColor"/>
152
+ </svg>
153
+ </div>
154
+ <div class="action-content">
155
+ <span class="action-title">Save Profile</span>
156
+ <span class="action-subtitle">Extract LinkedIn data</span>
157
+ </div>
158
+ </button>
159
+
160
+ <button class="action-card" id="bulkBtn">
161
+ <div class="action-icon">
162
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none">
163
+ <path d="M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z" fill="currentColor"/>
164
+ </svg>
165
+ </div>
166
+ <div class="action-content">
167
+ <span class="action-title">Bulk Mode</span>
168
+ <span class="action-subtitle">Select multiple items</span>
169
+ </div>
170
+ </button>
171
+
172
+ <button class="action-card" id="settingsBtn">
173
+ <div class="action-icon">
174
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none">
175
+ <path d="M12 15.5A3.5 3.5 0 0 1 8.5 12A3.5 3.5 0 0 1 12 8.5A3.5 3.5 0 0 1 15.5 12A3.5 3.5 0 0 1 12 15.5M19.43 12.98C19.47 12.66 19.5 12.34 19.5 12C19.5 11.66 19.47 11.34 19.43 11.02L21.54 9.37C21.73 9.22 21.78 8.95 21.66 8.73L19.66 5.27C19.54 5.05 19.27 4.96 19.05 5.05L16.56 6.05C16.04 5.65 15.48 5.32 14.87 5.07L14.49 2.42C14.46 2.18 14.25 2 14 2H10C9.75 2 9.54 2.18 9.51 2.42L9.13 5.07C8.52 5.32 7.96 5.66 7.44 6.05L4.95 5.05C4.73 4.96 4.46 5.05 4.34 5.27L2.34 8.73C2.22 8.95 2.27 9.22 2.46 9.37L4.57 11.02C4.53 11.34 4.5 11.67 4.5 12C4.5 12.33 4.53 12.66 4.57 12.98L2.46 14.63C2.27 14.78 2.22 15.05 2.34 15.27L4.34 18.73C4.46 18.95 4.73 19.03 4.95 18.95L7.44 17.94C7.96 18.34 8.52 18.68 9.13 18.93L9.51 21.58C9.54 21.82 9.75 22 10 22H14C14.25 22 14.46 21.82 14.49 21.58L14.87 18.93C15.48 18.68 16.04 18.34 16.56 17.94L19.05 18.95C19.27 19.03 19.54 18.95 19.66 18.73L21.66 15.27C21.78 15.05 21.73 14.78 21.54 14.63L19.43 12.98Z" fill="currentColor"/>
176
+ </svg>
177
+ </div>
178
+ <div class="action-content">
179
+ <span class="action-title">Settings</span>
180
+ <span class="action-subtitle">Configure tables</span>
181
+ </div>
182
+ </button>
183
+ </div>
184
+ </div>
185
+
186
+ <!-- Settings Panel -->
187
+ <div class="settings-panel" id="settingsPanel" style="display: none;">
188
+ <div class="panel-header">
189
+ <h3 class="panel-title">Settings</h3>
190
+ <button class="btn-close" id="closeSettings">
191
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none">
192
+ <path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
193
+ </svg>
194
+ </button>
195
+ </div>
196
+
197
+ <div class="panel-content">
198
+ <div class="setting-group">
199
+ <label class="setting-label">Default Table</label>
200
+ <div class="select-wrapper">
201
+ <select class="field-select" id="defaultTable">
202
+ <option value="Web Clips">Web Clips</option>
203
+ </select>
204
+ <svg class="select-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none">
205
+ <path d="M7 10L12 15L17 10H7Z" fill="currentColor"/>
206
+ </svg>
207
+ </div>
208
+ </div>
209
+
210
+ <div class="setting-group">
211
+ <label class="setting-label">LinkedIn Table</label>
212
+ <div class="select-wrapper">
213
+ <select class="field-select" id="linkedinTable">
214
+ <option value="Contacts">Contacts</option>
215
+ </select>
216
+ <svg class="select-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none">
217
+ <path d="M7 10L12 15L17 10H7Z" fill="currentColor"/>
218
+ </svg>
219
+ </div>
220
+ </div>
221
+
222
+ <div class="setting-group">
223
+ <div class="toggle-setting">
224
+ <div class="toggle-info">
225
+ <span class="toggle-label">Auto-save LinkedIn profiles</span>
226
+ <span class="toggle-description">Automatically save when visiting profiles</span>
227
+ </div>
228
+ <label class="toggle">
229
+ <input type="checkbox" id="autoSave">
230
+ <span class="toggle-slider"></span>
231
+ </label>
232
+ </div>
233
+ </div>
234
+
235
+ <div class="setting-group">
236
+ <div class="toggle-setting">
237
+ <div class="toggle-info">
238
+ <span class="toggle-label">Show notifications</span>
239
+ <span class="toggle-description">Display success and error messages</span>
240
+ </div>
241
+ <label class="toggle">
242
+ <input type="checkbox" id="notifications" checked>
243
+ <span class="toggle-slider"></span>
244
+ </label>
245
+ </div>
246
+ </div>
247
+
248
+ <div class="setting-group">
249
+ <button class="btn btn-danger" id="disconnectBtn">
250
+ <svg class="btn-icon" width="16" height="16" viewBox="0 0 24 24" fill="none">
251
+ <path d="M17 7L7 17M7 7L17 17" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
252
+ </svg>
253
+ Disconnect
254
+ </button>
255
+ </div>
256
+ </div>
257
+ </div>
258
+
259
+ <!-- Toast Notifications -->
260
+ <div class="toast" id="toast">
261
+ <div class="toast-icon" id="toastIcon"></div>
262
+ <div class="toast-content">
263
+ <div class="toast-message" id="toastMessage"></div>
264
+ </div>
265
+ <button class="toast-close" id="toastClose">
266
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none">
267
+ <path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
268
+ </svg>
269
+ </button>
270
+ </div>
271
+
272
+ <script src="popup.js" type="module"></script>
273
+ </body>
274
+ </html>