/******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/api.js": /*!********************************************************************************************************!*\ !*** ./node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/api.js ***! \********************************************************************************************************/ /***/ ((module) => { /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ "./node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/sourceMaps.js": /*!***************************************************************************************************************!*\ !*** ./node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/sourceMaps.js ***! \***************************************************************************************************************/ /***/ ((module) => { module.exports = function (item) { var content = item[1]; var cssMapping = item[3]; if (!cssMapping) { return content; } if (typeof btoa === "function") { var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping)))); var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64); var sourceMapping = "/*# ".concat(data, " */"); return [content].concat([sourceMapping]).join("\n"); } return [content].join("\n"); }; /***/ }), /***/ "./src/shared/copy.ts": /*!****************************!*\ !*** ./src/shared/copy.ts ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ BACKGROUND_COLOR_OUT: () => (/* binding */ BACKGROUND_COLOR_OUT), /* harmony export */ BACKGROUND_COLOR_OVER: () => (/* binding */ BACKGROUND_COLOR_OVER), /* harmony export */ SETTINGS_BACKGROUND_OUT: () => (/* binding */ SETTINGS_BACKGROUND_OUT), /* harmony export */ SETTINGS_BACKGROUND_OVER: () => (/* binding */ SETTINGS_BACKGROUND_OVER), /* harmony export */ addCopyButtonToAnswer: () => (/* binding */ addCopyButtonToAnswer), /* harmony export */ applyToPlatform: () => (/* binding */ applyToPlatform), /* harmony export */ applyToPlatforms: () => (/* binding */ applyToPlatforms), /* harmony export */ createCopyButton: () => (/* binding */ createCopyButton), /* harmony export */ createFlashOverlay: () => (/* binding */ createFlashOverlay), /* harmony export */ createGlowingAnimationStyle: () => (/* binding */ createGlowingAnimationStyle), /* harmony export */ initTurndownService: () => (/* binding */ initTurndownService), /* harmony export */ observeDOMChanges: () => (/* binding */ observeDOMChanges), /* harmony export */ processMarkdown: () => (/* binding */ processMarkdown), /* harmony export */ stripMarkdown: () => (/* binding */ stripMarkdown) /* harmony export */ }); /* harmony import */ var turndown__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! turndown */ "turndown"); /* harmony import */ var turndown__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(turndown__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var turndown_plugin_gfm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! turndown-plugin-gfm */ "turndown-plugin-gfm"); /* harmony import */ var turndown_plugin_gfm__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(turndown_plugin_gfm__WEBPACK_IMPORTED_MODULE_1__); // 背景颜色常量 const BACKGROUND_COLOR_OUT = 'linear-gradient(135deg, rgba(25, 239, 192, 0.6), rgba(64, 128, 255, 0.4))'; const BACKGROUND_COLOR_OVER = 'linear-gradient(135deg, rgba(25, 239, 192, 0.8), rgba(64, 128, 255, 0.6))'; const SETTINGS_BACKGROUND_OUT = 'linear-gradient(135deg, rgba(64, 128, 255, 0.6), rgba(25, 239, 192, 0.4))'; const SETTINGS_BACKGROUND_OVER = 'linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6))'; // 初始化turndown服务 function initTurndownService() { const turndownService = new (turndown__WEBPACK_IMPORTED_MODULE_0___default())({ preformattedCode: true, // 是否保留预格式化代码,设为true时会保持代码块的原始格式,包括缩进和换行 headingStyle: 'atx', // 标题样式,'atx'使用#号(如:# 标题),'setext'使用底线(如:标题\n===) bulletListMarker: '-', // 无序列表的标记符号,可以是 '-', '*', 或 '+' emDelimiter: '*', // 斜体文本的分隔符,可以是 '_' 或 '*' strongDelimiter: '**', // 加粗文本的分隔符 codeBlockStyle: 'fenced' // 代码块样式,'fenced'使用```包裹,'indented'使用缩进 }); turndownService.use(turndown_plugin_gfm__WEBPACK_IMPORTED_MODULE_1__.gfm); // 自定义代码块规则 turndownService.addRule('codeBlock', { filter: function (node) { if (!(node instanceof HTMLElement)) { return false; } // 比如【百度-AI搜索】平台,pre元素下的code元素,不是子元素而是后代元素,为了使其识别为代码块,所以需要特殊处理 const codeElement = node.querySelector('code'); return node.nodeName === 'PRE' && codeElement !== null; }, replacement: function (content, node) { const codeElement = node.querySelector('code'); const code = codeElement?.textContent?.trim() || ''; const lang = codeElement?.getAttribute('class') || ''; const languageMatch = lang.match(/language-([\w-]+)/i); const language = languageMatch ? languageMatch[1] : ''; return '\n```' + (language ? language + '\n' : '\n') + code + '\n```\n'; } }); // 自定义escape函数,避免不必要的转义 turndownService.escape = function (text) { return text .replace(/\\([!"#$%&'()*+,\-./:;<=>?@\[\]^_`{|}~])/g, '$1') // 移除已有的转义 .replace(/([*_`])/g, '\\$1'); // 只转义特殊Markdown字符 }; return turndownService; } // Markdown 工具函数 function stripMarkdown(text) { return text .replace(/```[\s\S]*?```/g, '$1') // 移除代码块 .replace(/\*\*(.*?)\*\*/g, '$1') // 移除加粗 .replace(/\*(.*?)\*/g, '$1') // 移除斜体 .replace(/`([^`]+)`/g, '$1') // 移除行内代码 .replace(/^#+\s+/gm, '') // 移除标题标记 .replace(/^[-*]\s+/gm, '') // 移除无序列表标记 .replace(/^\d+\.\s+/gm, '') // 移除有序列表标记 .replace(/^>\s+/gm, '') // 移除引用标记 .trim(); } // 处理Markdown文本,根据配置决定是否去除参考文献角标和特殊span节点 function processMarkdown(markdown, removeSelectorList, config) { // 创建节点的深拷贝,以免修改原始节点 const clonedMarkdown = markdown.cloneNode(true); // 根据配置决定是否在拷贝的节点上移除参考文献角标 if (config.removeReferences) { removeSelectorList.forEach(selector => { clonedMarkdown.querySelectorAll(selector).forEach(node => node.remove()); }); } // 移除零宽连字符 const treeWalker = document.createTreeWalker(clonedMarkdown, NodeFilter.SHOW_TEXT); let currentNode; while (currentNode = treeWalker.nextNode()) { currentNode.textContent = currentNode.textContent?.replace(/‌|\u200c/g, '') ?? ''; } return clonedMarkdown; } // 创建复制按钮的闪光动画样式 function createGlowingAnimationStyle() { const style = document.createElement('style'); style.textContent = ` @keyframes glowing { 0% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); } 50% { box-shadow: 0 0 15px rgba(0, 255, 128, 1), 0 0 20px rgba(255, 7, 160, 0.9), 0 0 25px rgba(64, 128, 255, 0.8); } 100% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); } } @keyframes flash-animation { 0% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); } 25% { opacity: 1; transform: scale(1.02); filter: brightness(1.5); background-color: rgba(255, 255, 255, 0.95); } 50% { opacity: 0.5; transform: scale(1.01); filter: brightness(1.2); background-color: rgba(255, 255, 255, 0.5); } 100% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); } } `; return style; } // 创建复制按钮 function createCopyButton(position = 'top') { const button = document.createElement('button'); button.textContent = '复制'; button.className = 'ai-copy-button'; button.style.position = 'absolute'; // 根据位置设置top和bottom值 switch (position) { case 'top': button.style.top = '10px'; break; case 'middle': button.style.top = '50%'; button.style.transform = 'translateY(-50%)'; break; case 'bottom': button.style.bottom = '10px'; break; } button.style.right = '10px'; button.style.padding = '4px 8px'; button.style.background = BACKGROUND_COLOR_OUT; button.style.color = 'white'; button.style.border = '2px dashed #fff'; button.style.borderRadius = '4px'; button.style.cursor = 'pointer'; button.style.fontSize = '16px'; button.style.zIndex = '1000'; button.style.animation = 'glowing 2s infinite'; // 添加悬停效果 button.addEventListener('mouseover', () => { button.style.background = BACKGROUND_COLOR_OVER; }); button.addEventListener('mouseout', () => { button.style.background = BACKGROUND_COLOR_OUT; }); return button; } // 创建闪光效果遮罩层 function createFlashOverlay() { const flashOverlay = document.createElement('div'); flashOverlay.style.position = 'absolute'; flashOverlay.style.top = '0'; flashOverlay.style.left = '0'; flashOverlay.style.width = '100%'; flashOverlay.style.height = '100%'; flashOverlay.style.backgroundColor = 'rgba(255, 255, 255, 0)'; flashOverlay.style.animation = 'flash-animation 1s ease-in-out'; flashOverlay.style.pointerEvents = 'none'; flashOverlay.style.zIndex = '999'; return flashOverlay; } // 为AI回答添加复制按钮 function addCopyButtonToAnswer(answerElement, platform, config, turndownService, copyToClipboard) { // 检查是否已经添加了复制按钮 if (answerElement.querySelector('.ai-copy-button')) { return; } // 设置相对定位,以便正确放置复制按钮 if (window.getComputedStyle(answerElement).position === 'static') { answerElement.style.position = 'relative'; } // 创建三个不同位置的复制按钮 const positions = ['top', 'middle', 'bottom']; positions.forEach(position => { const button = createCopyButton(position); answerElement.appendChild(button); // 为每个按钮添加点击事件 button.addEventListener('click', async () => { // 让按钮获得焦点 button.focus(); // 查找Markdown内容 const markdownElement = answerElement.querySelector(`[class*="${platform.markdownContentClass}"]`); if (!markdownElement) { console.error('未找到Markdown内容元素'); return; } // 添加闪光效果 const flashOverlay = createFlashOverlay(); answerElement.appendChild(flashOverlay); // 动画结束后移除遮罩层 flashOverlay.addEventListener('animationend', () => { flashOverlay.remove(); }); // 处理Markdown内容 const markdownOuterHTML = processMarkdown(markdownElement, platform.removeSelectorList, config); // 根据用户选择的格式进行复制 let content = ''; if (config.copyFormat === 'markdown') { content = turndownService.turndown(markdownOuterHTML.outerHTML); } else { content = markdownOuterHTML.outerHTML; } // 复制到剪贴板 await copyToClipboard(content); // 修改按钮文本提示复制成功 const originalText = button.textContent; button.textContent = '✓ 已复制'; // 一段时间后恢复按钮文本 setTimeout(() => { button.textContent = originalText; }, 2000); }); }); } // 为单个平台应用复制功能 function applyToPlatform(platform, config, turndownService, copyToClipboard) { if (!config.enableCopy) return; const answerElements = document.querySelectorAll(platform.selector); if (answerElements.length === 0) return; answerElements.forEach(element => { addCopyButtonToAnswer(element, platform, config, turndownService, copyToClipboard); }); } // 为所有平台应用复制功能 function applyToPlatforms(platforms, config, turndownService, copyToClipboard) { platforms.forEach(platform => { applyToPlatform(platform, config, turndownService, copyToClipboard); }); } // 监听DOM变化,为新的回答添加复制按钮 function observeDOMChanges(platforms, config, turndownService, copyToClipboard) { const observer = new MutationObserver(mutations => { let shouldApply = false; mutations.forEach(mutation => { if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { shouldApply = true; } }); if (shouldApply) { applyToPlatforms(platforms, config, turndownService, copyToClipboard); } }); // 观察整个文档的变化 observer.observe(document.body, { childList: true, subtree: true }); return observer; } /***/ }), /***/ "./src/shared/styles/common.css": /*!**************************************!*\ !*** ./src/shared/styles/common.css ***! \**************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/api.js */ "./node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, `@keyframes glowing { 0% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); } 50% { box-shadow: 0 0 15px rgba(0, 255, 128, 1), 0 0 20px rgba(255, 7, 160, 0.9), 0 0 25px rgba(64, 128, 255, 0.8); } 100% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); } } @keyframes flash-animation { 0% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); } 25% { opacity: 1; transform: scale(1.02); filter: brightness(1.5); background-color: rgba(255, 255, 255, 0.95); } 50% { opacity: 0.5; transform: scale(1.01); filter: brightness(1.2); background-color: rgba(255, 255, 255, 0.5); } 100% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); } } .ai-copy-button { width: auto; position: absolute; right: 10px; padding: 4px 8px; background: linear-gradient(135deg, rgba(25, 239, 192, 0.6), rgba(64, 128, 255, 0.4)); color: white; border: 2px dashed #fff; border-radius: 4px; cursor: pointer; font-size: 16px; z-index: 1000; animation: glowing 2s infinite; } .ai-copy-button:hover { background: linear-gradient(135deg, rgba(25, 239, 192, 0.8), rgba(64, 128, 255, 0.6)); } .ai-copy-button.top { top: 10px; } .ai-copy-button.middle { top: 50%; transform: translateY(-50%); } .ai-copy-button.bottom { bottom: 10px; } body { font-family: system-ui, -apple-system, sans-serif; } .option-container { margin: 16px; border: 2px dashed #e0e0e0; border-radius: 12px; padding: 4px 16px; } .checkbox-container { display: flex; align-items: center; margin-bottom: 12px; padding: 0 8px; border-radius: 8px; cursor: pointer !important; transition: background-color 0.2s; font-size: 14px; } .checkbox-container:hover { background-color: #f5f5f5; } .checkbox-container input[type='checkbox'] { margin-right: 12px; width: 20px; height: 20px; cursor: pointer; accent-color: #4285f4; } .radio-group { position: relative; display: inline-flex; align-items: center; margin-left: 2px; background-color: #f5f5f5; border-radius: 20px; box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); } .radio-group input[type='radio'] { display: none; } .radio-group label { position: relative; padding: 6px 16px; font-size: 14px; color: #bdbdbd; cursor: pointer; border-radius: 16px; transition: all 0.3s ease; user-select: none; z-index: 1; } .radio-group label:hover { color: #4285f4; } .label-key { width: 124px; text-align: left; margin-right: 10px; } .radio-group input[type='radio']:checked + label { color: #4285f4; } .radio-group::before { content: ''; position: absolute; top: 4px; left: 4px; width: calc(50% - 4px); height: calc(100% - 8px); border-radius: 16px; transition: all 0.3s ease; z-index: 0; } .radio-group input[type='radio']:nth-of-type(2):checked ~ .radio-group::before { transform: translateX(100%); } button { width: 100%; padding: 8px; margin-top: 8px; background-color: #4285f4; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; } button:hover { background-color: #3367d6; } .privacy-notice { margin: 2px 0 0 14px; padding: 10px; background-color: #f8f9fa; border-left: 3px solid #4285f4; font-size: 13px; } .privacy-link { color: #4285f4; text-decoration: none; display: inline-block; margin-top: 5px; } .privacy-link:hover { text-decoration: underline; } .consent-container { margin-top: 12px; padding: 10px; background-color: #fff8e1; border-radius: 4px; border: 2px dashed #ffe082; } .consent-container .checkbox-container { margin-bottom: 0; } .disabled-notice { color: #d32f2f; font-weight: bold; margin: 8px 0 0 44px; } .platforms-info { margin-top: 12px; padding: 4px 24px; background-color: #e8f0fe; border: 2px dashed #4285f4; border-radius: 8px; font-size: 12px; color: #1a73e8; font-weight: 500; } .platforms-info.unsupported { background-color: #fce8e6; border-color: #ea4335; color: #d93025; } .status-message { display: none; padding: 8px; text-align: center; color: #4CAF50; margin-top: 10px; font-weight: bold; background-color: #f1f8e9; border-radius: 4px; } `, "",{"version":3,"sources":["webpack://./src/shared/styles/common.css"],"names":[],"mappings":"AAAA;EACE,KAAK,yGAAyG,EAAE;EAChH,MAAM,4GAA4G,EAAE;EACpH,OAAO,yGAAyG,EAAE;AACpH;;AAEA;EACE,KAAK,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,wCAAwC,EAAE;EACvG,MAAM,UAAU,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,2CAA2C,EAAE;EAChH,MAAM,YAAY,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,0CAA0C,EAAE;EACjH,OAAO,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,wCAAwC,EAAE;AAC3G;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,WAAW;EACX,gBAAgB;EAChB,qFAAqF;EACrF,YAAY;EACZ,uBAAuB;EACvB,kBAAkB;EAClB,eAAe;EACf,eAAe;EACf,aAAa;EACb,8BAA8B;AAChC;;AAEA;EACE,qFAAqF;AACvF;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,QAAQ;EACR,2BAA2B;AAC7B;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,iDAAiD;AACnD;;AAEA;EACE,YAAY;EACZ,0BAA0B;EAC1B,mBAAmB;EACnB,iBAAiB;AACnB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,mBAAmB;EACnB,cAAc;EACd,kBAAkB;EAClB,0BAA0B;EAC1B,iCAAiC;EACjC,eAAe;AACjB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;EAClB,WAAW;EACX,YAAY;EACZ,eAAe;EACf,qBAAqB;AACvB;;AAEA;EACE,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,gBAAgB;EAChB,yBAAyB;EACzB,mBAAmB;EACnB,8CAA8C;AAChD;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,kBAAkB;EAClB,iBAAiB;EACjB,eAAe;EACf,cAAc;EACd,eAAe;EACf,mBAAmB;EACnB,yBAAyB;EACzB,iBAAiB;EACjB,UAAU;AACZ;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,YAAY;EACZ,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,sBAAsB;EACtB,wBAAwB;EACxB,mBAAmB;EACnB,yBAAyB;EACzB,UAAU;AACZ;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,eAAe;EACf,yBAAyB;EACzB,YAAY;EACZ,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,eAAe;AACjB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,oBAAoB;EACpB,aAAa;EACb,yBAAyB;EACzB,8BAA8B;EAC9B,eAAe;AACjB;;AAEA;EACE,cAAc;EACd,qBAAqB;EACrB,qBAAqB;EACrB,eAAe;AACjB;;AAEA;EACE,0BAA0B;AAC5B;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,yBAAyB;EACzB,kBAAkB;EAClB,0BAA0B;AAC5B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,cAAc;EACd,iBAAiB;EACjB,oBAAoB;AACtB;;AAEA;EACE,gBAAgB;EAChB,iBAAiB;EACjB,yBAAyB;EACzB,0BAA0B;EAC1B,kBAAkB;EAClB,eAAe;EACf,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,yBAAyB;EACzB,qBAAqB;EACrB,cAAc;AAChB;;AAEA;EACE,aAAa;EACb,YAAY;EACZ,kBAAkB;EAClB,cAAc;EACd,gBAAgB;EAChB,iBAAiB;EACjB,yBAAyB;EACzB,kBAAkB;AACpB","sourcesContent":["@keyframes glowing {\r\n 0% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); }\r\n 50% { box-shadow: 0 0 15px rgba(0, 255, 128, 1), 0 0 20px rgba(255, 7, 160, 0.9), 0 0 25px rgba(64, 128, 255, 0.8); }\r\n 100% { box-shadow: 0 0 5px rgba(0, 255, 128, 0.8), 0 0 10px rgba(0, 0, 0, 0.8), 0 0 15px rgba(64, 128, 255, 0.6); }\r\n}\r\n\r\n@keyframes flash-animation {\r\n 0% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); }\r\n 25% { opacity: 1; transform: scale(1.02); filter: brightness(1.5); background-color: rgba(255, 255, 255, 0.95); }\r\n 50% { opacity: 0.5; transform: scale(1.01); filter: brightness(1.2); background-color: rgba(255, 255, 255, 0.5); }\r\n 100% { opacity: 0; transform: scale(1); filter: brightness(1); background-color: rgba(255, 255, 255, 0); }\r\n}\r\n\r\n.ai-copy-button {\r\n width: auto;\r\n position: absolute;\r\n right: 10px;\r\n padding: 4px 8px;\r\n background: linear-gradient(135deg, rgba(25, 239, 192, 0.6), rgba(64, 128, 255, 0.4));\r\n color: white;\r\n border: 2px dashed #fff;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 16px;\r\n z-index: 1000;\r\n animation: glowing 2s infinite;\r\n}\r\n\r\n.ai-copy-button:hover {\r\n background: linear-gradient(135deg, rgba(25, 239, 192, 0.8), rgba(64, 128, 255, 0.6));\r\n}\r\n\r\n.ai-copy-button.top {\r\n top: 10px;\r\n}\r\n\r\n.ai-copy-button.middle {\r\n top: 50%;\r\n transform: translateY(-50%);\r\n}\r\n\r\n.ai-copy-button.bottom {\r\n bottom: 10px;\r\n}\r\n\r\nbody {\r\n font-family: system-ui, -apple-system, sans-serif;\r\n}\r\n\r\n.option-container {\r\n margin: 16px;\r\n border: 2px dashed #e0e0e0;\r\n border-radius: 12px;\r\n padding: 4px 16px;\r\n}\r\n\r\n.checkbox-container {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 12px;\r\n padding: 0 8px;\r\n border-radius: 8px;\r\n cursor: pointer !important;\r\n transition: background-color 0.2s;\r\n font-size: 14px;\r\n}\r\n\r\n.checkbox-container:hover {\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.checkbox-container input[type='checkbox'] {\r\n margin-right: 12px;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n accent-color: #4285f4;\r\n}\r\n\r\n.radio-group {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n margin-left: 2px;\r\n background-color: #f5f5f5;\r\n border-radius: 20px;\r\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.radio-group input[type='radio'] {\r\n display: none;\r\n}\r\n\r\n.radio-group label {\r\n position: relative;\r\n padding: 6px 16px;\r\n font-size: 14px;\r\n color: #bdbdbd;\r\n cursor: pointer;\r\n border-radius: 16px;\r\n transition: all 0.3s ease;\r\n user-select: none;\r\n z-index: 1;\r\n}\r\n\r\n.radio-group label:hover {\r\n color: #4285f4;\r\n}\r\n\r\n.label-key {\r\n width: 124px;\r\n text-align: left;\r\n margin-right: 10px;\r\n}\r\n\r\n.radio-group input[type='radio']:checked + label {\r\n color: #4285f4;\r\n}\r\n\r\n.radio-group::before {\r\n content: '';\r\n position: absolute;\r\n top: 4px;\r\n left: 4px;\r\n width: calc(50% - 4px);\r\n height: calc(100% - 8px);\r\n border-radius: 16px;\r\n transition: all 0.3s ease;\r\n z-index: 0;\r\n}\r\n\r\n.radio-group input[type='radio']:nth-of-type(2):checked ~ .radio-group::before {\r\n transform: translateX(100%);\r\n}\r\n\r\nbutton {\r\n width: 100%;\r\n padding: 8px;\r\n margin-top: 8px;\r\n background-color: #4285f4;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 16px;\r\n}\r\n\r\nbutton:hover {\r\n background-color: #3367d6;\r\n}\r\n\r\n.privacy-notice {\r\n margin: 2px 0 0 14px;\r\n padding: 10px;\r\n background-color: #f8f9fa;\r\n border-left: 3px solid #4285f4;\r\n font-size: 13px;\r\n}\r\n\r\n.privacy-link {\r\n color: #4285f4;\r\n text-decoration: none;\r\n display: inline-block;\r\n margin-top: 5px;\r\n}\r\n\r\n.privacy-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.consent-container {\r\n margin-top: 12px;\r\n padding: 10px;\r\n background-color: #fff8e1;\r\n border-radius: 4px;\r\n border: 2px dashed #ffe082;\r\n}\r\n\r\n.consent-container .checkbox-container {\r\n margin-bottom: 0;\r\n}\r\n\r\n.disabled-notice {\r\n color: #d32f2f;\r\n font-weight: bold;\r\n margin: 8px 0 0 44px;\r\n}\r\n\r\n.platforms-info {\r\n margin-top: 12px;\r\n padding: 4px 24px;\r\n background-color: #e8f0fe;\r\n border: 2px dashed #4285f4;\r\n border-radius: 8px;\r\n font-size: 12px;\r\n color: #1a73e8;\r\n font-weight: 500;\r\n}\r\n\r\n.platforms-info.unsupported {\r\n background-color: #fce8e6;\r\n border-color: #ea4335;\r\n color: #d93025;\r\n}\r\n\r\n.status-message {\r\n display: none;\r\n padding: 8px;\r\n text-align: center;\r\n color: #4CAF50;\r\n margin-top: 10px;\r\n font-weight: bold;\r\n background-color: #f1f8e9;\r\n border-radius: 4px;\r\n} "],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./src/shared/styles/tampermonkey.css": /*!********************************************!*\ !*** ./src/shared/styles/tampermonkey.css ***! \********************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/sourceMaps.js"); /* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/api.js */ "./node_modules/.pnpm/css-loader@7.1.2_webpack@5.99.0/node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_pnpm_css_loader_7_1_2_webpack_5_99_0_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, `.tm-settings-panel { position: fixed; right: 20px; bottom: 20px; z-index: 10000; } .tm-settings-icon { width: 40px; height: 40px; background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6)); border-radius: 50%; display: flex; justify-content: center; align-items: center; cursor: pointer; margin-left: auto; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); animation: glowing 2s infinite; font-size: 20px; } .tm-fixed-settings-button { position: fixed; right: 20px; width: 40px; height: 40px; background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6)); border-radius: 50%; display: flex; justify-content: center; align-items: center; cursor: move; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); animation: glowing 2s infinite; font-size: 20px; z-index: 10000; user-select: none; transition: transform 0.2s ease; } .tm-fixed-settings-button:hover { transform: scale(1.1); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); } .tm-fixed-settings-button:active { transform: scale(0.95); } .tm-settings-content { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; border-radius: 8px; padding: 20px; width: 400px; max-width: 80vw; max-height: 80vh; overflow-y: auto; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); z-index: 10001; display: none; } .tm-settings-title { font-size: 20px; font-weight: bold; margin-bottom: 16px; color: #333; text-align: center; } .option-container { margin-bottom: 16px; border: 2px dashed #e0e0e0; border-radius: 12px; padding: 4px 16px; } .checkbox-container { display: flex; align-items: center; margin-bottom: 12px; padding: 0 8px; border-radius: 8px; cursor: pointer !important; transition: background-color 0.2s; font-size: 14px; } .checkbox-container:hover { background-color: #f5f5f5; } .checkbox-container input[type='checkbox'] { margin-right: 12px; width: 20px; height: 20px; cursor: pointer; accent-color: #4285f4; } .radio-group { position: relative; display: inline-flex; align-items: center; margin-left: 2px; background-color: #f5f5f5; border-radius: 20px; box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); } .radio-group input[type='radio'] { display: none; } .radio-group label { position: relative; padding: 6px 16px; font-size: 14px; color: #bdbdbd; cursor: pointer; border-radius: 16px; transition: all 0.3s ease; user-select: none; z-index: 1; } .radio-group label:hover { color: #4285f4; } .label-key { width: 124px; text-align: left; margin-right: 10px; } .radio-group input[type='radio']:checked + label { color: #4285f4; } .consent-container { margin-top: 12px; padding: 10px; background-color: #fff8e1; border-radius: 4px; border: 2px dashed #ffe082; } .consent-container .checkbox-container { margin-bottom: 0; } .disabled-notice { color: #d32f2f; font-weight: bold; margin: 8px 0 0 44px; font-size: 12px; } .privacy-notice { margin: 2px 0 0 14px; padding: 10px; background-color: #f8f9fa; border-left: 3px solid #4285f4; font-size: 13px; } .privacy-link { color: #4285f4; text-decoration: none; display: inline-block; margin-top: 5px; } .privacy-link:hover { text-decoration: underline; } .platforms-info { margin-top: 12px; padding: 4px 24px; background-color: #e8f0fe; border: 2px dashed #4285f4; border-radius: 8px; font-size: 12px; color: #1a73e8; font-weight: 500; } .platforms-info.unsupported { background-color: #fce8e6; border-color: #ea4335; color: #d93025; } button { width: 100%; padding: 8px; margin-top: 8px; background-color: #4285f4; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; } button:hover { background-color: #3367d6; } .status-message { display: none; padding: 8px; text-align: center; color: #4CAF50; margin-top: 10px; font-weight: bold; background-color: #f1f8e9; border-radius: 4px; } /* 设置按钮样式 - 已不再使用,但保留以便未来可能的扩展 */ .ai-settings-button { position: absolute; padding: 4px 8px; background: linear-gradient(135deg, rgba(64, 128, 255, 0.6), rgba(25, 239, 192, 0.4)); color: white; border: 2px dashed #fff; border-radius: 4px; cursor: pointer; font-size: 16px; z-index: 1000; animation: glowing 2s infinite; } .ai-settings-button:hover { background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6)); } `, "",{"version":3,"sources":["webpack://./src/shared/styles/tampermonkey.css"],"names":[],"mappings":"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","sourcesContent":[".tm-settings-panel {\r\n position: fixed;\r\n right: 20px;\r\n bottom: 20px;\r\n z-index: 10000;\r\n}\r\n\r\n.tm-settings-icon {\r\n width: 40px;\r\n height: 40px;\r\n background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));\r\n border-radius: 50%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: pointer;\r\n margin-left: auto;\r\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\r\n animation: glowing 2s infinite;\r\n font-size: 20px;\r\n}\r\n\r\n.tm-fixed-settings-button {\r\n position: fixed;\r\n right: 20px;\r\n width: 40px;\r\n height: 40px;\r\n background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));\r\n border-radius: 50%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: move;\r\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\r\n animation: glowing 2s infinite;\r\n font-size: 20px;\r\n z-index: 10000;\r\n user-select: none;\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.tm-fixed-settings-button:hover {\r\n transform: scale(1.1);\r\n box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.tm-fixed-settings-button:active {\r\n transform: scale(0.95);\r\n}\r\n\r\n.tm-settings-content {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n background: white;\r\n border-radius: 8px;\r\n padding: 20px;\r\n width: 400px;\r\n max-width: 80vw;\r\n max-height: 80vh;\r\n overflow-y: auto;\r\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);\r\n z-index: 10001;\r\n display: none;\r\n}\r\n\r\n.tm-settings-title {\r\n font-size: 20px;\r\n font-weight: bold;\r\n margin-bottom: 16px;\r\n color: #333;\r\n text-align: center;\r\n}\r\n\r\n.option-container {\r\n margin-bottom: 16px;\r\n border: 2px dashed #e0e0e0;\r\n border-radius: 12px;\r\n padding: 4px 16px;\r\n}\r\n\r\n.checkbox-container {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 12px;\r\n padding: 0 8px;\r\n border-radius: 8px;\r\n cursor: pointer !important;\r\n transition: background-color 0.2s;\r\n font-size: 14px;\r\n}\r\n\r\n.checkbox-container:hover {\r\n background-color: #f5f5f5;\r\n}\r\n\r\n.checkbox-container input[type='checkbox'] {\r\n margin-right: 12px;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n accent-color: #4285f4;\r\n}\r\n\r\n.radio-group {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n margin-left: 2px;\r\n background-color: #f5f5f5;\r\n border-radius: 20px;\r\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.radio-group input[type='radio'] {\r\n display: none;\r\n}\r\n\r\n.radio-group label {\r\n position: relative;\r\n padding: 6px 16px;\r\n font-size: 14px;\r\n color: #bdbdbd;\r\n cursor: pointer;\r\n border-radius: 16px;\r\n transition: all 0.3s ease;\r\n user-select: none;\r\n z-index: 1;\r\n}\r\n\r\n.radio-group label:hover {\r\n color: #4285f4;\r\n}\r\n\r\n.label-key {\r\n width: 124px;\r\n text-align: left;\r\n margin-right: 10px;\r\n}\r\n\r\n.radio-group input[type='radio']:checked + label {\r\n color: #4285f4;\r\n}\r\n\r\n.consent-container {\r\n margin-top: 12px;\r\n padding: 10px;\r\n background-color: #fff8e1;\r\n border-radius: 4px;\r\n border: 2px dashed #ffe082;\r\n}\r\n\r\n.consent-container .checkbox-container {\r\n margin-bottom: 0;\r\n}\r\n\r\n.disabled-notice {\r\n color: #d32f2f;\r\n font-weight: bold;\r\n margin: 8px 0 0 44px;\r\n font-size: 12px;\r\n}\r\n\r\n.privacy-notice {\r\n margin: 2px 0 0 14px;\r\n padding: 10px;\r\n background-color: #f8f9fa;\r\n border-left: 3px solid #4285f4;\r\n font-size: 13px;\r\n}\r\n\r\n.privacy-link {\r\n color: #4285f4;\r\n text-decoration: none;\r\n display: inline-block;\r\n margin-top: 5px;\r\n}\r\n\r\n.privacy-link:hover {\r\n text-decoration: underline;\r\n}\r\n\r\n.platforms-info {\r\n margin-top: 12px;\r\n padding: 4px 24px;\r\n background-color: #e8f0fe;\r\n border: 2px dashed #4285f4;\r\n border-radius: 8px;\r\n font-size: 12px;\r\n color: #1a73e8;\r\n font-weight: 500;\r\n}\r\n\r\n.platforms-info.unsupported {\r\n background-color: #fce8e6;\r\n border-color: #ea4335;\r\n color: #d93025;\r\n}\r\n\r\nbutton {\r\n width: 100%;\r\n padding: 8px;\r\n margin-top: 8px;\r\n background-color: #4285f4;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 16px;\r\n}\r\n\r\nbutton:hover {\r\n background-color: #3367d6;\r\n}\r\n\r\n.status-message {\r\n display: none;\r\n padding: 8px;\r\n text-align: center;\r\n color: #4CAF50;\r\n margin-top: 10px;\r\n font-weight: bold;\r\n background-color: #f1f8e9;\r\n border-radius: 4px;\r\n}\r\n\r\n/* 设置按钮样式 - 已不再使用,但保留以便未来可能的扩展 */\r\n.ai-settings-button {\r\n position: absolute;\r\n padding: 4px 8px;\r\n background: linear-gradient(135deg, rgba(64, 128, 255, 0.6), rgba(25, 239, 192, 0.4));\r\n color: white;\r\n border: 2px dashed #fff;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 16px;\r\n z-index: 1000;\r\n animation: glowing 2s infinite;\r\n}\r\n\r\n.ai-settings-button:hover {\r\n background: linear-gradient(135deg, rgba(64, 128, 255, 0.8), rgba(25, 239, 192, 0.6));\r\n} "],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ "./src/shared/templates.ts": /*!*********************************!*\ !*** ./src/shared/templates.ts ***! \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createSettingsPanelHTML: () => (/* binding */ createSettingsPanelHTML) /* harmony export */ }); // 生成设置面板的HTML内容,为Chrome扩展和油猴脚本提供统一UI function createSettingsPanelHTML(config, options = {}) { const { prefix = '', title = 'AI助手智能复制工具-设置', includePrivacyLink = true, privacyLinkUrl = 'privacy.html' } = options; // 为ID添加前缀以避免冲突 const ids = { enableCopy: `${prefix}enableCopy`, formatMarkdown: `${prefix}formatMarkdown`, formatHtml: `${prefix}formatHtml`, removeReferences: `${prefix}removeReferences`, userConsent: `${prefix}user-consent`, consentStatus: `${prefix}consent-status`, saveButton: `${prefix}saveButton`, status: `${prefix}status` }; return `

