// ==UserScript== // @name DeepSeek折叠魔法棒 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 折叠DeepSeek聊天界面,包括侧边栏宽度调整、用户对话字体大小切换、深度思考文本折叠、代码块折叠及底部输入框高度扩展 // @author beibeibeibei // @license MIT // @match https://chat.deepseek.com/* // @grant GM_addStyle // ==/UserScript== (function() { 'use strict'; // 尝试获取元素的函数 function getElementAsync(selector, delay = 100) { return new Promise((resolve) => { const interval = setInterval(() => { const element = document.querySelector(selector); if (element) { clearInterval(interval); resolve(element); } }, delay); }); } function main() { const css = ` #beibeibeibei-magic-size-control-panel { .toggleBtn { cursor: pointer; } } .beibeibeibei-magic-size-control-panel--magic-icon { display: none; pointer-events: none; position: fixed; top: 0; left: 0; will-change: transform; filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.2)); z-index: 2000; width: fit-content; transition: 0.5s; } .beibeibeibei-sidebar--widened { width: 400px; max-width: 400px; left: 0; } .beibeibeibei-userchat-font--small { font-size: 12px; line-height: 12px; } .beibeibeibei-deep-think-texts--fold { height: 50px; overflow: hidden; &::after { content: ""; position: absolute; bottom: 0; left: 0; right: 0; height: 20px; background: linear-gradient(to bottom, rgba(24, 26, 27, 0), rgba(24, 26, 27, 1)); pointer-events: none; } } .beibeibeibei-textarea--expanded { max-height: calc(85vh - 100px) !important; height: calc(85vh - 100px) !important; } .beibeibeibei-pre--fold { height: 50px; } /*用户对话二次修改时的输入框的最大高度*/ .ds-textarea { max-height: calc(75vh - 100px) !important; } `; GM_addStyle(css); const setTimeout_delay = 50; setTimeout(() => { // 找到侧边栏 // const sidebar = document.querySelector("#root > div > div > div > div > div"); // 侧边栏中的footer(总是选不到, 用getElementAsync异步选择) // const sidebar_footer = document.querySelector("#root > div > div > div > div > div > div:last-child"); getElementAsync("#root > div > div > div > div > div > div:last-child").then((sidebar_footer) => { const sidebar = document.querySelector("#root > div > div > div > div > div"); // 向侧边栏footer添加一个控制台 const controlPanel = document.createElement('div'); controlPanel.id = "beibeibeibei-magic-size-control-panel"; controlPanel.innerHTML = `
`; controlPanel.setAttribute("style", "width: 100%;padding: 9px 12px;margin-bottom: 8px;border: 1px solid white;box-sizing: border-box;border-radius: 12px;display: flex;align-items: center;"); sidebar_footer.insertBefore(controlPanel, sidebar_footer.children[0]); // 向body添加悬浮图标 const magicIcon = document.createElement('div'); magicIcon.className = "beibeibeibei-magic-size-control-panel--magic-icon"; magicIcon.innerHTML = ` `; document.body.append(magicIcon); const toggleBtn = document.querySelector('#beibeibeibei-magic-size-control-panel .toggleBtn'); let isFollowing = false; // 按钮点击事件 toggleBtn.addEventListener('click', (e) => { isFollowing = !isFollowing; e.target.textContent = isFollowing ? '停用魔法棒' : '使用魔法棒'; magicIcon.style.display = isFollowing ? 'block' : 'none'; document[isFollowing ? 'addEventListener' : 'removeEventListener']('mousemove', followMouse); if (isFollowing) {followMouse(e)}; /*主动触发一次跟随*/ }); // 鼠标跟随函数 function followMouse(e) { requestAnimationFrame(() => { magicIcon.style.transform = `translate( ${e.clientX + 20}px, ${e.clientY}px )`; }); } // 侧边栏点击事件 document.addEventListener('click', (event) => { // console.log(event.target); // 点到了按钮自己 if (event.target === toggleBtn) { return; } else if (isFollowing) { // 点到了侧边栏 if (sidebar.contains(event.target)) { const excludeSelectors = ".ds-icon-button:has(rect[id*='边栏']), rect[id*='边栏'], #root > div > div > div > div > div > div.scrollable > div > div > div > div[tabindex='0'], #root > div > div > div > div > div > div.scrollable > div > div > div > div[tabindex='0'] svg"; if (!Array.from(document.querySelectorAll(excludeSelectors)).includes(event.target)) { /*排除侧边栏的折叠按钮, 排除会话名字旁边的更多按钮*/ sidebar.classList.toggle('beibeibeibei-sidebar--widened'); } return; } // 点到了用户对话 const user_chats = document.querySelectorAll("#root > div > div > div > div:nth-child(3) > div > div:nth-child(2) > div.scrollable > div > div:nth-child(1) > div:nth-child(odd)"); for (const c of user_chats) { if (c.contains(event.target)) { if (!event.target.classList.contains("ds-textarea__textarea")) { /* 排除用户正在修改已发出的对话时的输入框 */ event.target.classList.toggle('beibeibeibei-userchat-font--small'); } return; } } // 点到了deepseek的深度思考文本 const deep_think_texts = document.querySelectorAll("#root > div > div > div > div:nth-child(3) > div > div:nth-child(2) > div.scrollable > div > div:nth-child(1) > div:nth-child(even) > div:nth-child(2) > div:nth-child(2)"); for (const t of deep_think_texts) { if (t.contains(event.target)) { if (event.target.tagName === "P") { event.target.parentElement.classList.toggle('beibeibeibei-deep-think-texts--fold'); } else { event.target.classList.toggle('beibeibeibei-deep-think-texts--fold'); } return; } } // 点到了底部textarea const chat_input = document.querySelector("#chat-input"); if (event.target === chat_input) { chat_input.parentElement.classList.toggle('beibeibeibei-textarea--expanded'); return; } // 点到了pre代码区 if (event.target.tagName === "PRE") { event.target.classList.toggle('beibeibeibei-pre--fold'); return; } // 点到了pre的上一个兄弟节点 const code_block_banners = document.querySelectorAll("div:has(+pre)"); for (const t of code_block_banners) { if (t.contains(event.target)) { t.nextElementSibling.classList.toggle('beibeibeibei-pre--fold'); return; } } // 点到了pre内部 if (event.target.closest("pre") !== null) { event.target.closest("pre").classList.toggle('beibeibeibei-pre--fold'); return; } } }); }); }, setTimeout_delay); } function runWhenDocumentReady(...funcs) { const validFuncs = [...new Set(funcs)].filter(item => typeof item === 'function'); if (document.readyState === 'loading') { validFuncs.forEach(func => document.addEventListener('DOMContentLoaded', func) ); } else { validFuncs.forEach(func => func()); } } // DOM加载完成后运行这些func runWhenDocumentReady(main); })();