This is page 1 of 5. Use http://codebase.md/Xyborg/ChatGPT-Product-Info?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .gitignore ├── assets │ ├── chatgpt-product-info-reviews.png │ └── chatgpt-product-info.png ├── chatgpt-product-info.js ├── chrome-extension │ ├── assets │ │ ├── flags │ │ │ ├── all.svg │ │ │ ├── ar.svg │ │ │ ├── at.svg │ │ │ ├── be.svg │ │ │ ├── br.svg │ │ │ ├── ch.svg │ │ │ ├── de.svg │ │ │ ├── es.svg │ │ │ ├── fr.svg │ │ │ ├── gb.svg │ │ │ ├── it.svg │ │ │ ├── mx.svg │ │ │ ├── nl.svg │ │ │ ├── pt.svg │ │ │ ├── se.svg │ │ │ └── us.svg │ │ └── icons-ui │ │ ├── analysis.svg │ │ ├── check.svg │ │ ├── database.svg │ │ ├── down-arrow.svg │ │ ├── edit.svg │ │ ├── error.svg │ │ ├── github.svg │ │ ├── history.svg │ │ ├── linkedin.svg │ │ ├── negative.svg │ │ ├── neutral.svg │ │ ├── positive.svg │ │ ├── project.svg │ │ ├── search.svg │ │ ├── settings.svg │ │ ├── tag.svg │ │ ├── up-arrow.svg │ │ ├── warning.svg │ │ └── x.svg │ ├── content-script.js │ ├── icons │ │ ├── icon128.png │ │ ├── icon16.png │ │ ├── icon19.png │ │ ├── icon32.png │ │ ├── icon48.png │ │ └── logobubble.svg │ ├── manifest.json │ ├── popup.html │ ├── popup.js │ ├── README.md │ └── styles.css ├── LICENSE └── README.md ``` # Files -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` 1 | # macOS 2 | .DS_Store 3 | .DS_Store? 4 | ._* 5 | .Spotlight-V100 6 | .Trashes 7 | ehthumbs.db 8 | Thumbs.db 9 | 10 | # Editor directories and files 11 | .vscode/ 12 | .idea/ 13 | *.swp 14 | *.swo 15 | 16 | # Logs 17 | logs 18 | *.log 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | 23 | # Runtime data 24 | pids 25 | *.pid 26 | *.seed 27 | *.pid.lock 28 | 29 | # Coverage directory used by tools like istanbul 30 | coverage/ 31 | 32 | # nyc test coverage 33 | .nyc_output 34 | 35 | # Dependency directories 36 | node_modules/ 37 | 38 | # Optional npm cache directory 39 | .npm 40 | 41 | # Optional REPL history 42 | .node_repl_history 43 | 44 | # Output of 'npm pack' 45 | *.tgz 46 | 47 | # Yarn Integrity file 48 | .yarn-integrity 49 | 50 | # dotenv environment variables file 51 | .env 52 | 53 | # Temporary folders 54 | tmp/ 55 | temp/ 56 | 57 | # Chrome extension 58 | *.crx 59 | *.pem 60 | *.zip 61 | IMPLEMENTATION_PLAN.md 62 | store-assets/ 63 | modal-prototype.html ``` -------------------------------------------------------------------------------- /chrome-extension/README.md: -------------------------------------------------------------------------------- ```markdown 1 | # ChatGPT Product Info Search - Chrome Extension 2 | 3 | A Chrome extension that adds product search functionality directly to ChatGPT, allowing you to search for product reviews, comparisons, and detailed information without leaving the page. 4 | 5 | ## Features 6 | 7 | ### Core Search Features 8 | - **Single Product Search**: Search for individual products and get detailed reviews 9 | - **Multi-Product Comparison**: Compare multiple products side-by-side in a table format 10 | - **Multi-Market Support**: Supports multiple countries and languages, so you can receive the same answers as users in your target market. 11 | - **Sentiment Analysis**: Visual sentiment breakdown of reviews (positive/neutral/negative) 12 | - **Citation Links**: Direct links to source websites for more information 13 | - **Review Themes**: Categorized review themes for easy browsing 14 | - **Projects & Tags**: Organize every search with project assignments and tag labels for richer filtering 15 | - **Backup & Restore**: Export your search history, projects, and tags to a JSON file for backup or transfer between devices 16 | 17 | 18 | ### Chrome Extension Features 19 | - **First-Time Tutorial**: Interactive walkthrough on first use to help you get started quickly 20 | - **Search History**: Automatically save searches (up to 50) and reopen them instantly 21 | - **Filter-Aware Reports**: Review/citation source reports that respect your active filters 22 | - **Floating Product Bubble**: Always-visible light-yellow button with the extension logo in the bottom-right corner 23 | - **Popup Interface**: Quick access and status checking from the Chrome toolbar 24 | - **Responsive UI**: Clean, modern interface that works seamlessly with ChatGPT 25 | - **Auto-Save**: All successful searches automatically saved to local history 26 | - **Unified Project & Tag Filters**: Combine projects and tags, and have those selections stay in sync across History, Analysis, and Reports 27 | - **History Filtering**: Text search plus synced project/tag filters to drill into past work 28 | 29 | ## Installation 30 | 31 | ### From Source (Developer Mode) 32 | 33 | 1. **Download/Clone** this repository 34 | 2. **Open Chrome** and navigate to `chrome://extensions/` 35 | 3. **Enable Developer Mode** (toggle in top-right corner) 36 | 4. **Click "Load unpacked"** and select the `chrome-extension` folder 37 | 5. **Navigate to ChatGPT** (https://chatgpt.com) and log in 38 | 6. **Click the extension icon** in your toolbar or look for the floating Product Info bubble on ChatGPT 39 | 40 | ### From Chrome Web Store 41 | 42 | *Coming soon - extension will be submitted to the Chrome Web Store* 43 | 44 | ## How to Use 45 | 46 | ### Getting Started 47 | 1. **Make sure you're logged in** to ChatGPT (https://chatgpt.com) 48 | 2. **Access the search interface** using either: 49 | - Click the extension icon in your Chrome toolbar → "Open Product Search" 50 | - Click the floating Product Info bubble in the bottom-right corner of any ChatGPT page 51 | 3. **First-time users**: An interactive tutorial will automatically appear to guide you through the key features 52 | 4. **Start searching** for products using natural language queries 53 | 54 | ### Tutorial 55 | - **First launch**: The tutorial automatically appears when you first open the extension 56 | - **Re-watch anytime**: Click the **?** (help) icon in the left sidebar next to the Settings icon 57 | - **Quick overview**: Learn about the Search tab, History, Analysis, and how to organize with Projects & Tags 58 | 59 | ### Search Examples 60 | Try searching for: 61 | - "iPhone 17 Pro camera quality" 62 | - "Nike Air Max running shoes" 63 | - "MacBook Air M3 performance" 64 | - "Tesla Model 3 reviews" 65 | - "best wireless headphones 2024" 66 | 67 | ### Single Product Search 68 | - Enter any product name or specific query 69 | - Get detailed reviews, sentiment analysis, and citation links 70 | - View product overview and review summaries 71 | 72 | ### Multi-Product Search 73 | - Toggle "Multi-product search" mode 74 | - Enter multiple product names (one per line) 75 | - Compare products in a convenient table format 76 | - Click "View" to see detailed information for any product 77 | 78 | ### Search History 79 | - All successful searches are automatically saved to your history 80 | - Click the "📋 History" tab to view your search history 81 | - **Reopen** any previous search to view the results again 82 | - **Filter** your history using the search box plus shared project/tag filters 83 | - **Delete** individual searches or clear all history 84 | - History is stored locally in your browser (up to 50 most recent searches) 85 | - **Organize** each search with project assignments and tag labels directly from the sidebar or post-search workflow 86 | 87 | ### Basic Reports 88 | - Click the "📊 Reports" tab to view simple analytics from your search history 89 | - **Review Sources Report**: See which websites have provided reviews in your searches 90 | - **Citation Sources Report**: View the sources that have been cited across your searches 91 | - Reports are generated from your local search history, processed locally, and reflect the same project/tag filters you have applied 92 | 93 | ## Why This Works as a Chrome Extension 94 | 95 | Unlike the original bookmarklet, this Chrome extension has several advantages: 96 | 97 | ### **No CORS Issues** 98 | - Extensions can make cross-origin requests to ChatGPT's API without restrictions 99 | - No browser security blocks or CORS errors 100 | 101 | ### **Better Security & Reliability** 102 | - No need to paste code into the console repeatedly 103 | - Proper extension sandboxing and permissions 104 | - Always available on ChatGPT pages 105 | - Auto-updates through Chrome's extension system 106 | - No need to re-inject code manually 107 | 108 | ### **Enhanced User Experience** 109 | - Floating Product Info bubble (with branded icon) for instant access in the lower-right corner 110 | - Proper toolbar icon and popup interface with status checking 111 | - Persistent search history with powerful filtering and management 112 | - Filter-aware reports on search sources 113 | - Unified project/tag filters that seamlessly sync between History and Analysis views 114 | - Better error handling, status indicators, and seamless integration with ChatGPT's interface 115 | 116 | ## Technical Details 117 | 118 | ### Permissions Required 119 | - `activeTab`: To interact with the current ChatGPT tab 120 | - `storage`: To save search history and user preferences locally 121 | - `https://chatgpt.com/*`: To access ChatGPT's API and inject content 122 | 123 | ### Architecture 124 | - **Content Script**: Injects the search interface and floating button into ChatGPT pages 125 | - **Popup**: Provides status checking and quick access controls from the extension toolbar 126 | - **Local Storage**: Manages search history and user data locally (no external servers) 127 | - **Manifest V3**: Uses the latest Chrome extension standards for security and performance 128 | 129 | ### API Access 130 | The extension uses ChatGPT's internal product search API: 131 | - Automatically fetches authentication tokens from your existing session 132 | - Makes requests to `https://chatgpt.com/backend-api/search/product_info` 133 | - Parses streaming responses for real-time results 134 | - Handles authentication errors gracefully with user feedback 135 | 136 | ## Privacy & Security 137 | 138 | - **No data collection**: The extension doesn't collect or store any personal data externally 139 | - **Local processing**: All searches and history are processed and stored locally in your browser 140 | - **Secure authentication**: Uses your existing ChatGPT session tokens (no passwords stored) 141 | - **No external servers**: Communicates only with ChatGPT's official API 142 | - **Local storage only**: Search history and preferences stored in browser's local storage 143 | - **No tracking**: No analytics, telemetry, or user behavior tracking 144 | - **Open source**: Full code available for security review and transparency 145 | 146 | ## Development 147 | 148 | ### File Structure 149 | ``` 150 | chrome-extension/ 151 | ├── manifest.json # Extension configuration 152 | ├── content-script.js # Main functionality injected into ChatGPT 153 | ├── popup.html # Extension popup interface 154 | ├── popup.js # Popup logic and controls 155 | ├── styles.css # Extension styles 156 | ├── assets/ # Static assets and resources 157 | └── icons/ # Extension icons (16x16 to 128x128) 158 | ``` 159 | 160 | ### Building from Source 161 | 1. Clone the repository 162 | 2. The extension is ready to load - no build process required 163 | 3. Load in Chrome developer mode for testing 164 | 165 | ## Troubleshooting 166 | 167 | ### Extension Not Working 168 | - Make sure you're on https://chatgpt.com (not chat.openai.com) 169 | - Refresh the ChatGPT page after installing the extension 170 | - Check that you're logged in to ChatGPT 171 | 172 | ### Search Errors 173 | - Verify you're logged in to ChatGPT 174 | - Try refreshing the page if you get authentication errors 175 | - Check Chrome's console for detailed error messages 176 | 177 | ### Popup Shows "Not Ready" 178 | - Navigate to ChatGPT first 179 | - Refresh the ChatGPT page 180 | - Make sure the extension is enabled in chrome://extensions/ 181 | 182 | ## Contributing 183 | 184 | Contributions are welcome! Please feel free to submit issues or pull requests. 185 | 186 | ## License 187 | 188 | This project is licensed under the MIT License - see the LICENSE file for details. 189 | 190 | ## Credits 191 | 192 | Created by [Martin Aberastegue (@Xyborg)](https://www.martinaberastegue.com/) 193 | 194 | Based on the original ChatGPT Product Info bookmarklet, converted to a Chrome extension for better reliability and user experience. 195 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- ```markdown 1 | # ChatGPT Product Info Search 🔍 2 | 3 | A powerful **Chrome extension** and browser script that **unlocks ChatGPT's internal product search API** to **fetch detailed product information, reviews, and comparisons** directly within ChatGPT's interface. 4 | 5 |  6 | 7 | ## Table of Contents 8 | 9 | - [Overview](#overview) 10 | - [Installation](#installation) 11 | - [Chrome Extension (Recommended)](#chrome-extension-recommended) 12 | - [Browser Script](#browser-script) 13 | - [Demo](#demo) 14 | - [Features](#features) 15 | - [How to Use](#how-to-use) 16 | - [Search Examples](#search-examples) 17 | - [What You'll Get](#what-youll-get) 18 | - [Technical Details](#technical-details) 19 | - [Browser Compatibility](#browser-compatibility) 20 | - [Requirements](#requirements) 21 | - [Troubleshooting](#troubleshooting) 22 | - [Privacy & Security](#privacy--security) 23 | - [Want to Improve Your AI Visibility?](#want-to-improve-your-ai-visibility) 24 | - [Additional Resources](#additional-resources) 25 | - [Contributing](#contributing) 26 | - [Author](#author) 27 | - [License](#license) 28 | 29 | ## Overview 30 | 31 | This project provides two ways to access ChatGPT's internal product search API: a Chrome extension (recommended) and a browser script. Both create a modal interface within ChatGPT that allows you to search for product information, reviews, and detailed comparisons. They automatically handle authentication and present results in an organized, easy-to-read format. 32 | 33 | ## Installation 34 | 35 | ### Chrome Extension (Recommended) 36 | 37 | The Chrome extension provides the best experience with enhanced features and reliability. 38 | 39 | #### From Source (Developer Mode) 40 | 1. **Download/Clone** this repository 41 | 2. **Open Chrome** and navigate to `chrome://extensions/` 42 | 3. **Enable Developer Mode** (toggle in top-right corner) 43 | 4. **Click "Load unpacked"** and select the `chrome-extension` folder 44 | 5. **Navigate to ChatGPT** (https://chatgpt.com) and log in 45 | 6. **Click the extension icon** in your toolbar or look for the floating 🛍️ button on ChatGPT 46 | 47 | #### From Chrome Web Store 48 | *Coming soon - extension will be submitted to the Chrome Web Store* 49 | 50 | #### Chrome Extension Features 51 | - ✅ **No CORS Issues**: Extensions can make cross-origin requests without restrictions 52 | - ✅ **Floating Button**: Always visible 🛍️ button on ChatGPT pages 53 | - ✅ **Popup Interface**: Clean status indicator and quick access controls 54 | - ✅ **Search History**: Persistent search history with filtering and management 55 | - ✅ **Auto-Updates**: Automatic updates through Chrome's extension system 56 | - ✅ **Better Security**: No need to paste code into console repeatedly 57 | - ✅ **Enhanced UX**: Proper error handling and status indicators 58 | 59 | ### Browser Script 60 | 61 | For users who prefer not to install extensions or use other browsers. 62 | 63 | ## Demo 64 | 65 | ### Single Product Search 66 | 67 | https://github.com/user-attachments/assets/b5472c48-1cd9-496b-b120-3fd548582f9f 68 | 69 | ### Multi-Product Search 70 | 71 | https://github.com/user-attachments/assets/9e661765-098e-48c6-ac1b-dc3f4c3e725e 72 | 73 | ## Features 74 | 75 | ### Core Features 76 | - 🔍 **Single Product Search**: Search for individual products and get detailed reviews 77 | - 📊 **Multi-Product Comparison**: Compare multiple products side-by-side in a table format 78 | - 📋 **Search History**: Automatically save all your searches and easily reopen them later (Chrome extension) 79 | - 🎯 **Sentiment Analysis**: Visual sentiment breakdown of reviews (positive/neutral/negative) 80 | - 🔗 **Citation Links**: Direct links to source websites for more information 81 | - 🏷️ **Review Themes**: Categorized review themes for easy browsing 82 | - 📱 **Responsive UI**: Clean, modern interface that works seamlessly with ChatGPT 83 | 84 | ### Advanced Features 85 | - **Auto Authentication**: Automatically fetches your ChatGPT session token 86 | - **Real-time Results**: Live streaming of search results as they come in 87 | - **Comprehensive Results**: Get product details, reviews, ratings, and merchant offers 88 | - **Review Analysis**: AI-generated summaries with sentiment breakdown 89 | 90 | ## How to Use 91 | 92 | ### Chrome Extension (Recommended) 93 | 94 | 1. **Make sure you're logged in** to ChatGPT (https://chatgpt.com) 95 | 2. **Click the extension icon** in your Chrome toolbar to check status 96 | 3. **Click "Open Product Search"** or use the floating 🛍️ button on ChatGPT 97 | 4. **Search for products** using natural language queries 98 | 5. **Use tabs** to switch between Search, History, and Reports 99 | 100 | #### Single Product Search 101 | - Enter any product name or specific query 102 | - Get detailed reviews, sentiment analysis, and citation links 103 | - View product overview and review summaries 104 | 105 | #### Multi-Product Search 106 | - Toggle "Multi-product search" mode 107 | - Enter multiple product names (one per line) 108 | - Compare products in a convenient table format 109 | - Click "View" to see detailed information for any product 110 | 111 | #### Search History 112 | - All successful searches are automatically saved to your history 113 | - Click the "📋 History" tab to view your search history 114 | - **Reopen** any previous search to view the results again 115 | - **Filter** your history using the search box 116 | - **Delete** individual searches or clear all history 117 | - History is stored locally in your browser (up to 50 most recent searches) 118 | 119 | ### Browser Script 120 | 121 | #### Method 1: Browser Console 122 | 123 | 1. **Open ChatGPT** in your browser and make sure you're logged in 124 | 2. **Open Developer Tools**: 125 | - **Chrome/Edge**: Press `F12` or `Ctrl+Shift+I` (Windows) / `Cmd+Option+I` (Mac) 126 | - **Firefox**: Press `F12` or `Ctrl+Shift+I` (Windows) / `Cmd+Option+I` (Mac) 127 | - **Safari**: Press `Cmd+Option+I` (Mac) - you may need to enable Developer Tools first 128 | 3. **Go to Console tab** in the Developer Tools 129 | 4. **Copy the entire content of the script** from `chatgpt-product-info.js` 130 | 5. **Paste and press Enter** - the modal will appear immediately 131 | 6. **Start searching** for products! 132 | 133 | #### Method 2: Bookmarklet 134 | 135 | Due to CORS restrictions, you'll need to create a proper bookmarklet using a bookmarklet generator: 136 | 137 | 1. **Copy the entire script** from `chatgpt-product-info.js` 138 | 2. **Go to a bookmarklet generator**: 139 | - [Bookmarkleter](https://chriszarate.github.io/bookmarkleter) (Recommended) 140 | - [Bookmarklet Maker](https://caiorss.github.io/bookmarklet-maker) 141 | 3. **Paste the script** into the generator 142 | 4. **Generate the bookmarklet** - it will create a `javascript:` URL 143 | 5. **Create a new bookmark** in your browser with: 144 | - **Name**: "ChatGPT Product Search" 145 | - **URL**: The generated `javascript:` code 146 | 6. **Visit ChatGPT** and click the bookmark to launch the search tool 147 | 148 | **Note**: The bookmarklet will be quite long due to the script size, but it will work properly without CORS issues. 149 | 150 | ## Search Examples 151 | 152 | Try these search queries to see the power of the tool: 153 | 154 | - `"iPhone 17 Pro camera quality"` 155 | - `"Nike Air Max running shoes"` 156 | - `"MacBook Air M3 performance"` 157 | - `"Tesla Model 3 reviews"` 158 | - `"Pets Deli Hundefutter"` 159 | 160 | ## What You'll Get 161 | 162 | ### Product Information 163 | - **Product Details**: Title, price, description, ratings when available. 164 | 165 | ### Review Analysis 166 | - **Review Summary**: AI-generated overview of all reviews 167 | - **Sentiment Breakdown**: Visual representation of positive/negative/neutral reviews 168 | - **Review Themes**: Common topics mentioned across reviews 169 | - **Source Citations**: Direct links to original review sources 170 | 171 |  172 | 173 | ### Additional Data 174 | - **Product Overview**: AI rationale explaining the product category 175 | - **Citation Links**: All source websites with favicons and snippets 176 | 177 | ## Technical Details 178 | 179 | ### How It Works 180 | 181 | The script leverages ChatGPT's internal `/backend-api/search/product_info` endpoint, which is the same API that powers ChatGPT's built-in product search functionality. It: 182 | 183 | 1. **Authenticates** using your existing ChatGPT session 184 | 2. **Sends search queries** to ChatGPT's product API 185 | 3. **Parses streaming responses** in real-time 186 | 4. **Extracts structured data** including products, reviews, and citations 187 | 5. **Renders results** in a beautiful, organized interface 188 | 189 | ### API Endpoint 190 | ``` 191 | POST https://chatgpt.com/backend-api/search/product_info 192 | ``` 193 | 194 | ### Authentication 195 | The script automatically fetches your session token from `/api/auth/session` - no manual token input required! 196 | 197 | ### Data Structure 198 | The API returns structured data including: 199 | - Product entities with pricing and merchant information 200 | - Review summaries with sentiment analysis 201 | - Citation links to source websites 202 | - Rationale and summary text 203 | 204 | ## Browser Compatibility 205 | 206 | - ✅ **Chrome** (Recommended) 207 | - ✅ **Firefox** 208 | - ✅ **Safari** 209 | - ✅ **Opera** 210 | 211 | ## Requirements 212 | 213 | - Active ChatGPT account (free or paid) 214 | - Modern web browser with JavaScript enabled 215 | - Must be used on chatgpt.com domain 216 | 217 | ## Troubleshooting 218 | 219 | ### Chrome Extension Issues 220 | 221 | #### Extension Not Working 222 | - Make sure you're on https://chatgpt.com (not chat.openai.com) 223 | - Refresh the ChatGPT page after installing the extension 224 | - Check that you're logged in to ChatGPT 225 | - Verify the extension is enabled in chrome://extensions/ 226 | 227 | #### Popup Shows "Not Ready" 228 | - Navigate to ChatGPT first 229 | - Refresh the ChatGPT page 230 | - Make sure the extension is enabled in chrome://extensions/ 231 | 232 | #### Floating Button Not Visible 233 | - Check if you're on the correct ChatGPT domain 234 | - Refresh the page 235 | - Look for the 🛍️ button in the bottom-right area of the page 236 | 237 | ### General Issues 238 | 239 | #### "Failed to get authentication token" 240 | - Make sure you're logged in to ChatGPT 241 | - Refresh the ChatGPT page and try again 242 | - Check that you're on the correct chatgpt.com domain 243 | 244 | #### "No results found" 245 | - Try different search terms 246 | - Use more specific product names 247 | - Include brand or product names in your search 248 | 249 | #### Modal doesn't appear (Browser Script) 250 | - Make sure JavaScript is enabled 251 | - Check browser console for errors 252 | - Try refreshing the page and running the script again 253 | 254 | ## Privacy & Security 255 | 256 | ### Chrome Extension 257 | - **No data collection**: The extension doesn't collect or store any personal data 258 | - **Local processing**: All searches are processed locally in your browser 259 | - **Secure authentication**: Uses your existing ChatGPT session tokens 260 | - **No external servers**: Communicates only with ChatGPT's official API 261 | - **Local storage only**: Search history is stored locally in your browser 262 | 263 | ### Browser Script 264 | - **No data collection**: The script runs entirely in your browser 265 | - **Uses your session**: Leverages your existing ChatGPT authentication 266 | - **No external servers**: All requests go directly to ChatGPT's API 267 | - **No chat history impact**: This won't create new chats, so you won't see it in your history 268 | 269 | ### Both Methods 270 | - **Open source**: Full code is available for inspection 271 | - **Secure by design**: No third-party data sharing or analytics 272 | 273 | ## Want to Improve Your AI Visibility? 274 | 275 | If you're a business owner or marketer, you might be wondering: **"How do I get MY products to show up in ChatGPT search results?"** 276 | 277 | [**Try Finseo**](https://www.finseo.ai/?ref=gptproductsearch) - The next-gen AI SEO platform that helps you: 278 | - **Track your brand visibility** across ChatGPT, Claude, Perplexity, and other AI platforms 279 | - **Monitor what AI says** about your business and products 280 | - **Get actionable recommendations** to improve your presence in AI search results 281 | - **Stay ahead of competitors** in the AI search landscape 282 | 283 | *Perfect complement to this product search tool - see what others are finding, then optimize your own products to be discovered!* 284 | 285 | ## Additional Resources 286 | 287 | Learn more about ChatGPT's product discovery capabilities: 288 | 289 | - **[Help ChatGPT discover your products](https://openai.com/chatgpt/search-product-discovery)** - Official guide for businesses on how to make their products discoverable in ChatGPT Search 290 | - **[Improved Shopping Results from ChatGPT Search, and How Product Results are Selected](https://help.openai.com/en/articles/11128490-improved-shopping-results-from-chatgpt-search)** - Detailed explanation of how ChatGPT selects and ranks product results 291 | 292 | ## Contributing 293 | 294 | Feel free to submit issues, feature requests, or pull requests on GitHub! 295 | 296 | ## Author 297 | 298 | Created by [Martin Aberastegue (@Xyborg)](https://www.martinaberastegue.com/) 299 | 300 | *Originally developed as a browser script, now enhanced with a full-featured Chrome extension for better reliability and user experience.* 301 | 302 | ## License 303 | 304 | MIT License - feel free to modify and use as needed! 305 | 306 | --- 307 | 308 | **Note**: This tool uses ChatGPT's internal API and is intended for educational and personal use. Please respect ChatGPT's terms of service. 309 | 310 | **Recommendation**: Use the Chrome extension for the best experience with persistent history, enhanced UI, and automatic updates. ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/at.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-at" viewBox="0 0 640 480"> 2 | <path fill="#fff" d="M0 160h640v160H0z"/> 3 | <path fill="#c8102e" d="M0 0h640v160H0zm0 320h640v160H0z"/> 4 | </svg> 5 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/se.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-se" viewBox="0 0 640 480"> 2 | <path fill="#005293" d="M0 0h640v480H0z"/> 3 | <path fill="#fecb00" d="M176 0v192H0v96h176v192h96V288h368v-96H272V0z"/> 4 | </svg> 5 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/de.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-de" viewBox="0 0 640 480"> 2 | <path fill="#fc0" d="M0 320h640v160H0z"/> 3 | <path fill="#000001" d="M0 0h640v160H0z"/> 4 | <path fill="red" d="M0 160h640v160H0z"/> 5 | </svg> 6 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/nl.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-nl" viewBox="0 0 640 480"> 2 | <path fill="#ae1c28" d="M0 0h640v160H0z"/> 3 | <path fill="#fff" d="M0 160h640v160H0z"/> 4 | <path fill="#21468b" d="M0 320h640v160H0z"/> 5 | </svg> 6 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/fr.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-fr" viewBox="0 0 640 480"> 2 | <path fill="#fff" d="M0 0h640v480H0z"/> 3 | <path fill="#000091" d="M0 0h213.3v480H0z"/> 4 | <path fill="#e1000f" d="M426.7 0H640v480H426.7z"/> 5 | </svg> 6 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/search.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/it.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-it" viewBox="0 0 640 480"> 2 | <g fill-rule="evenodd" stroke-width="1pt"> 3 | <path fill="#fff" d="M0 0h640v480H0z"/> 4 | <path fill="#009246" d="M0 0h213.3v480H0z"/> 5 | <path fill="#ce2b37" d="M426.7 0H640v480H426.7z"/> 6 | </g> 7 | </svg> 8 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/ch.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ch" viewBox="0 0 640 480"> 2 | <g fill-rule="evenodd" stroke-width="1pt"> 3 | <path fill="red" d="M0 0h640v480H0z"/> 4 | <g fill="#fff"> 5 | <path d="M170 195h300v90H170z"/> 6 | <path d="M275 90h90v300h-90z"/> 7 | </g> 8 | </g> 9 | </svg> 10 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/be.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-be" viewBox="0 0 640 480"> 2 | <g fill-rule="evenodd" stroke-width="1pt"> 3 | <path fill="#000001" d="M0 0h213.3v480H0z"/> 4 | <path fill="#ffd90c" d="M213.3 0h213.4v480H213.3z"/> 5 | <path fill="#f31830" d="M426.7 0H640v480H426.7z"/> 6 | </g> 7 | </svg> 8 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/project.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M216,72H131.31L104,44.69A15.86,15.86,0,0,0,92.69,40H40A16,16,0,0,0,24,56V200.62A15.4,15.4,0,0,0,39.38,216H216.89A15.13,15.13,0,0,0,232,200.89V88A16,16,0,0,0,216,72ZM40,56H92.69l16,16H40ZM216,200H40V88H216Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/tag.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M243.31,136,144,36.69A15.86,15.86,0,0,0,132.69,32H40a8,8,0,0,0-8,8v92.69A15.86,15.86,0,0,0,36.69,144L136,243.31a16,16,0,0,0,22.63,0l84.68-84.68a16,16,0,0,0,0-22.63Zm-96,96L48,132.69V48h84.69L232,147.31ZM96,84A12,12,0,1,1,84,72,12,12,0,0,1,96,84Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/neutral.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm48-56a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,160ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/up-arrow.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M229.66,114.34l-96-96a8,8,0,0,0-11.32,0l-96,96A8,8,0,0,0,32,128H72v56a8,8,0,0,0,8,8h96a8,8,0,0,0,8-8V128h40a8,8,0,0,0,5.66-13.66ZM176,112a8,8,0,0,0-8,8v56H88V120a8,8,0,0,0-8-8H51.31L128,35.31,204.69,112Zm8,104a8,8,0,0,1-8,8H80a8,8,0,0,1,0-16h96A8,8,0,0,1,184,216Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/x.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M214.75,211.71l-62.6-98.38,61.77-67.95a8,8,0,0,0-11.84-10.76L143.24,99.34,102.75,35.71A8,8,0,0,0,96,32H48a8,8,0,0,0-6.75,12.3l62.6,98.37-61.77,68a8,8,0,1,0,11.84,10.76l58.84-64.72,40.49,63.63A8,8,0,0,0,160,224h48a8,8,0,0,0,6.75-12.29ZM164.39,208,62.57,48h29L193.43,208Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/check.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M243.28,68.24l-24-23.56a16,16,0,0,0-22.59,0L104,136.23l-36.69-35.6a16,16,0,0,0-22.58.05l-24,24a16,16,0,0,0,0,22.61l71.62,72a16,16,0,0,0,22.63,0L243.33,90.91A16,16,0,0,0,243.28,68.24ZM103.62,208,32,136l24-24a.6.6,0,0,1,.08.08l42.35,41.09a8,8,0,0,0,11.19,0L208.06,56,232,79.6Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/down-arrow.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M231.39,132.94A8,8,0,0,0,224,128H184V72a8,8,0,0,0-8-8H80a8,8,0,0,0-8,8v56H32a8,8,0,0,0-5.66,13.66l96,96a8,8,0,0,0,11.32,0l96-96A8,8,0,0,0,231.39,132.94ZM128,220.69,51.31,144H80a8,8,0,0,0,8-8V80h80v56a8,8,0,0,0,8,8h28.69ZM72,40a8,8,0,0,1,8-8h96a8,8,0,0,1,0,16H80A8,8,0,0,1,72,40Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/error.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M165.66,101.66,139.31,128l26.35,26.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/history.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M136,80v43.47l36.12,21.67a8,8,0,0,1-8.24,13.72l-40-24A8,8,0,0,1,120,128V80a8,8,0,0,1,16,0Zm-8-48A95.44,95.44,0,0,0,60.08,60.15C52.81,67.51,46.35,74.59,40,82V64a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H72a8,8,0,0,0,0-16H49c7.15-8.42,14.27-16.35,22.39-24.57a80,80,0,1,1,1.66,114.75,8,8,0,1,0-11,11.64A96,96,0,1,0,128,32Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/edit.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M227.31,73.37,182.63,28.68a16,16,0,0,0-22.63,0L36.69,152A15.86,15.86,0,0,0,32,163.31V208a16,16,0,0,0,16,16H92.69A15.86,15.86,0,0,0,104,219.31L227.31,96a16,16,0,0,0,0-22.63ZM51.31,160,136,75.31,152.69,92,68,176.68ZM48,179.31,76.69,208H48Zm48,25.38L79.31,188,164,103.31,180.69,120Zm96-96L147.31,64l24-24L216,84.68Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/linkedin.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M216,24H40A16,16,0,0,0,24,40V216a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V40A16,16,0,0,0,216,24Zm0,192H40V40H216V216ZM96,112v64a8,8,0,0,1-16,0V112a8,8,0,0,1,16,0Zm88,28v36a8,8,0,0,1-16,0V140a20,20,0,0,0-40,0v36a8,8,0,0,1-16,0V112a8,8,0,0,1,15.79-1.78A36,36,0,0,1,184,140ZM100,84A12,12,0,1,1,88,72,12,12,0,0,1,100,84Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/positive.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216ZM80,108a12,12,0,1,1,12,12A12,12,0,0,1,80,108Zm96,0a12,12,0,1,1-12-12A12,12,0,0,1,176,108Zm-1.07,48c-10.29,17.79-27.4,28-46.93,28s-36.63-10.2-46.92-28a8,8,0,1,1,13.84-8c7.47,12.91,19.21,20,33.08,20s25.61-7.1,33.07-20a8,8,0,0,1,13.86,8Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/analysis.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M232,208a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V48a8,8,0,0,1,16,0V200H224A8,8,0,0,1,232,208ZM132,160a12,12,0,1,0-12-12A12,12,0,0,0,132,160Zm-24-56A12,12,0,1,0,96,92,12,12,0,0,0,108,104ZM76,176a12,12,0,1,0-12-12A12,12,0,0,0,76,176Zm96-48a12,12,0,1,0-12-12A12,12,0,0,0,172,128Zm24-40a12,12,0,1,0-12-12A12,12,0,0,0,196,88Zm-20,76a12,12,0,1,0,12-12A12,12,0,0,0,176,164Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/gb.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-gb" viewBox="0 0 640 480"> 2 | <path fill="#012169" d="M0 0h640v480H0z"/> 3 | <path fill="#FFF" d="m75 0 244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0z"/> 4 | <path fill="#C8102E" d="m424 281 216 159v40L369 281zm-184 20 6 35L54 480H0zM640 0v3L391 191l2-44L590 0zM0 0l239 176h-60L0 42z"/> 5 | <path fill="#FFF" d="M241 0v480h160V0zM0 160v160h640V160z"/> 6 | <path fill="#C8102E" d="M0 193v96h640v-96zM273 0v480h96V0z"/> 7 | </svg> 8 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/warning.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/negative.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M92,152a12,12,0,1,1,12-12A12,12,0,0,1,92,152Zm72-24a12,12,0,1,0,12,12A12,12,0,0,0,164,128Zm68,0A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128ZM171.56,81.34,128,110.39l-43.56-29a8,8,0,1,0-8.88,13.32l48,32a8,8,0,0,0,8.88,0l48-32a8,8,0,0,0-8.88-13.32Zm-15.13,96C148,171.73,139.94,168,128,168s-20,3.73-28.43,9.34a8,8,0,0,0,8.86,13.32C114.93,186.34,120,184,128,184s13.07,2.34,19.57,6.66a8,8,0,1,0,8.86-13.32Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/icons/logobubble.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M232,48V88a8,8,0,0,1-16,0V56H184a8,8,0,0,1,0-16h40A8,8,0,0,1,232,48ZM72,200H40V168a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H72a8,8,0,0,0,0-16Zm152-40a8,8,0,0,0-8,8v32H184a8,8,0,0,0,0,16h40a8,8,0,0,0,8-8V168A8,8,0,0,0,224,160ZM32,96a8,8,0,0,0,8-8V56H72a8,8,0,0,0,0-16H32a8,8,0,0,0-8,8V88A8,8,0,0,0,32,96ZM80,80a8,8,0,0,0-8,8v80a8,8,0,0,0,16,0V88A8,8,0,0,0,80,80Zm104,88V88a8,8,0,0,0-16,0v80a8,8,0,0,0,16,0ZM144,80a8,8,0,0,0-8,8v80a8,8,0,0,0,16,0V88A8,8,0,0,0,144,80Zm-32,0a8,8,0,0,0-8,8v80a8,8,0,0,0,16,0V88A8,8,0,0,0,112,80Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/us.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-us" viewBox="0 0 640 480"> 2 | <path fill="#bd3d44" d="M0 0h640v480H0"/> 3 | <path stroke="#fff" stroke-width="37" d="M0 55.3h640M0 129h640M0 203h640M0 277h640M0 351h640M0 425h640"/> 4 | <path fill="#192f5d" d="M0 0h364.8v258.5H0"/> 5 | <marker id="us-a" markerHeight="30" markerWidth="30"> 6 | <path fill="#fff" d="m14 0 9 27L0 10h28L5 27z"/> 7 | </marker> 8 | <path fill="none" marker-mid="url(#us-a)" d="m0 0 16 11h61 61 61 61 60L47 37h61 61 60 61L16 63h61 61 61 61 60L47 89h61 61 60 61L16 115h61 61 61 61 60L47 141h61 61 60 61L16 166h61 61 61 61 60L47 192h61 61 60 61L16 218h61 61 61 61 60z"/> 9 | </svg> 10 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/database.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/github.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/styles.css: -------------------------------------------------------------------------------- ```css 1 | /* ChatGPT Product Info Research Extension Styles */ 2 | 3 | #openProductSearchModalBtn { 4 | position: fixed; 5 | right: 30px; 6 | bottom: 100px; 7 | transform: none; 8 | background-color: #fef3c7; 9 | color: #b45309; 10 | border: none; 11 | border-radius: 50%; 12 | width: 60px; 13 | height: 60px; 14 | font-size: 0; 15 | box-shadow: 0 3px 10px rgba(0,0,0,0.2); 16 | cursor: pointer; 17 | z-index: 9990; 18 | display: flex; 19 | align-items: center; 20 | justify-content: center; 21 | transition: all 0.3s ease; 22 | } 23 | 24 | #openProductSearchModalBtn img { 25 | width: 32px; 26 | height: 32px; 27 | pointer-events: none; 28 | } 29 | 30 | #openProductSearchModalBtn.icon-fallback { 31 | font-size: 24px; 32 | } 33 | 34 | #openProductSearchModalBtn:hover { 35 | background-color: #fde68a; 36 | box-shadow: 0 5px 15px rgba(0,0,0,0.3); 37 | } 38 | 39 | /* Spinning animation for loading states */ 40 | @keyframes cpr-spin { 41 | 0% { transform: rotate(0deg); } 42 | 100% { transform: rotate(360deg); } 43 | } 44 | 45 | .cpr-loading-spinner { 46 | display: inline-block; 47 | width: 32px; 48 | height: 32px; 49 | border: 3px solid #f3f3f3; 50 | border-top: 3px solid #667eea; 51 | border-radius: 50%; 52 | animation: cpr-spin 1s linear infinite; 53 | margin-bottom: 10px; 54 | } 55 | ``` -------------------------------------------------------------------------------- /chrome-extension/manifest.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "manifest_version": 3, 3 | "name": "ChatGPT E-commerce Product Research", 4 | "version": "1.3.8", 5 | "description": "Research e-commerce product reviews, comparisons, and detailed information directly within ChatGPT", 6 | "permissions": [ 7 | "activeTab" 8 | ], 9 | "host_permissions": [ 10 | "https://chatgpt.com/*", 11 | "https://*.chatgpt.com/*" 12 | ], 13 | "content_scripts": [ 14 | { 15 | "matches": ["https://chatgpt.com/*", "https://*.chatgpt.com/*"], 16 | "js": ["content-script.js"], 17 | "css": ["styles.css"], 18 | "run_at": "document_end" 19 | } 20 | ], 21 | "action": { 22 | "default_popup": "popup.html", 23 | "default_title": "ChatGPT E-commerce Product Research", 24 | "default_icon": { 25 | "16": "icons/icon16.png", 26 | "19": "icons/icon19.png", 27 | "32": "icons/icon32.png", 28 | "48": "icons/icon48.png", 29 | "128": "icons/icon128.png" 30 | } 31 | }, 32 | "icons": { 33 | "16": "icons/icon16.png", 34 | "19": "icons/icon19.png", 35 | "32": "icons/icon32.png", 36 | "48": "icons/icon48.png", 37 | "128": "icons/icon128.png" 38 | }, 39 | "content_security_policy": { 40 | "extension_pages": "script-src 'self'; object-src 'self';" 41 | }, 42 | "web_accessible_resources": [ 43 | { 44 | "resources": ["icons/*", "assets/flags/*", "assets/icons-ui/*"], 45 | "matches": ["https://chatgpt.com/*", "https://*.chatgpt.com/*"] 46 | } 47 | ] 48 | } 49 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/all.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="1000" height="600" viewBox="0 0 264.583 158.75"><path d="M-138.415-1245.822h2645.833v1587.5H-138.415z" style="opacity:1;fill:#00c;fill-opacity:1;stroke:#fff;stroke-width:0;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(.1 0 0 .1 13.841 124.582)"/><g transform="matrix(.1 0 0 .1 13.841 124.582)"><circle cx="1184.502" cy="-452.072" r="502.708" style="opacity:1;fill:none;fill-opacity:1;stroke:#fff;stroke-width:52.91666412;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/><path d="M855.062-112.445a658.88 658.88 0 0 1 658.88 0M1513.942-791.7a658.88 658.88 0 0 1-658.88 0" style="opacity:1;fill:none;fill-opacity:1;stroke:#fff;stroke-width:52.91666412;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"/><path d="M1183.361 49.779a628.39 628.39 0 0 1-250.213-501.851 628.39 628.39 0 0 1 250.213-501.85" style="opacity:1;fill:none;fill-opacity:1;stroke:#fff;stroke-width:52.91666412;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/><path d="M1184.502-954.78V50.636M681.794-452.072H1687.21" style="opacity:1;fill:none;stroke:#fff;stroke-width:52.91664886;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/><path d="M-1185.643 953.923a628.39 628.39 0 0 1-250.213-501.851A628.39 628.39 0 0 1-1185.643-49.78" style="opacity:1;fill:none;fill-opacity:1;stroke:#fff;stroke-width:52.91666412;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="scale(-1)"/></g></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/icons-ui/settings.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#000000" viewBox="0 0 256 256"><path d="M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"></path></svg> ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/ar.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="flag-icons-ar" viewBox="0 0 640 480"> 2 | <path fill="#74acdf" d="M0 0h640v480H0z"/> 3 | <path fill="#fff" d="M0 160h640v160H0z"/> 4 | <g id="ar-c" transform="translate(-64)scale(.96)"> 5 | <path id="ar-a" fill="#f6b40e" stroke="#85340a" stroke-width="1.1" d="m396.8 251.3 28.5 62s.5 1.2 1.3.9c.8-.4.3-1.6.3-1.6l-23.7-64m-.7 24.2c-.4 9.4 5.4 14.6 4.7 23s3.8 13.2 5 16.5c1 3.3-1.2 5.2-.3 5.7 1 .5 3-2.1 2.4-6.8s-4.2-6-3.4-16.3-4.2-12.7-3-22"/> 6 | <use xlink:href="#ar-a" width="100%" height="100%" transform="rotate(22.5 400 250)"/> 7 | <use xlink:href="#ar-a" width="100%" height="100%" transform="rotate(45 400 250)"/> 8 | <use xlink:href="#ar-a" width="100%" height="100%" transform="rotate(67.5 400 250)"/> 9 | <path id="ar-b" fill="#85340a" d="M404.3 274.4c.5 9 5.6 13 4.6 21.3 2.2-6.5-3.1-11.6-2.8-21.2m-7.7-23.8 19.5 42.6-16.3-43.9"/> 10 | <use xlink:href="#ar-b" width="100%" height="100%" transform="rotate(22.5 400 250)"/> 11 | <use xlink:href="#ar-b" width="100%" height="100%" transform="rotate(45 400 250)"/> 12 | <use xlink:href="#ar-b" width="100%" height="100%" transform="rotate(67.5 400 250)"/> 13 | </g> 14 | <use xlink:href="#ar-c" width="100%" height="100%" transform="rotate(90 320 240)"/> 15 | <use xlink:href="#ar-c" width="100%" height="100%" transform="rotate(180 320 240)"/> 16 | <use xlink:href="#ar-c" width="100%" height="100%" transform="rotate(-90 320 240)"/> 17 | <circle cx="320" cy="240" r="26.7" fill="#f6b40e" stroke="#85340a" stroke-width="1.4"/> 18 | <path id="ar-h" fill="#843511" stroke-width="1" d="M329 234.3c-1.7 0-3.5.8-4.5 2.4 2 1.9 6.6 2 9.7-.2a7 7 0 0 0-5.1-2.2zm0 .4c1.8 0 3.5.8 3.7 1.6-2 2.3-5.3 2-7.4.4q1.6-2 3.8-2z"/> 19 | <use xlink:href="#ar-d" width="100%" height="100%" transform="matrix(-1 0 0 1 640.2 0)"/> 20 | <use xlink:href="#ar-e" width="100%" height="100%" transform="matrix(-1 0 0 1 640.2 0)"/> 21 | <use xlink:href="#ar-f" width="100%" height="100%" transform="translate(18.1)"/> 22 | <use xlink:href="#ar-g" width="100%" height="100%" transform="matrix(-1 0 0 1 640.2 0)"/> 23 | <path fill="#85340a" d="M316 243.7a1.8 1.8 0 1 0 1.8 2.9 4 4 0 0 0 2.2.6h.2q1 0 2.3-.6.5.7 1.5.7a1.8 1.8 0 0 0 .3-3.6q.8.3.8 1.2a1.2 1.2 0 0 1-2.4 0 3 3 0 0 1-2.6 1.7 3 3 0 0 1-2.5-1.7q-.1 1.1-1.3 1.2-1-.1-1.2-1.2c-.2-1.1.3-1 .8-1.2zm2 5.4c-2.1 0-3 2-4.8 3.1 1-.4 1.8-1.2 3.3-2s2.6.2 3.5.2 2-1 3.5-.2l3.3 2c-1.9-1.2-2.7-3-4.8-3q-.7 0-2 .6z"/> 24 | <path fill="#85340a" d="M317.2 251.6q-1.1 0-3.4.6c3.7-.8 4.5.5 6.2.5 1.6 0 2.5-1.3 6.1-.5-4-1.2-4.9-.4-6.1-.4-.8 0-1.4-.3-2.8-.2"/> 25 | <path fill="#85340a" d="M314 252.2h-.8c4.3.5 2.3 3 6.8 3s2.5-2.5 6.8-3c-4.5-.4-3.1 2.3-6.8 2.3-3.5 0-2.4-2.3-6-2.3"/> 26 | <path fill="#85340a" d="M323.7 258.9a3.7 3.7 0 0 0-7.4 0 3.8 3.8 0 0 1 7.4 0"/> 27 | <path id="ar-e" fill="#85340a" stroke-width="1" d="M303.4 234.3c4.7-4.1 10.7-4.8 14-1.7a8 8 0 0 1 1.5 3.4q.6 3.6-2.1 7.5l.8.4q2.4-4.7 1.6-9.4l-.6-2.3c-4.5-3.7-10.7-4-15.2 2z"/> 28 | <path id="ar-d" fill="#85340a" stroke-width="1" d="M310.8 233c2.7 0 3.3.6 4.5 1.7 1.2 1 1.9.8 2 1 .3.2 0 .8-.3.6q-.7-.2-2.5-1.6c-1.8-1.4-2.5-1-3.7-1-3.7 0-5.7 3-6.1 2.8-.5-.2 2-3.5 6.1-3.5"/> 29 | <use xlink:href="#ar-h" width="100%" height="100%" transform="translate(-18.4)"/> 30 | <circle id="ar-f" cx="310.9" cy="236.3" r="1.8" fill="#85340a" stroke-width="1"/> 31 | <path id="ar-g" fill="#85340a" stroke-width="1" d="M305.9 237.5c3.5 2.7 7 2.5 9 1.3 2-1.3 2-1.7 1.6-1.7s-.8.4-2.4 1.3c-1.7.8-4.1.8-8.2-.9"/> 32 | </svg> 33 | ``` -------------------------------------------------------------------------------- /chrome-extension/popup.js: -------------------------------------------------------------------------------- ```javascript 1 | // ChatGPT Product Info Research Extension - Popup Script 2 | 3 | document.addEventListener('DOMContentLoaded', async () => { 4 | const statusEl = document.getElementById('status'); 5 | const statusTextEl = document.getElementById('status-text'); 6 | const openSearchBtn = document.getElementById('open-search'); 7 | const goToChatGPTBtn = document.getElementById('go-to-chatgpt'); 8 | 9 | const statusIcons = { 10 | success: { modifier: 'status-icon--success', label: 'Success status' }, 11 | warning: { modifier: 'status-icon--warning', label: 'Warning status' }, 12 | error: { modifier: 'status-icon--error', label: 'Error status' }, 13 | }; 14 | 15 | function setStatus(type, message) { 16 | const icon = statusIcons[type]; 17 | if (!icon) { 18 | statusTextEl.textContent = message; 19 | return; 20 | } 21 | 22 | statusTextEl.innerHTML = `<span class="status-icon ${icon.modifier}" role="img" aria-label="${icon.label}"></span> <span>${message}</span>`; 23 | } 24 | 25 | // Check if we're on a ChatGPT tab 26 | async function checkChatGPTStatus() { 27 | try { 28 | const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true }); 29 | 30 | if (!activeTab.url.includes('chatgpt.com')) { 31 | statusEl.className = 'status status-bad'; 32 | setStatus('error', 'Please navigate to ChatGPT first'); 33 | openSearchBtn.disabled = true; 34 | return false; 35 | } 36 | 37 | // Check if content script is ready by sending a message 38 | try { 39 | await chrome.tabs.sendMessage(activeTab.id, { action: 'ping' }); 40 | statusEl.className = 'status status-good'; 41 | setStatus('success', 'Ready to search products'); 42 | openSearchBtn.disabled = false; 43 | return true; 44 | } catch (error) { 45 | statusEl.className = 'status status-warning'; 46 | setStatus('warning', 'Please refresh the ChatGPT page'); 47 | openSearchBtn.disabled = true; 48 | return false; 49 | } 50 | } catch (error) { 51 | statusEl.className = 'status status-bad'; 52 | setStatus('error', 'Unable to check status'); 53 | openSearchBtn.disabled = true; 54 | return false; 55 | } 56 | } 57 | 58 | // Open the product search modal 59 | openSearchBtn.addEventListener('click', async () => { 60 | try { 61 | const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true }); 62 | await chrome.tabs.sendMessage(activeTab.id, { action: 'openSearch' }); 63 | window.close(); // Close the popup 64 | } catch (error) { 65 | console.error('Failed to open search:', error); 66 | statusEl.className = 'status status-bad'; 67 | setStatus('error', 'Failed to open search. Please refresh the page.'); 68 | } 69 | }); 70 | 71 | // Navigate to ChatGPT 72 | goToChatGPTBtn.addEventListener('click', async () => { 73 | try { 74 | const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true }); 75 | 76 | if (activeTab.url.includes('chatgpt.com')) { 77 | // Already on ChatGPT, just refresh 78 | await chrome.tabs.reload(activeTab.id); 79 | } else { 80 | // Navigate to ChatGPT 81 | await chrome.tabs.update(activeTab.id, { url: 'https://chatgpt.com' }); 82 | } 83 | 84 | window.close(); 85 | } catch (error) { 86 | console.error('Failed to navigate to ChatGPT:', error); 87 | } 88 | }); 89 | 90 | // Initial status check 91 | await checkChatGPTStatus(); 92 | 93 | // Recheck status every 2 seconds 94 | setInterval(checkChatGPTStatus, 2000); 95 | }); 96 | ``` -------------------------------------------------------------------------------- /chrome-extension/popup.html: -------------------------------------------------------------------------------- ```html 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>ChatGPT E-commerce Product Research</title> 7 | <style> 8 | body { 9 | width: 340px; 10 | padding: 0; 11 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 12 | background: linear-gradient(140deg, #f5f8ff 0%, #ffffff 60%); 13 | margin: 0; 14 | } 15 | 16 | .container { 17 | padding: 20px; 18 | } 19 | 20 | .header { 21 | text-align: center; 22 | margin-bottom: 20px; 23 | } 24 | 25 | .header h1 { 26 | display: flex; 27 | align-items: center; 28 | justify-content: center; 29 | gap: 8px; 30 | font-size: 18px; 31 | font-weight: 600; 32 | color: #27325f; 33 | margin: 0 0 8px 0; 34 | } 35 | 36 | .header-icon { 37 | width: 20px; 38 | height: 20px; 39 | } 40 | 41 | .header p { 42 | font-size: 13px; 43 | color: #5e6f9b; 44 | margin: 0; 45 | line-height: 1.4; 46 | } 47 | 48 | .status { 49 | background: rgba(255, 255, 255, 0.95); 50 | backdrop-filter: blur(2px); 51 | border-radius: 12px; 52 | padding: 14px; 53 | margin-bottom: 16px; 54 | border: 1px solid rgba(74, 105, 183, 0.22); 55 | box-shadow: 0 2px 8px rgba(32, 42, 92, 0.08); 56 | } 57 | 58 | #status-text { 59 | display: flex; 60 | align-items: center; 61 | gap: 8px; 62 | font-size: 13px; 63 | } 64 | 65 | .status-icon { 66 | width: 18px; 67 | height: 18px; 68 | display: inline-flex; 69 | background-color: currentColor; 70 | -webkit-mask-size: contain; 71 | -webkit-mask-repeat: no-repeat; 72 | -webkit-mask-position: center; 73 | mask-size: contain; 74 | mask-repeat: no-repeat; 75 | mask-position: center; 76 | flex-shrink: 0; 77 | } 78 | 79 | .status-good { 80 | background: rgba(40, 167, 69, 0.1); 81 | border-color: rgba(40, 167, 69, 0.3); 82 | color: #1e7e34; 83 | } 84 | 85 | .status-warning { 86 | background: rgba(255, 193, 7, 0.1); 87 | border-color: rgba(255, 193, 7, 0.3); 88 | color: #856404; 89 | } 90 | 91 | .status-bad { 92 | background: rgba(220, 53, 69, 0.1); 93 | border-color: rgba(220, 53, 69, 0.3); 94 | color: #721c24; 95 | } 96 | 97 | .status-icon--success { 98 | -webkit-mask-image: url('assets/icons-ui/check.svg'); 99 | mask-image: url('assets/icons-ui/check.svg'); 100 | } 101 | 102 | .status-icon--warning { 103 | -webkit-mask-image: url('assets/icons-ui/warning.svg'); 104 | mask-image: url('assets/icons-ui/warning.svg'); 105 | } 106 | 107 | .status-icon--error { 108 | -webkit-mask-image: url('assets/icons-ui/error.svg'); 109 | mask-image: url('assets/icons-ui/error.svg'); 110 | } 111 | 112 | .action-button { 113 | width: 100%; 114 | background: #5b8def; 115 | color: white; 116 | border: none; 117 | padding: 12px 16px; 118 | border-radius: 12px; 119 | font-size: 14px; 120 | font-weight: 500; 121 | cursor: pointer; 122 | transition: all 0.2s ease; 123 | margin-bottom: 12px; 124 | box-shadow: 0 4px 12px rgba(91, 141, 239, 0.25); 125 | } 126 | 127 | .action-button:hover { 128 | background: #4a7de8; 129 | transform: translateY(-1px); 130 | box-shadow: 0 6px 16px rgba(91, 141, 239, 0.35); 131 | } 132 | 133 | .action-button:disabled { 134 | background: #9ca3af; 135 | cursor: not-allowed; 136 | transform: none; 137 | box-shadow: none; 138 | opacity: 0.6; 139 | } 140 | 141 | .secondary-button { 142 | background: rgba(91, 141, 239, 0.12); 143 | color: #2f4db5; 144 | box-shadow: 0 2px 8px rgba(91, 141, 239, 0.12); 145 | } 146 | 147 | .secondary-button:hover { 148 | background: rgba(91, 141, 239, 0.18); 149 | color: #27325f; 150 | } 151 | 152 | .instructions { 153 | background: rgba(255, 255, 255, 0.95); 154 | backdrop-filter: blur(2px); 155 | border-radius: 12px; 156 | padding: 16px; 157 | border: 1px solid rgba(74, 105, 183, 0.22); 158 | font-size: 13px; 159 | line-height: 1.5; 160 | color: #35426b; 161 | box-shadow: 0 2px 8px rgba(32, 42, 92, 0.08); 162 | } 163 | 164 | .instructions h3 { 165 | margin: 0 0 12px 0; 166 | font-size: 14px; 167 | font-weight: 600; 168 | color: #27325f; 169 | } 170 | 171 | .instructions ul { 172 | margin: 8px 0; 173 | padding-left: 20px; 174 | } 175 | 176 | .instructions li { 177 | margin-bottom: 6px; 178 | color: #4b5976; 179 | } 180 | 181 | .footer { 182 | text-align: center; 183 | margin-top: 16px; 184 | padding-top: 16px; 185 | border-top: 1px solid rgba(74, 105, 183, 0.18); 186 | font-size: 12px; 187 | color: #5e6f9b; 188 | } 189 | 190 | .footer a { 191 | color: #5b8def; 192 | text-decoration: none; 193 | transition: color 0.2s ease; 194 | } 195 | 196 | .footer a:hover { 197 | color: #4a7de8; 198 | text-decoration: underline; 199 | } 200 | </style> 201 | </head> 202 | <body> 203 | <div class="container"> 204 | <div class="header"> 205 | <h1> 206 | <img src="assets/icons-ui/search.svg" alt="Search icon" class="header-icon"> 207 | E-commerce Product Research 208 | </h1> 209 | <p>Search for product reviews and information directly in ChatGPT</p> 210 | </div> 211 | 212 | <div id="status" class="status"> 213 | <div id="status-text">Checking ChatGPT status...</div> 214 | </div> 215 | 216 | <button id="open-search" class="action-button" disabled> 217 | Open E-commerce Product Research 218 | </button> 219 | 220 | <button id="go-to-chatgpt" class="action-button secondary-button"> 221 | Go to ChatGPT 222 | </button> 223 | 224 | <div class="instructions"> 225 | <h3>How to use:</h3> 226 | <ul> 227 | <li>Make sure you're logged in to ChatGPT</li> 228 | <li>Click "Open E-commerce Product Research" to show the search interface</li> 229 | <li>Search for any product to get reviews and information</li> 230 | <li>Use multi-product search to compare multiple items</li> 231 | </ul> 232 | </div> 233 | 234 | <div class="footer"> 235 | Created by <a href="https://www.martinaberastegue.com/?utm_source=chrome&utm_medium=extension&utm_campaign=ChatGPT_Ecom_Product_Research&utm_content=popup" target="_blank" rel="noopener noreferrer">Martin Aberastegue</a> 236 | </div> 237 | </div> 238 | 239 | <script src="popup.js"></script> 240 | </body> 241 | </html> 242 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/br.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-br" viewBox="0 0 640 480"> 2 | <g stroke-width="1pt"> 3 | <path fill="#229e45" fill-rule="evenodd" d="M0 0h640v480H0z"/> 4 | <path fill="#f8e509" fill-rule="evenodd" d="m321.4 436 301.5-195.7L319.6 44 17.1 240.7z"/> 5 | <path fill="#2b49a3" fill-rule="evenodd" d="M452.8 240c0 70.3-57.1 127.3-127.6 127.3A127.4 127.4 0 1 1 452.8 240"/> 6 | <path fill="#ffffef" fill-rule="evenodd" d="m283.3 316.3-4-2.3-4 2 .9-4.5-3.2-3.4 4.5-.5 2.2-4 1.9 4.2 4.4.8-3.3 3m86 26.3-3.9-2.3-4 2 .8-4.5-3.1-3.3 4.5-.5 2.1-4.1 2 4.2 4.4.8-3.4 3.1m-36.2-30-3.4-2-3.5 1.8.8-3.9-2.8-2.9 4-.4 1.8-3.6 1.6 3.7 3.9.7-3 2.7m87-8.5-3.4-2-3.5 1.8.8-3.9-2.7-2.8 3.9-.4 1.8-3.5 1.6 3.6 3.8.7-2.9 2.6m-87.3-22-4-2.2-4 2 .8-4.6-3.1-3.3 4.5-.5 2.1-4.1 2 4.2 4.4.8-3.4 3.2m-104.6-35-4-2.2-4 2 1-4.6-3.3-3.3 4.6-.5 2-4.1 2 4.2 4.4.8-3.3 3.1m13.3 57.2-4-2.3-4 2 .9-4.5-3.2-3.3 4.5-.6 2.1-4 2 4.2 4.4.8-3.3 3.1m132-67.3-3.6-2-3.6 1.8.8-4-2.8-3 4-.5 1.9-3.6 1.7 3.8 4 .7-3 2.7m-6.7 38.3-2.7-1.6-2.9 1.4.6-3.2-2.2-2.3 3.2-.4 1.5-2.8 1.3 3 3 .5-2.2 2.2m-142.2 50.4-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2M419 299.8l-2.2-1.1-2.2 1 .5-2.3-1.7-1.6 2.4-.3 1.2-2 1 2 2.5.5-1.9 1.5"/> 7 | <path fill="#ffffef" fill-rule="evenodd" d="m219.3 287.6-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2"/> 8 | <path fill="#ffffef" fill-rule="evenodd" d="m219.3 287.6-2.7-1.5-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m42.3 3-2.6-1.4-2.7 1.3.6-3-2.1-2.2 3-.4 1.4-2.7 1.3 2.8 3 .5-2.3 2.1m-4.8 17-2.6-1.5-2.7 1.4.6-3-2.1-2.3 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m87.4-22.2-2.6-1.6-2.8 1.4.6-3-2-2.3 3-.3 1.4-2.7 1.2 2.8 3 .5-2.2 2.1m-25.1 3-2.7-1.5-2.7 1.4.6-3-2-2.3 3-.3 1.4-2.8 1.2 2.9 3 .5-2.2 2.1m-68.8-5.8-1.7-1-1.7.8.4-1.9-1.3-1.4 1.9-.2.8-1.7.8 1.8 1.9.3-1.4 1.3m167.8 45.4-2.6-1.5-2.7 1.4.6-3-2.1-2.3 3-.4 1.4-2.7 1.3 2.8 3 .6-2.3 2m-20.8 6-2.2-1.4-2.3 1.2.5-2.6-1.7-1.8 2.5-.3 1.2-2.3 1 2.4 2.5.4-1.9 1.8m10.4 2.3-2-1.2-2.1 1 .4-2.3-1.6-1.7 2.3-.3 1.1-2 1 2 2.3.5-1.7 1.6m29.1-22.8-2-1-2 1 .5-2.3-1.6-1.7 2.3-.3 1-2 1 2.1 2.1.4-1.6 1.6m-38.8 41.8-2.5-1.4-2.7 1.2.6-2.8-2-2 3-.3 1.3-2.5 1.2 2.6 3 .5-2.3 1.9m.6 14.2-2.4-1.4-2.4 1.3.6-2.8-1.9-2 2.7-.4 1.2-2.5 1.1 2.6 2.7.5-2 2m-19-23.1-1.9-1.2-2 1 .4-2.2-1.5-1.7 2.2-.2 1-2 1 2 2.2.4-1.6 1.6m-17.8 2.3-2-1.2-2 1 .5-2.2-1.6-1.7 2.3-.2 1-2 1 2 2.1.4-1.6 1.6m-30.4-24.6-2-1.1-2 1 .5-2.3-1.6-1.6 2.2-.3 1-2 1 2 2.2.5-1.6 1.5m3.7 57-1.6-.9-1.8.9.4-2-1.3-1.4 1.9-.2.9-1.7.8 1.8 1.9.3-1.4 1.3m-46.2-86.6-4-2.3-4 2 .9-4.5-3.2-3.3 4.5-.6 2.2-4 1.9 4.2 4.4.8-3.3 3.1"/> 9 | <path fill="#fff" fill-rule="evenodd" d="M444.4 285.8a125 125 0 0 0 5.8-19.8c-67.8-59.5-143.3-90-238.7-83.7a125 125 0 0 0-8.5 20.9c113-10.8 196 39.2 241.4 82.6"/> 10 | <path fill="#309e3a" d="m414 252.4 2.3 1.3a3 3 0 0 0-.3 2.2 3 3 0 0 0 1.4 1.7q1 .8 2 .7.9 0 1.3-.7l.2-.9-.5-1-1.5-1.8a8 8 0 0 1-1.8-3 4 4 0 0 1 2-4.4 4 4 0 0 1 2.3-.2 7 7 0 0 1 2.6 1.2q2.1 1.5 2.6 3.2a4 4 0 0 1-.6 3.3l-2.4-1.5q.5-1 .2-1.7-.2-.8-1.2-1.4a3 3 0 0 0-1.8-.7 1 1 0 0 0-.9.5q-.3.4-.1 1 .2.8 1.6 2.2t2 2.5a4 4 0 0 1-.3 4.2 4 4 0 0 1-1.9 1.5 4 4 0 0 1-2.4.3q-1.3-.3-2.8-1.3-2.2-1.5-2.7-3.3a5 5 0 0 1 .6-4zm-11.6-7.6 2.5 1.3a3 3 0 0 0-.2 2.2 3 3 0 0 0 1.4 1.6q1.1.8 2 .6.9 0 1.3-.8l.2-.8q0-.5-.5-1l-1.6-1.8q-1.7-1.6-2-2.8a4 4 0 0 1 .4-3.1 4 4 0 0 1 1.6-1.4 4 4 0 0 1 2.2-.3 7 7 0 0 1 2.6 1q2.3 1.5 2.7 3.1a4 4 0 0 1-.4 3.4l-2.5-1.4q.5-1 .2-1.7-.4-1-1.3-1.4a3 3 0 0 0-1.9-.6 1 1 0 0 0-.8.5q-.3.4-.1 1 .3.8 1.7 2.2 1.5 1.5 2 2.4a4 4 0 0 1 0 4.2 4 4 0 0 1-1.8 1.6 4 4 0 0 1-2.4.3 8 8 0 0 1-2.9-1.1 6 6 0 0 1-2.8-3.2 5 5 0 0 1 .4-4m-14.2-3.8 7.3-12 8.8 5.5-1.2 2-6.4-4-1.6 2.7 6 3.7-1.3 2-6-3.7-2 3.3 6.7 4-1.2 2zm-20.7-17 1.1-2 5.4 2.7-2.5 5q-1.2.3-3 .2a9 9 0 0 1-3.3-1 8 8 0 0 1-3-2.6 6 6 0 0 1-1-3.5 9 9 0 0 1 1-3.7 8 8 0 0 1 2.6-3 6 6 0 0 1 3.6-1.1q1.4 0 3.2 1 2.4 1.1 3.1 2.8a5 5 0 0 1 .3 3.5l-2.7-.8a3 3 0 0 0-.2-2q-.4-.9-1.6-1.4a4 4 0 0 0-3.1-.3q-1.5.5-2.6 2.6t-.7 3.8a4 4 0 0 0 2 2.4q.8.5 1.7.5h1.8l.8-1.6zm-90.2-22.3 2-14 4.2.7 1.1 9.8 3.9-9 4.2.6-2 13.8-2.7-.4 1.7-10.9-4.4 10.5-2.7-.4-1.1-11.3-1.6 11zm-14.1-1.7 1.3-14 10.3 1-.2 2.4-7.5-.7-.3 3 7 .7-.3 2.4-7-.7-.3 3.8 7.8.7-.2 2.4z"/> 11 | <g stroke-opacity=".5"> 12 | <path fill="#309e3a" d="M216.5 191.3q0-2.2.7-3.6a7 7 0 0 1 1.4-1.9 5 5 0 0 1 1.8-1.2q1.5-.5 3-.5 3.1.1 5 2a7 7 0 0 1 1.6 5.5q0 3.3-2 5.3a7 7 0 0 1-5 1.7 7 7 0 0 1-4.8-2 7 7 0 0 1-1.7-5.3"/> 13 | <path fill="#f7ffff" d="M219.4 191.3q0 2.3 1 3.6t2.8 1.3a4 4 0 0 0 2.8-1.1q1-1.2 1.1-3.7.1-2.4-1-3.6a4 4 0 0 0-2.7-1.3 4 4 0 0 0-2.8 1.2q-1.1 1.2-1.2 3.6"/> 14 | </g> 15 | <g stroke-opacity=".5"> 16 | <path fill="#309e3a" d="m233 198.5.2-14h6q2.2 0 3.2.5 1 .3 1.6 1.3c.6 1 .6 1.4.6 2.3a4 4 0 0 1-1 2.6 5 5 0 0 1-2.7 1.2l1.5 1.2q.6.6 1.5 2.3l1.7 2.8h-3.4l-2-3.2-1.4-2-.9-.6-1.4-.2h-.6v5.8z"/> 17 | <path fill="#fff" d="M236 190.5h2q2.1 0 2.6-.2.5-.1.8-.5.4-.6.3-1 0-.9-.4-1.2-.3-.4-1-.6h-2l-2.3-.1z"/> 18 | </g> 19 | <g stroke-opacity=".5"> 20 | <path fill="#309e3a" d="m249 185.2 5.2.3q1.7 0 2.6.3a5 5 0 0 1 2 1.4 6 6 0 0 1 1.2 2.4q.4 1.4.3 3.3a9 9 0 0 1-.5 3q-.6 1.5-1.7 2.4a5 5 0 0 1-2 1q-1 .3-2.5.2l-5.3-.3z"/> 21 | <path fill="#fff" d="m251.7 187.7-.5 9.3h3.8q.8 0 1.2-.5.5-.4.8-1.3t.4-2.6l-.1-2.5a3 3 0 0 0-.8-1.4l-1.2-.7-2.3-.3z"/> 22 | </g> 23 | <g stroke-opacity=".5"> 24 | <path fill="#309e3a" d="m317.6 210.2 3.3-13.6 4.4 1 3.2 1q1.1.6 1.6 1.9t.2 2.8q-.3 1.2-1 2a4 4 0 0 1-3 1.4q-1 0-3-.5l-1.7-.5-1.2 5.2z"/> 25 | <path fill="#fff" d="m323 199.6-.8 3.8 1.5.4q1.6.4 2.2.3a2 2 0 0 0 1.6-1.5q0-.7-.2-1.3a2 2 0 0 0-1-.9l-1.9-.5-1.3-.3z"/> 26 | </g> 27 | <g stroke-opacity=".5"> 28 | <path fill="#309e3a" d="m330.6 214.1 4.7-13.2 5.5 2q2.2.8 3 1.4.8.7 1 1.8c.2 1.1.2 1.5 0 2.3q-.6 1.5-1.8 2.2-1.2.6-3 .3.6.7 1 1.6l.8 2.7.6 3.1-3.1-1.1-1-3.6-.7-2.4-.6-.8q-.3-.4-1.3-.7l-.5-.2-2 5.6z"/> 29 | <path fill="#fff" d="m336 207.4 1.9.7q2 .7 2.5.7t.9-.3q.5-.3.6-.9.3-.6 0-1.2l-.8-.9-2-.7-2-.7-1.2 3.3z"/> 30 | </g> 31 | <g stroke-opacity=".5"> 32 | <path fill="#309e3a" d="M347 213.6a9 9 0 0 1 1.7-3.2l1.8-1.5 2-.7q1.5-.1 3.1.4a7 7 0 0 1 4.2 3.3q1.2 2.4.2 5.7a7 7 0 0 1-3.4 4.5q-2.3 1.3-5.2.4a7 7 0 0 1-4.2-3.3 7 7 0 0 1-.2-5.6"/> 33 | <path fill="#fff" d="M349.8 214.4q-.7 2.3 0 3.8c.7 1.5 1.2 1.6 2.3 2q1.5.5 3-.4 1.4-.8 2.1-3.2.8-2.2 0-3.7a4 4 0 0 0-2.2-2 4 4 0 0 0-3 .3q-1.5.8-2.2 3.2"/> 34 | </g> 35 | <g stroke-opacity=".5"> 36 | <path fill="#309e3a" d="m374.3 233.1 6.4-12.4 5.3 2.7a10 10 0 0 1 2.7 1.9q.8.7.8 1.9c0 1.2 0 1.5-.4 2.2a4 4 0 0 1-2 2q-1.5.4-3.1-.2.6 1 .8 1.7.3.9.4 2.8l.2 3.2-3-1.5-.4-3.7-.3-2.5-.5-1-1.2-.7-.5-.3-2.7 5.2z"/> 37 | <path fill="#fff" d="m380.5 227.2 1.9 1q1.8 1 2.3 1t1-.2q.4-.2.7-.8t.2-1.2l-.7-1-1.8-1-2-1z"/> 38 | </g> 39 | <g stroke-opacity=".5"> 40 | <path fill="#309e3a" d="M426.1 258.7a9 9 0 0 1 2.5-2.6 7 7 0 0 1 2.2-.9 6 6 0 0 1 2.2 0q1.5.3 2.8 1.2a7 7 0 0 1 3 4.4q.4 2.6-1.4 5.5a7 7 0 0 1-4.5 3.3 7 7 0 0 1-5.2-1.1 7 7 0 0 1-3-4.4q-.4-2.7 1.4-5.4"/> 41 | <path fill="#fff" d="M428.6 260.3q-1.4 2-1.1 3.6a4 4 0 0 0 1.6 2.5q1.5 1 3 .6t2.9-2.4q1.4-2.1 1.1-3.6t-1.6-2.6c-1.4-1.1-2-.8-3-.5q-1.5.3-3 2.4z"/> 42 | </g> 43 | <path fill="#309e3a" d="m301.8 204.5 2.3-9.8 7.2 1.7-.3 1.6-5.3-1.2-.5 2.2 4.9 1.1-.4 1.7-4.9-1.2-.6 2.7 5.5 1.3-.4 1.6z"/> 44 | </g> 45 | </svg> 46 | ``` -------------------------------------------------------------------------------- /chrome-extension/assets/flags/pt.svg: -------------------------------------------------------------------------------- ``` 1 | <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="flag-icons-pt" viewBox="0 0 640 480"> 2 | <path fill="red" d="M256 0h384v480H256z"/> 3 | <path fill="#060" d="M0 0h256v480H0z"/> 4 | <g fill="#ff0" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width=".6"> 5 | <path d="M339.5 306.2c-32.3-1-180-93.2-181-108l8.1-13.5c14.7 21.3 165.7 111 180.6 107.8z"/> 6 | <path d="M164.9 182.8c-2.9 7.8 38.6 33.4 88.4 63.8s92.9 49 96 46.4l1.5-2.8q-.9 1.6-4.3.6c-13.5-3.9-48.6-20-92.1-46.4-43.6-26.4-81.4-50.7-87.3-61a6 6 0 0 1-.6-3.1h-.2l-1.2 2.2zm175.3 123.8q-.7 1.3-3.5.8c-12-1.3-48.6-19.1-91.9-45-50.4-30.2-92-57.6-87.4-64.8l1.2-2.2.2.1c-4 12.2 82.1 61.4 87.2 64.6 49.8 30.8 91.8 48.9 95.5 44.2z"/> 7 | <path d="M256.2 207.2c32.2-.3 72-4.4 95-13.6l-5-8c-13.5 7.5-53.5 12.5-90.3 13.2-43.4-.4-74.1-4.5-89.5-14.8l-4.6 8.6c28.2 12 57.2 14.5 94.4 14.6"/> 8 | <path d="M352.5 193.8c-.8 1.3-15.8 6.4-37.8 10.2a381 381 0 0 1-58.6 4.3 416 416 0 0 1-56.2-3.6c-23.1-3.6-35-8.6-39.5-10.4l1.1-2.2c12.7 5 24.7 8 38.7 10.2A412 412 0 0 0 256 206a392 392 0 0 0 58.3-4.3c22.5-3.7 34.8-8.4 36.6-10.5zm-4.4-8.1c-2.4 2-14.6 6.3-36 9.7a388 388 0 0 1-55.8 4c-22 0-40.1-1.6-53.8-3.6-21.8-2.8-33.4-8-37.6-9.4l1.3-2.2c3.3 1.7 14.4 6.2 36.5 9.3a385 385 0 0 0 53.6 3.4 384 384 0 0 0 55.4-4c21.5-3 33.1-8.4 34.9-9.8zM150.3 246c19.8 10.7 63.9 16 105.6 16.4 38 .1 87.4-5.8 105.9-15.6l-.5-10.7c-5.8 9-58.8 17.7-105.8 17.4s-90.7-7.6-105.3-17v9.5"/> 9 | <path d="M362.8 244.5v2.5c-2.8 3.4-20.2 8.4-42 12a434 434 0 0 1-65.4 4.4 400 400 0 0 1-62-4.3 155 155 0 0 1-44.4-12v-2.9c9.7 6.4 35.9 11.2 44.7 12.6 15.8 2.4 36.1 4.2 61.7 4.2 26.9 0 48.4-1.9 65-4.4 15.7-2.3 38-8.2 42.4-12.1m0-9v2.5c-2.8 3.3-20.2 8.3-42 11.9a434 434 0 0 1-65.4 4.5 414 414 0 0 1-62-4.3 155 155 0 0 1-44.4-12v-3c9.7 6.5 36 11.2 44.7 12.6a408 408 0 0 0 61.7 4.3c26.9 0 48.5-2 65-4.5 15.7-2.2 38-8.1 42.4-12m-107 68.8c-45.6-.2-84.7-12.4-93-14.4l6 9.4a250 250 0 0 0 87.4 14.3c34.7-1 65-3.7 86.3-14.1l6.2-9.8c-14.5 6.9-64 14.6-93 14.6"/> 10 | <path d="m344.9 297.3-2.8 4c-10 3.6-26 7.4-32.6 8.4a296 296 0 0 1-53.7 5c-40.4-.6-73.5-8.5-89-15.3l-1.3-2.1.2-.4 2.1.9a287 287 0 0 0 88.2 14.5c18.8 0 37.5-2.1 52.6-4.8 23.2-4.7 32.6-8.2 35.5-9.8l.7-.4zm5.3-8.8-2 3.5c-5.4 2-20 6.2-41.3 9.2-14 1.9-22.7 3.8-50.6 4.3a347 347 0 0 1-94.2-14L161 289a390 390 0 0 0 95.4 14c25.5-.5 36.4-2.4 50.3-4.3 24.8-3.8 37.3-8 41-9.1v-.2l2.6-1z"/> 11 | <path d="M350.8 237.6c.1 30-15.3 57-27.6 68.8a99 99 0 0 1-67.8 28.2c-30.3.5-58.8-19.2-66.5-27.9a101 101 0 0 1-27.5-67.4c1.8-32.8 14.7-55.6 33.3-71.3a100 100 0 0 1 64.2-22.7 98 98 0 0 1 71 35.6c12.5 15.2 18 31.7 20.9 56.7M255.6 135a106 106 0 0 1 106 105.2 105.6 105.6 0 1 1-211.4 0c-.1-58 47.3-105.2 105.4-105.2"/> 12 | <path d="M255.9 134.5c58.2 0 105.6 47.4 105.6 105.6S314.1 345.7 256 345.7s-105.6-47.4-105.6-105.6S197.8 134.5 256 134.5zM152.6 240c0 56.8 46.7 103.3 103.3 103.3S359.2 296.8 359.2 240s-46.7-103.3-103.3-103.3S152.6 183.2 152.6 240"/> 13 | <path d="M256 143.3a97 97 0 0 1 96.7 96.7 97 97 0 0 1-96.7 96.8c-53 0-96.7-43.6-96.7-96.8a97 97 0 0 1 96.7-96.7M161.6 240c0 52 42.6 94.4 94.4 94.4s94.4-42.5 94.4-94.4-42.6-94.4-94.4-94.4a95 95 0 0 0-94.4 94.4"/> 14 | <path d="M260.3 134h-9.1v212.3h9z"/> 15 | <path d="M259.3 132.8h2.3v214.7h-2.2V132.8zm-9 0h2.4v214.7h-2.3z"/> 16 | <path d="M361.6 244.2v-7.8l-6.4-6-36.3-9.6-52.2-5.3-63 3.2-44.8 10.6-9 6.7v7.9l22.9-10.3 54.4-8.5h52.3l38.4 4.2 26.6 6.4z"/> 17 | <path d="M256 223.8c24.9 0 49 2.3 68.3 6 19.8 4 33.7 9 38.5 14.5v2.8c-5.8-7-24.5-12-39-15-19-3.6-43-6-67.9-6-26.1 0-50.5 2.6-69.3 6.2-15 3-35.1 9-37.6 14.8v-2.9c1.3-4 16.3-10 37.3-14.3 18.9-3.7 43.3-6.1 69.6-6.1zm0-9.1a383 383 0 0 1 68.3 6c19.8 4 33.7 9 38.5 14.6v2.7c-5.8-6.9-24.5-12-39-14.9-19-3.7-43-6-67.9-6a376 376 0 0 0-69.2 6.2c-14.5 2.7-35.4 8.9-37.7 14.7v-2.8c1.4-4 16.6-10.3 37.3-14.3 19-3.7 43.3-6.2 69.7-6.2m-.6-46.2c39.3-.2 73.6 5.5 89.3 13.5l5.7 10c-13.6-7.4-50.6-15-94.9-14-36.1.3-74.7 4-94 14.4l6.8-11.4c15.9-8.3 53.3-12.5 87.1-12.5"/> 18 | <path d="M256 176.7a354 354 0 0 1 61.3 4.3c16 3 31.3 7.4 33.5 9.8l1.7 3c-5.3-3.4-18.6-7.3-35.6-10.5s-38.7-4.3-61-4.2c-25.3-.1-45 1.2-61.8 4.2a109 109 0 0 0-33.3 10.3l1.7-3.1c6-3 15.3-6.7 31.1-9.6 17.5-3.2 37.4-4.1 62.4-4.2m0-9c21.4-.2 42.6 1 59.1 4a96 96 0 0 1 30.6 10l2.5 4c-4.2-4.7-20-9.2-34.1-11.6-16.4-2.9-36.7-4-58.1-4.2a361 361 0 0 0-59.5 4.4 97 97 0 0 0-29.6 9.1l2.2-3.3c5.8-3 15.2-5.8 27-8.1a357 357 0 0 1 59.9-4.4zM308.4 284a276 276 0 0 0-52.5-4c-65.5.8-86.6 13.5-89.2 17.3l-5-8c16.8-12 52.4-18.8 94.6-18.2q32.9.5 56.6 5l-4.5 8"/> 19 | <path d="M255.6 278.9c18.2.3 36 1 53.3 4.2l-1.2 2.2c-16-3-33.2-4-52-4-24.3-.2-48.7 2.1-70 8.2-6.7 1.9-17.8 6.2-19 9.8l-1.2-2c.4-2.2 7-6.6 19.6-10 24.4-7 47.2-8.3 70.5-8.4m.8-9.2a327 327 0 0 1 57.3 5l-1.3 2.3a299 299 0 0 0-56-4.9c-24.2 0-49.9 1.8-73.3 8.6-7.5 2.2-20.6 7-21 10.7l-1.2-2.2c.2-3.4 11.5-7.9 21.7-10.8 23.5-6.9 49.3-8.6 73.8-8.7"/> 20 | <path d="m349.4 290.5-7.8 12.3-22.7-20.1-58.6-39.5-66.2-36.3-34.3-11.7 7.3-13.6 2.5-1.3 21.3 5.3 70.4 36.3 40.6 25.6L336 272l13.9 16z"/> 21 | <path d="M158.6 195.5c6-4 50.2 15.6 96.6 43.6 46.1 28 90.3 59.6 86.3 65.5l-1.3 2.1-.6.5c.1-.1.8-1 0-3.1-2-6.5-33.4-31.5-85.3-62.9-50.7-30.1-92.9-48.3-97-43.1zM351 290.4c3.8-7.6-37.2-38.5-88.1-68.6-52-29.5-89.6-46.9-96.5-41.7L165 183l.4-.5c1.2-1 3.3-1 4.2-1 11.8.2 45.5 15.7 92.8 42.8 20.8 12 87.6 55 87.3 67 0 1 .1 1.2-.3 1.8l1.7-2.6z"/> 22 | </g> 23 | <g transform="translate(0 26.7)scale(1.06667)"> 24 | <path fill="#fff" stroke="#000" stroke-width=".7" d="M180.6 211a59 59 0 0 0 17.5 41.7 59 59 0 0 0 41.8 17.6 59 59 0 0 0 42-17.4 59 59 0 0 0 17.4-41.8v-79.2l-118.7-.2z"/> 25 | <path fill="red" stroke="#000" stroke-width=".5" d="M183 211.1a56 56 0 0 0 16.8 40 57 57 0 0 0 40.2 16.8 57 57 0 0 0 40.2-16.6 56 56 0 0 0 16.7-40v-77H183v76.8m91-53.7v48.9l-.1 5.1a33 33 0 0 1-10 24 34 34 0 0 1-24 10c-9.4 0-17.7-4-23.9-10.2a34 34 0 0 1-10-24v-54z"/> 26 | <g id="pt-e"> 27 | <g id="pt-d" fill="#ff0" stroke="#000" stroke-width=".5"> 28 | <path stroke="none" d="M190.2 154.4c.1-5.5 4-6.8 4-6.8.1 0 4.3 1.4 4.3 6.9z"/> 29 | <path d="m186.8 147.7-.7 6.3h4.2c0-5.2 4-6 4-6 .1 0 4 1.1 4.1 6h4.2l-.8-6.4zm-1 6.4h17q.5 0 .6.7 0 .8-.6.8h-17q-.5 0-.6-.8 0-.7.7-.7z"/> 30 | <path d="M192 154c0-3.3 2.3-4.2 2.3-4.2s2.3 1 2.3 4.2H192m-5.8-9h16.3q.5.1.6.8 0 .5-.6.6h-16.3q-.5 0-.6-.7 0-.5.6-.6zm.4 1.5H202q.5 0 .6.7t-.6.7h-15.5q-.6 0-.6-.7t.6-.7zm5-10.6h1.2v.8h.9v-.8h1.3v.9h.9v-1h1.2v2q0 .6-.5.6h-4.4q-.5 0-.6-.5zm4.6 2.7.3 6.4h-4.3l.3-6.5h3.7"/> 31 | <path id="pt-a" d="M191 141.6v3.4h-4v-3.4z"/> 32 | <use xlink:href="#pt-a" width="100%" height="100%" x="10.6"/> 33 | <path id="pt-b" d="M186.3 139h1.2v1h.9v-1h1.2v1h.9v-1h1.2v2q0 .6-.5.6h-4.3l-.6-.6z"/> 34 | <use xlink:href="#pt-b" width="100%" height="100%" x="10.6"/> 35 | <path fill="#000001" stroke="none" d="M193.9 140.6c0-.6.9-.6.9 0v1.6h-.9z"/> 36 | <path id="pt-c" fill="#000001" stroke="none" d="M188.6 142.8c0-.6.8-.6.8 0v1.2h-.8z"/> 37 | <use xlink:href="#pt-c" width="100%" height="100%" x="10.6"/> 38 | </g> 39 | <use xlink:href="#pt-d" width="100%" height="100%" y="46.3"/> 40 | <use xlink:href="#pt-d" width="100%" height="100%" transform="rotate(-45.2 312.8 180)"/> 41 | </g> 42 | <use xlink:href="#pt-d" width="100%" height="100%" x="45.7"/> 43 | <use xlink:href="#pt-e" width="100%" height="100%" transform="matrix(-1 0 0 1 479.8 0)"/> 44 | <g id="pt-f" fill="#fff"> 45 | <path fill="#039" d="M232.6 202.4a8 8 0 0 0 2.2 5.7 7 7 0 0 0 5.3 2.4q3.2-.2 5.3-2.4a8 8 0 0 0 2.2-5.7v-10.8h-15z"/> 46 | <circle cx="236.1" cy="195.7" r="1.5"/> 47 | <circle cx="244.4" cy="195.7" r="1.5"/> 48 | <circle cx="240.2" cy="199.7" r="1.5"/> 49 | <circle cx="236.1" cy="203.9" r="1.5"/> 50 | <circle cx="244.4" cy="203.9" r="1.5"/> 51 | </g> 52 | <use xlink:href="#pt-f" width="100%" height="100%" y="-26"/> 53 | <use xlink:href="#pt-f" width="100%" height="100%" x="-20.8"/> 54 | <use xlink:href="#pt-f" width="100%" height="100%" x="20.8"/> 55 | <use xlink:href="#pt-f" width="100%" height="100%" y="25.8"/> 56 | </g> 57 | </svg> 58 | ```