${title}

支持平台:百度-AI搜索、字节-豆包、腾讯-元宝
无须支持平台:百度-文心一言、阿里-通义千问
`; } /***/ }), /***/ "./src/shared/types.ts": /*!*****************************!*\ !*** ./src/shared/types.ts ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DEFAULT_CONFIG: () => (/* binding */ DEFAULT_CONFIG), /* harmony export */ PLATFORMS: () => (/* binding */ PLATFORMS) /* harmony export */ }); // 共享类型定义 // 导出默认配置 const DEFAULT_CONFIG = { removeReferences: true, // 默认去除参考文献角标 userConsent: true, // 默认获得用户同意 copyFormat: 'markdown', enableCopy: true // 默认启用复制功能 }; // 支持的AI平台配置 const PLATFORMS = [ { name: '百度-AI搜索', selector: '[class*="cosd-markdown-content"]', markdownContentClass: 'marklang', removeSelectorList: ['span[disable-audio="true"][disable-copy="true"]', '.cosd-markdown-code-copy.cos-link'] }, { name: '字节-豆包', selector: '[class*="receive-message-box-content-"]', markdownContentClass: 'flow-markdown-body', removeSelectorList: ['.ref_content_circle', '.code-area [class*="header-"]', '[class*="canvas_wrapper-"]'] }, { name: '腾讯-元宝', selector: '[class*="hyc-content-md"]', markdownContentClass: 'hyc-common-markdown', removeSelectorList: ['.hyc-common-markdown__ref-list'] } ]; /***/ }), /***/ "./src/shared/ui.ts": /*!**************************!*\ !*** ./src/shared/ui.ts ***! \**************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ createTampermonkeySettingsHTML: () => (/* binding */ createTampermonkeySettingsHTML), /* harmony export */ createTampermonkeySettingsPanel: () => (/* binding */ createTampermonkeySettingsPanel), /* harmony export */ removeAllCopyButtons: () => (/* binding */ removeAllCopyButtons), /* harmony export */ showStatusMessage: () => (/* binding */ showStatusMessage) /* harmony export */ }); /* harmony import */ var _templates__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./templates */ "./src/shared/templates.ts"); // 创建油猴设置面板的HTML内容 function createTampermonkeySettingsHTML(config) { return (0,_templates__WEBPACK_IMPORTED_MODULE_0__.createSettingsPanelHTML)(config, { prefix: 'tm-', includePrivacyLink: false // 油猴脚本中不包含隐私链接 }); } // 创建油猴设置面板 function createTampermonkeySettingsPanel(config, updateConfigCallback) { // 创建主容器 const panelWrapper = document.createElement('div'); panelWrapper.className = 'tm-settings-panel'; // 创建设置图标 const settingsIcon = document.createElement('div'); settingsIcon.textContent = '⚙️'; settingsIcon.className = 'tm-settings-icon'; // 创建设置面板内容 const settingsPanel = document.createElement('div'); settingsPanel.className = 'tm-settings-content'; settingsPanel.innerHTML = createTampermonkeySettingsHTML(config); // 点击图标显示/隐藏设置面板 settingsIcon.addEventListener('click', () => { settingsPanel.style.display = settingsPanel.style.display === 'none' ? 'block' : 'none'; }); // 点击页面其他位置隐藏设置面板 document.addEventListener('click', (e) => { const target = e.target; if (!panelWrapper.contains(target)) { settingsPanel.style.display = 'none'; } }); // 绑定设置变更事件 settingsPanel.addEventListener('change', (e) => { const target = e.target; const newConfig = {}; if (target.id === 'tm-remove-references') { newConfig.removeReferences = target.checked; } else if (target.id === 'tm-enableCopy') { newConfig.enableCopy = target.checked; } else if (target.id === 'tm-user-consent') { newConfig.userConsent = target.checked; const consentStatus = document.getElementById('tm-consent-status'); if (consentStatus) { consentStatus.style.display = target.checked ? 'none' : 'block'; } } else if (target.name === 'tm-copyFormat') { newConfig.copyFormat = target.value; } updateConfigCallback(newConfig); }); // 保存按钮事件 const saveButton = settingsPanel.querySelector('#tm-saveButton'); if (saveButton) { saveButton.addEventListener('click', () => { const statusElement = document.getElementById('tm-status'); if (statusElement) { statusElement.textContent = '设置已保存'; statusElement.style.display = 'block'; // 2秒后隐藏提示 setTimeout(() => { statusElement.style.display = 'none'; }, 2000); } }); } // 添加到DOM panelWrapper.appendChild(settingsIcon); panelWrapper.appendChild(settingsPanel); return panelWrapper; } // 移除所有复制按钮 function removeAllCopyButtons() { const copyButtons = document.querySelectorAll('.ai-copy-button'); copyButtons.forEach(button => button.remove()); } // 显示临时状态消息 function showStatusMessage(element, message, options = {}) { const { duration = 2000, textColor = '#4CAF50', bgColor = '#f1f8e9' } = options; // 保存原始样式 const originalDisplay = element.style.display; const originalText = element.textContent; const originalColor = element.style.color; const originalBgColor = element.style.backgroundColor; // 设置新样式并显示 element.textContent = message; element.style.color = textColor; element.style.backgroundColor = bgColor; element.style.display = 'block'; // 在指定时间后恢复 setTimeout(() => { element.style.display = originalDisplay; element.textContent = originalText; element.style.color = originalColor; element.style.backgroundColor = originalBgColor; }, duration); } /***/ }), /***/ "turndown": /*!**********************************!*\ !*** external "TurndownService" ***! \**********************************/ /***/ ((module) => { module.exports = TurndownService; /***/ }), /***/ "turndown-plugin-gfm": /*!************************************!*\ !*** external "turndownPluginGfm" ***! \************************************/ /***/ ((module) => { module.exports = turndownPluginGfm; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. (() => { /*!***********************************!*\ !*** ./src/tampermonkey/index.ts ***! \***********************************/ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _shared_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shared/types */ "./src/shared/types.ts"); /* harmony import */ var _shared_copy__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../shared/copy */ "./src/shared/copy.ts"); /* harmony import */ var _shared_ui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../shared/ui */ "./src/shared/ui.ts"); /* harmony import */ var _shared_templates__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../shared/templates */ "./src/shared/templates.ts"); /* harmony import */ var _shared_styles_common_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../shared/styles/common.css */ "./src/shared/styles/common.css"); /* harmony import */ var _shared_styles_tampermonkey_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../shared/styles/tampermonkey.css */ "./src/shared/styles/tampermonkey.css"); // ==UserScript== // @name AI助手复制工具 // @namespace http://tampermonkey.net/ // @version 1.0.0 // @description 为AI助手平台(通义千问、文心一言、豆包、元宝、百度)添加复制按钮,整理markdown文本并去除参考文献角标 // @author AI助手复制工具 // @match *://*.baidu.com/* // @match *://*.doubao.com/* // @match *://*.tencent.com/* // @grant GM_addStyle // @grant GM_setClipboard // @grant GM_getValue // @grant GM_setValue // @require https://cdn.jsdelivr.net/npm/turndown@7.1.2/dist/turndown.js // @require https://cdn.jsdelivr.net/npm/turndown-plugin-gfm@1.0.2/dist/turndown-plugin-gfm.js // @downloadURL https://update.greasyfork.icu/scripts/534533/AI%E5%8A%A9%E6%89%8B%E5%A4%8D%E5%88%B6%E5%B7%A5%E5%85%B7.user.js // @updateURL https://update.greasyfork.icu/scripts/534533/AI%E5%8A%A9%E6%89%8B%E5%A4%8D%E5%88%B6%E5%B7%A5%E5%85%B7.meta.js // ==/UserScript== (function () { 'use strict'; // 添加样式 GM_addStyle(_shared_styles_common_css__WEBPACK_IMPORTED_MODULE_4__["default"]); GM_addStyle(_shared_styles_tampermonkey_css__WEBPACK_IMPORTED_MODULE_5__["default"]); // 添加动画样式 document.head.appendChild((0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.createGlowingAnimationStyle)()); // 配置 const config = { removeReferences: GM_getValue('removeReferences', _shared_types__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CONFIG.removeReferences), userConsent: GM_getValue('userConsent', _shared_types__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CONFIG.userConsent), copyFormat: GM_getValue('copyFormat', _shared_types__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CONFIG.copyFormat), enableCopy: GM_getValue('enableCopy', _shared_types__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_CONFIG.enableCopy) }; // 复制到剪贴板函数 - 油猴脚本版本 async function copyToClipboard(text) { GM_setClipboard(text); } // 更新配置方法 function updateConfig(newConfig) { Object.assign(config, newConfig); // 保存到GM存储 GM_setValue('removeReferences', config.removeReferences); GM_setValue('userConsent', config.userConsent); GM_setValue('copyFormat', config.copyFormat); GM_setValue('enableCopy', config.enableCopy); // 检查是否有用户同意 const shouldApplyButtons = config.enableCopy && config.userConsent; if (shouldApplyButtons) { // 重新应用复制按钮 (0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.applyToPlatforms)(_shared_types__WEBPACK_IMPORTED_MODULE_0__.PLATFORMS, config, turndownService, copyToClipboard); } else { // 如果用户不同意或禁用复制,移除所有复制按钮 (0,_shared_ui__WEBPACK_IMPORTED_MODULE_2__.removeAllCopyButtons)(); } } // 初始化 Turndown 服务 const turndownService = (0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.initTurndownService)(); // 创建MutationObserver实例 let observer = null; // 设置面板实例 let settingsPanel = null; // 设置面板位置状态 const panelPosition = { top: GM_getValue('settingsPanelTop', 300), isDragging: false, dragStartY: 0, dragStartTop: 0, isPanelOpen: false, wasDragged: false }; // 创建油猴设置面板的HTML内容 function createTampermonkeySettingsHTML(config) { return (0,_shared_templates__WEBPACK_IMPORTED_MODULE_3__.createSettingsPanelHTML)(config, { prefix: 'tm-', includePrivacyLink: false // 油猴脚本中不包含隐私链接 }); } // 创建油猴设置面板 function createTampermonkeySettingsPanel() { // 创建设置面板内容 const settingsContent = document.createElement('div'); settingsContent.className = 'tm-settings-content'; settingsContent.innerHTML = createTampermonkeySettingsHTML(config); // 添加关闭按钮 const closeButton = document.createElement('div'); closeButton.className = 'tm-settings-close'; closeButton.innerHTML = '×'; closeButton.style.position = 'absolute'; closeButton.style.top = '10px'; closeButton.style.right = '15px'; closeButton.style.fontSize = '24px'; closeButton.style.fontWeight = 'bold'; closeButton.style.cursor = 'pointer'; closeButton.style.color = '#999'; closeButton.title = '关闭'; // 定义关闭面板的函数 const closePanel = () => { settingsContent.style.display = 'none'; panelPosition.isPanelOpen = false; }; // 关闭按钮点击事件 closeButton.addEventListener('click', closePanel); // 绑定设置变更事件 settingsContent.addEventListener('change', (e) => { const target = e.target; const newConfig = {}; if (target.id === 'tm-removeReferences') { newConfig.removeReferences = target.checked; } else if (target.id === 'tm-enableCopy') { newConfig.enableCopy = target.checked; } else if (target.id === 'tm-user-consent') { newConfig.userConsent = target.checked; const consentStatus = document.getElementById('tm-consent-status'); if (consentStatus) { consentStatus.style.display = target.checked ? 'none' : 'block'; } } else if (target.name === 'tm-copyFormat') { newConfig.copyFormat = target.value; } updateConfig(newConfig); }); // 保存按钮事件 const saveButton = settingsContent.querySelector('#tm-saveButton'); if (saveButton) { saveButton.addEventListener('click', () => { const statusElement = document.getElementById('tm-status'); if (statusElement) { (0,_shared_ui__WEBPACK_IMPORTED_MODULE_2__.showStatusMessage)(statusElement, '设置已保存'); } // 保存后关闭设置面板 setTimeout(() => { closePanel(); }, 1500); }); } // 添加关闭按钮到面板内容 settingsContent.appendChild(closeButton); return settingsContent; } // 创建单个设置按钮 function createFixedSettingsButton() { const button = document.createElement('div'); button.className = 'tm-fixed-settings-button'; button.innerHTML = '⚙️'; button.title = '设置'; button.style.top = `${panelPosition.top}px`; button.style.position = 'fixed'; button.style.right = '0'; button.style.width = '30px'; button.style.fontSize = '20px'; button.style.textAlign = 'right'; button.style.lineHeight = '30px'; button.style.borderTopLeftRadius = '34px'; button.style.borderBottomLeftRadius = '34px'; button.style.cursor = 'pointer'; button.style.background = 'linear-gradient(135deg, rgba(25, 239, 192, 0.6), rgba(64, 128, 255, 0.4))'; // 添加点击事件,打开设置面板 button.addEventListener('click', (e) => { e.stopPropagation(); // 防止冒泡到document // 如果刚刚拖动过,不触发打开面板 if (panelPosition.wasDragged) { panelPosition.wasDragged = false; return; } openSettingsPanel(); }); // 添加拖动功能 button.addEventListener('mousedown', (e) => { // 仅响应鼠标左键 if (e.button !== 0) return; // 如果面板已打开,不允许拖动按钮 if (panelPosition.isPanelOpen) { e.stopPropagation(); return; } panelPosition.isDragging = true; panelPosition.wasDragged = false; // 重置拖动状态 panelPosition.dragStartY = e.clientY; panelPosition.dragStartTop = panelPosition.top; e.preventDefault(); // 防止文本选择 // 添加临时全局鼠标事件监听器 document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); }); return button; } // 处理鼠标移动事件 function handleMouseMove(e) { if (!panelPosition.isDragging) return; const button = document.querySelector('.tm-fixed-settings-button'); if (!button) return; // 计算新位置 const deltaY = e.clientY - panelPosition.dragStartY; // 如果移动距离大于5像素,标记为已拖动 if (Math.abs(deltaY) > 5) { panelPosition.wasDragged = true; } const newTop = Math.max(10, panelPosition.dragStartTop + deltaY); const maxTop = window.innerHeight - 50; // 防止按钮被拖到屏幕外 panelPosition.top = Math.min(newTop, maxTop); button.style.top = `${panelPosition.top}px`; // 如果面板是打开的,同时更新面板位置 if (panelPosition.isPanelOpen && settingsPanel) { const settingsContent = settingsPanel.querySelector('.tm-settings-content'); if (settingsContent) { adjustPanelPosition(settingsContent); } } } // 处理鼠标松开事件 function handleMouseUp(e) { if (!panelPosition.isDragging) return; panelPosition.isDragging = false; // 保存新位置到GM存储 GM_setValue('settingsPanelTop', panelPosition.top); // 移除临时事件监听器 document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); // 阻止事件冒泡,防止触发click事件 e.preventDefault(); e.stopPropagation(); } // 调整面板位置,确保在屏幕内 function adjustPanelPosition(panel) { const button = document.querySelector('.tm-fixed-settings-button'); if (!button || !panel) return; const buttonRect = button.getBoundingClientRect(); const panelRect = panel.getBoundingClientRect(); // 设置面板固定定位 panel.style.position = 'fixed'; // 水平位置:从按钮左侧开始,向左展开 panel.style.right = `${buttonRect.width}px`; panel.style.background = '#fff'; panel.style.padding = '20px'; panel.style.width = '500px'; panel.style.border = '2px dashed rgb(186 186 186)'; panel.style.borderRadius = '10px'; panel.style.zIndex = '999'; // 计算垂直位置 const buttonTop = buttonRect.top; const windowHeight = window.innerHeight; const panelHeight = panelRect.height; // 自动调整,优先在按钮下方显示 if (buttonTop + panelHeight < windowHeight) { // 如果面板在按钮下方能完全显示 panel.style.top = `${buttonTop}px`; panel.style.bottom = 'auto'; } else if (buttonTop - panelHeight > 0) { // 如果面板在按钮上方能完全显示 panel.style.bottom = `${windowHeight - buttonTop}px`; panel.style.top = 'auto'; } else { // 都显示不全,尽量适应屏幕 if (buttonTop < windowHeight / 2) { // 按钮在屏幕上半部分,面板放在下方 panel.style.top = `${buttonTop}px`; panel.style.bottom = 'auto'; panel.style.maxHeight = `${windowHeight - buttonTop - 20}px`; panel.style.overflowY = 'auto'; } else { // 按钮在屏幕下半部分,面板放在上方 panel.style.bottom = `${windowHeight - buttonTop}px`; panel.style.top = 'auto'; panel.style.maxHeight = `${buttonTop - 20}px`; panel.style.overflowY = 'auto'; } } } // 打开设置面板的方法 function openSettingsPanel() { // 如果设置面板不存在,则创建 if (!settingsPanel) { settingsPanel = createTampermonkeySettingsPanel(); document.body.appendChild(settingsPanel); // 添加点击外部区域关闭面板 document.addEventListener('click', (e) => { if (panelPosition.isPanelOpen && settingsPanel) { const button = document.querySelector('.tm-fixed-settings-button'); // 检查点击是否在面板或按钮外部 if (!settingsPanel.contains(e.target) && !button.contains(e.target)) { settingsPanel.style.display = 'none'; panelPosition.isPanelOpen = false; } } }); } // 显示设置面板 if (settingsPanel) { settingsPanel.style.display = 'block'; panelPosition.isPanelOpen = true; // 调整面板位置 adjustPanelPosition(settingsPanel); } } // 初始化 function init() { console.log('AI助手复制工具已加载'); // 添加固定设置按钮 const fixedSettingsButton = createFixedSettingsButton(); document.body.appendChild(fixedSettingsButton); // 检查是否有用户同意 const shouldApplyButtons = config.enableCopy && config.userConsent; if (shouldApplyButtons) { // 应用复制按钮 (0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.applyToPlatforms)(_shared_types__WEBPACK_IMPORTED_MODULE_0__.PLATFORMS, config, turndownService, copyToClipboard); // 启动观察器 observer = (0,_shared_copy__WEBPACK_IMPORTED_MODULE_1__.observeDOMChanges)(_shared_types__WEBPACK_IMPORTED_MODULE_0__.PLATFORMS, config, turndownService, copyToClipboard); } } // 页面加载完成后执行初始化操作 if (document.readyState === 'complete' || document.readyState === 'interactive') { init(); } else { document.addEventListener('DOMContentLoaded', init); } })(); })(); /******/ })() ; //# sourceMappingURL=ai-assistant-copy-tool.js.map