// ==UserScript== // @name DeepSeek Conversation Search [DSCS] // @namespace http://tampermonkey.net/ // @version 1.2 // @description Adds icon to the sidebar that opens a modal with chat search functionality // @author Dramorian // @match https://chat.deepseek.com/* // @grant GM_addStyle // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/525223/DeepSeek%20Conversation%20Search%20%5BDSCS%5D.user.js // @updateURL https://update.greasyfork.icu/scripts/525223/DeepSeek%20Conversation%20Search%20%5BDSCS%5D.meta.js // ==/UserScript== (function() { 'use strict'; const sidebarClass = '._262baab'; const chatItemClass = '._546d736'; GM_addStyle(` .search-icon { cursor: pointer; padding: 10px; text-align: center; } .search-icon span { font-size: 20px; color: #000; } .search-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 9999; padding: 20px; border-radius: 10px; box-shadow: 0 8px 15px rgba(0, 0, 0, 0.2); width: 450px; max-height: 80%; display: flex; flex-direction: column; } .search-modal.dark { background-color: #333; color: #fff; } .search-modal.light { background-color: #fff; color: #000; } .search-header { display: flex; align-items: center; justify-content: space-between; padding: 12px; min-height: 50px; position: relative; border-bottom: 1px solid #ddd; } .search-header.dark { border-bottom: 1px solid #444; } .search-input { flex-grow: 1; outline: none; border: none; background: transparent; font-size: 16px; padding-right: 30px; } .close-button { font-size: 20px; cursor: pointer; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); } .chat-list { max-height: 300px; overflow-y: auto; padding-right: 10px; margin-bottom: 20px; flex-grow: 1; } .chat-item { padding: 10px; cursor: pointer; border-radius: 4px; transition: background-color 0.3s; margin-bottom: 8px; } .chat-item.light:hover { background-color: #f1f1f1; } .chat-item.dark:hover { background-color: #555; } `); new MutationObserver(() => { const sidebar = document.querySelector(sidebarClass); if (sidebar && !sidebar.querySelector('.search-icon')) { addSearchIcon(sidebar); } }).observe(document.body, { childList: true, subtree: true }); function addSearchIcon(container) { const iconContainer = document.createElement('div'); iconContainer.classList.add('search-icon', 'ds-icon-button', 'd1f5e283'); // Insert the SVG icon iconContainer.innerHTML = ` `; iconContainer.addEventListener('click', openSearchModal); container.appendChild(iconContainer); } function openSearchModal() { if (document.querySelector('.search-modal')) return; const isDark = document.body.hasAttribute('data-ds-dark-theme'); const modal = document.createElement('div'); modal.classList.add('search-modal', isDark ? 'dark' : 'light'); const header = createModalHeader(isDark, modal); const chatList = createChatList(isDark); modal.append(header, chatList); document.body.appendChild(modal); } function createModalHeader(isDark, modal) { const header = document.createElement('div'); header.classList.add('search-header', isDark ? 'dark' : 'light'); const searchInput = document.createElement('div'); searchInput.classList.add('search-input'); searchInput.setAttribute('contenteditable', 'true'); const closeButton = document.createElement('span'); closeButton.classList.add('close-button'); closeButton.innerHTML = '✕'; closeButton.addEventListener('click', () => modal.remove()); searchInput.addEventListener('input', () => filterChats(searchInput.textContent.toLowerCase())); header.append(searchInput, closeButton); return header; } function createChatList(isDark) { const chatList = document.createElement('div'); chatList.classList.add('chat-list'); document.querySelectorAll(chatItemClass).forEach(item => { const chatItem = document.createElement('div'); chatItem.classList.add('chat-item', isDark ? 'dark' : 'light'); chatItem.textContent = item.textContent; chatItem.addEventListener('mouseenter', () => { chatItem.classList.add(isDark ? 'dark' : 'light'); }); chatItem.addEventListener('mouseleave', () => { chatItem.classList.remove(isDark ? 'dark' : 'light'); }); chatItem.addEventListener('click', () => { item.click(); document.querySelector('.search-modal')?.remove(); }); chatList.appendChild(chatItem); }); return chatList; } function filterChats(query) { document.querySelectorAll('.search-modal .chat-item').forEach(item => { item.style.display = item.textContent.toLowerCase().includes(query) ? 'block' : 'none'; }); } })();