您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Расширенные настройки: сортировка, редактирование, автоотправка, автоочистка и др. Автор: HELLIX
// ==UserScript== // @name Admins Response Templates (Forum LIVE RUSSIA) // @namespace https://forum.liverussia.online // @version 4.3.4 // @description Расширенные настройки: сортировка, редактирование, автоотправка, автоочистка и др. Автор: HELLIX // @author HELLIX // @match https://forum.liverussia.online/* // @grant none // ==/UserScript== (function () { 'use strict'; const STORAGE_KEY = 'lr_admin_templates_categorized'; const THEME_STORAGE_KEY = 'lr_admin_theme'; const AUTO_SUBMIT_STORAGE_KEY = 'lr_admin_auto_submit'; const SHOW_SWIPE_BUTTONS_STORAGE_KEY = 'lr_admin_show_swipe_buttons'; const DEFAULT_TEMPLATES = { 'Основные': [ { name: 'Приветствие', text: 'Всем привет!' }, { name: 'Спасибо', text: 'Спасибо за сообщение!' } ] }; function addGlobalStyle(css) { const head = document.getElementsByTagName('head')[0]; if (!head) { return; } const style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = css; head.appendChild(style); } const buttonStyle = ` .lr-admin-button { background-color: #5cb85c; color: white; border: 1px solid #4cae4c; padding: 8px 14px; border-radius: 4px; cursor: pointer; font-weight: bold; font-size: 14px; line-height: 1.42857143; display: inline-block; width: 120px; height: 34px; box-sizing: border-box; text-align: center; margin: 0; transition: background-color 0.2s, border-color 0.2s; } .lr-admin-button:hover { background-color: #449d44; border-color: #398439; } .lr-admin-button-highlight { background-color: #337ab7; border-color: #2e6da4; } .lr-admin-button-highlight:hover { background-color: #286090; border-color: #204d74; } .lr-admin-button-danger { background-color: #d9534f; border-color: #d43f3a; } .lr-admin-button-danger:hover { background-color: #c9302c; border-color: #ac2925; } .lr-dropdown-menu { position: absolute; background-color: #fff; border: 1px solid #ccc; border-radius: 6px; padding: 6px 10px; min-width: 260px; max-height: 300px; overflow-y: auto; z-index: 10000; box-shadow: 0 4px 8px rgba(0,0,0,0.3); font-size: 14px; font-family: Arial, sans-serif; color: #222; } .lr-dropdown-menu.dark { background-color: #333; border-color: #555; color: #eee; } .lr-dropdown-menu .item { cursor: pointer; padding: 4px 8px; border-radius: 4px; } .lr-dropdown-menu .item:hover { background-color: #eee; } .lr-dropdown-menu.dark .item:hover { background-color: #555; } .lr-toggle { position: relative; display: inline-block; width: 60px; height: 24px; } .lr-toggle input { opacity: 0; width: 0; height: 0; } .lr-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .4s; border-radius: 24px; } .lr-slider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; transition: .4s; border-radius: 50%; } input:checked + .lr-slider { background-color: #2196F3; } input:focus + .lr-slider { box-shadow: 0 0 1px #2196F3; } input:checked + .lr-slider:before { transform: translateX(36px); } .lr-slider.round { border-radius: 34px; } .lr-slider.round:before { border-radius: 50%; } .lr-template-textarea { font-family: monospace; } .lr-admin-button-small { padding: 4px 8px; font-size: 12px; width: auto; height: 26px; box-sizing: border-box; text-align: center; line-height: 18px; cursor: pointer; border: 1px solid transparent; background-color: transparent; color: inherit; transition: background-color 0.2s, color 0.2s; } .lr-admin-button-small:hover { background-color: rgba(0, 0, 0, 0.1); color: inherit; } .lr-draggable { cursor: move; position: relative; } .lr-drag-handle { cursor: grab; margin-right: 5px; } .lr-draggable:hover .lr-admin-button-small, .lr-draggable.active .lr-admin-button-small { opacity: 1; } .lr-template-container { position: relative; margin-bottom: 12px; border: 1px solid #ccc; border-radius: 6px; padding: 6px 10px; background: #f9f9f9; display: flex; flex-direction: column; gap: 6px; overflow: hidden; } .lr-template-container.dragging { cursor: grabbing; } .lr-template-buttons { position: absolute; top: 0; right: -160px; width: 160px; height: 100%; display: flex; align-items: center; justify-content: space-around; background-color: rgba(255, 255, 255, 0.8); transition: right 0.3s ease-in-out; z-index: 2; } .lr-template-container:hover .lr-template-buttons, .lr-template-container.dragging .lr-template-buttons { right: 0; } `; addGlobalStyle(buttonStyle); function createButton(text, title, className) { const btn = document.createElement('button'); btn.type = 'button'; btn.textContent = text; btn.title = title; btn.className = `lr-admin-button ${className || ''}`; return btn; } function insertText(editor, text) { if (!editor) return; editor.focus(); try { if (editor.tagName === 'TEXTAREA') { const start = editor.selectionStart || 0; const end = editor.selectionEnd || 0; const val = editor.value; editor.value = val.substring(0, start) + text + val.substring(end); editor.selectionStart = editor.selectionEnd = start + text.length; editor.dispatchEvent(new InputEvent('input', { bubbles: true })); } else if (editor.isContentEditable) { document.execCommand('insertText', false, text); } } catch (error) { console.error('Error inserting text:', error); } } function getTemplates() { const saved = localStorage.getItem(STORAGE_KEY); return saved ? JSON.parse(saved) : DEFAULT_TEMPLATES; } function setTemplates(templates) { localStorage.setItem(STORAGE_KEY, JSON.stringify(templates)); } function isDarkMode() { const setting = localStorage.getItem(THEME_STORAGE_KEY) || 'auto'; if (setting === 'dark') return true; if (setting === 'light') return false; return window.matchMedia?.('(prefers-color-scheme: dark)').matches; } function showAlert(message) { alert(message); } function openManageDialog() { const templates = getTemplates(); const dark = isDarkMode(); const wrapper = document.createElement('div'); Object.assign(wrapper.style, { position: 'fixed', top: '10%', left: '50%', transform: 'translateX(-50%)', padding: '20px', zIndex: 2000, boxShadow: '0 4px 10px rgba(0,0,0,0.3)', borderRadius: '8px', maxWidth: '90%', maxHeight: '70%', overflowY: 'auto', backgroundColor: dark ? '#222' : '#fff', color: dark ? '#fff' : '#000', fontFamily: 'Arial, sans-serif', display: 'flex', gap: '20px', minWidth: '600px' }); const catPanel = document.createElement('div'); catPanel.style.minWidth = '180px'; catPanel.style.borderRight = dark ? '1px solid #555' : '1px solid #ccc'; catPanel.style.paddingRight = '10px'; const catTitle = document.createElement('h3'); catTitle.textContent = 'Категории'; catPanel.appendChild(catTitle); const catList = document.createElement('ul'); catList.style.listStyle = 'none'; catList.style.padding = '0'; catList.style.margin = '0'; const addCategoryBtn = createButton('+ Категория', 'Добавить новую категорию'); addCategoryBtn.style.margin = '10px 0'; catPanel.appendChild(catList); catPanel.appendChild(addCategoryBtn); const tmplPanel = document.createElement('div'); tmplPanel.style.flexGrow = '1'; tmplPanel.style.paddingLeft = '10px'; const tmplTitle = document.createElement('h3'); tmplPanel.appendChild(tmplTitle); const tmplList = document.createElement('div'); tmplPanel.appendChild(tmplList); const addTemplateBtn = createButton('+ Шаблон', 'Добавить новый шаблон'); addTemplateBtn.style.marginTop = '10px'; tmplPanel.appendChild(addTemplateBtn); let selectedCategory = null; function dragStart(event) { event.dataTransfer.setData('text', event.target.dataset.category); } function dragOver(event) { event.preventDefault(); } function drop(event) { event.preventDefault(); const fromCategory = event.dataTransfer.getData('text'); const toCategory = event.target.dataset.category; if (fromCategory === toCategory) return; const temp = {}; Object.keys(templates).forEach(cat => { if (cat === toCategory) { temp[fromCategory] = templates[fromCategory]; } if (cat !== fromCategory) { temp[cat] = templates[cat]; } }); if (!temp[fromCategory]) { temp[fromCategory] = templates[fromCategory]; } setTemplates(temp); rebuildCategoryList(); selectCategory(fromCategory); } function rebuildCategoryList() { catList.innerHTML = ''; Object.keys(templates).forEach(cat => { const li = document.createElement('li'); li.textContent = cat; li.style.padding = '6px 10px'; li.style.cursor = 'pointer'; li.style.borderRadius = '4px'; li.style.display = 'flex'; li.style.justifyContent = 'space-between'; li.classList.add('lr-draggable'); li.draggable = true; li.dataset.category = cat; li.addEventListener('dragstart', dragStart); li.addEventListener('dragover', dragOver); li.addEventListener('drop', drop); const dragHandle = document.createElement('span'); dragHandle.innerHTML = '☰'; dragHandle.className = 'lr-drag-handle'; li.prepend(dragHandle); const renameBtn = createButton('Переименовать', 'Переименовать категорию', 'lr-admin-button-small'); renameBtn.onclick = (e) => { e.stopPropagation(); const newName = prompt('Введите новое название категории', cat); if (newName && newName !== cat && !templates[newName]) { templates[newName] = templates[cat]; delete templates[cat]; setTemplates(templates); selectedCategory = newName; rebuildCategoryList(); selectCategory(newName); } }; li.appendChild(renameBtn); const delBtn = createButton('Удалить', 'Удалить категорию', 'lr-admin-button-danger lr-admin-button-small'); delBtn.onclick = (e) => { e.stopPropagation(); if (confirm('Вы уверены, что хотите удалить эту категорию?')) { delete templates[cat]; setTemplates(templates); selectedCategory = null; rebuildCategoryList(); tmplList.innerHTML = ''; } }; li.appendChild(delBtn); li.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); document.querySelectorAll('.lr-draggable').forEach(el => { el.classList.remove('active'); }); this.classList.add('active'); selectCategory(cat); }); if (cat === selectedCategory) li.style.backgroundColor = dark ? '#555' : '#eee'; catList.appendChild(li); }); } function selectCategory(category) { selectedCategory = category; tmplTitle.textContent = `Шаблоны категории: ${category}`; rebuildCategoryList(); tmplList.innerHTML = ''; const showSwipeButtons = localStorage.getItem(SHOW_SWIPE_BUTTONS_STORAGE_KEY) === 'true'; (templates[category] || []).forEach((template, idx) => { const container = document.createElement('div'); container.classList.add('lr-template-container'); container.style.cssText = `margin-bottom:12px;border:1px solid ${dark ? '#444' : '#ccc'};border-radius:6px;padding:6px 10px;background:${dark ? '#333' : '#f9f9f9'};display:flex;flex-direction:column;gap:6px;position:relative; overflow: hidden;`; const nameInput = document.createElement('input'); nameInput.addEventListener('input', () => { templates[category][idx].name = nameInput.value; setTemplates(templates); }); nameInput.value = template.name; nameInput.placeholder = 'Название шаблона'; nameInput.style.marginBottom = '5px'; const textArea = document.createElement('textarea'); textArea.addEventListener('input', () => { templates[category][idx].text = textArea.value; setTemplates(templates); }); textArea.value = template.text; textArea.rows = 4; textArea.className = 'lr-template-textarea'; textArea.placeholder = 'Текст шаблона'; const buttonsDiv = document.createElement('div'); buttonsDiv.classList.add('lr-template-buttons'); buttonsDiv.style.cssText = 'position: absolute; top: 0; right: -160px; width: 160px; height: 100%; display: flex; align-items: center; justify-content: space-around; background-color: rgba(255, 255, 255, 0.8); transition: right 0.3s ease-in-out;'; const renameBtn = createButton('Переименовать', 'Переименовать шаблон', 'lr-admin-button-small'); const delBtn = createButton('Удалить', 'Удалить шаблон', 'lr-admin-button-danger lr-admin-button-small'); delBtn.style.width = 'auto'; renameBtn.style.width = 'auto'; renameBtn.onclick = () => { const newName = prompt('Введите новое название шаблона', template.name); if (newName) { templates[category][idx].name = newName; setTemplates(templates); selectCategory(category); } }; delBtn.onclick = () => { if (confirm('Вы уверены, что хотите удалить этот шаблон?')) { templates[category].splice(idx, 1); setTemplates(templates); selectCategory(category); } }; if (showSwipeButtons) { buttonsDiv.append(renameBtn, delBtn); } container.append(nameInput, textArea, buttonsDiv); tmplList.appendChild(container); }); } addCategoryBtn.onclick = () => { const name = prompt('Введите название новой категории'); if (!name || templates[name]) return; templates[name] = []; setTemplates(templates); rebuildCategoryList(); selectCategory(name); }; addTemplateBtn.onclick = () => { if (!selectedCategory) return alert('Выберите категорию'); const name = prompt('Введите название шаблона'); if (!name) return; templates[selectedCategory].push({ name, text: '' }); setTemplates(templates); selectCategory(selectedCategory); }; const closeBtn = createButton('Закрыть', 'Закрыть'); closeBtn.style.backgroundColor = dark ? '#444' : '#ccc'; closeBtn.onclick = () => document.body.removeChild(wrapper); wrapper.append(catPanel, tmplPanel, closeBtn); rebuildCategoryList(); if (selectedCategory) { selectCategory(selectedCategory); } else if (Object.keys(templates).length > 0) { selectCategory(Object.keys(templates)[0]); } document.body.appendChild(wrapper); } function openSettingsDialog() { const dark = isDarkMode(); const wrapper = document.createElement('div'); Object.assign(wrapper.style, { position: 'fixed', top: '10%', left: '50%', transform: 'translateX(-50%)', padding: '20px', zIndex: 2000, boxShadow: '0 4px 10px rgba(0,0,0,0.3)', borderRadius: '8px', maxWidth: '90%', maxHeight: '70%', overflowY: 'auto', backgroundColor: dark ? '#222' : '#fff', color: dark ? '#fff' : '#000', fontFamily: 'Arial, sans-serif', display: 'flex', gap: '20px', minWidth: '600px' }); const catPanel = document.createElement('div'); catPanel.style.minWidth = '180px'; catPanel.style.borderRight = dark ? '1px solid #555' : '1px solid #ccc'; catPanel.style.paddingRight = '10px'; const catTitle = document.createElement('h3'); catTitle.textContent = 'Настройки'; catPanel.appendChild(catTitle); const infoDiv = document.createElement('div'); infoDiv.style.marginBottom = '20px'; infoDiv.innerHTML = ` <strong>О скрипте:</strong><br> Версия: <code>4.3.4</code><br> Автор: <a href="https://forum.liverussia.online/index.php?members/lucifer_hellix.11771/" target="_blank">HELLIX</a><br> Назначение: Упрощение вставки шаблонных ответов администраторами форума.<br> `; catPanel.appendChild(infoDiv); const tmplPanel = document.createElement('div'); tmplPanel.style.flexGrow = '1'; tmplPanel.style.paddingLeft = '10px'; const tmplTitle = document.createElement('h3'); tmplTitle.textContent = 'Параметры:'; tmplPanel.appendChild(tmplTitle); const tmplList = document.createElement('div'); tmplList.style.display = 'flex'; tmplList.style.flexDirection = 'column'; tmplList.style.gap = '20px'; tmplPanel.appendChild(tmplList); const autoSubmitDiv = document.createElement('div'); autoSubmitDiv.style.display = 'flex'; autoSubmitDiv.style.alignItems = 'center'; autoSubmitDiv.style.justifyContent = 'space-between'; const autoSubmitLabel = document.createElement('label'); autoSubmitLabel.textContent = 'Автоотправка:'; autoSubmitLabel.style.marginRight = '10'; const autoSubmitToggle = document.createElement('label'); autoSubmitToggle.classList.add('lr-toggle'); const autoSubmitInput = document.createElement('input'); autoSubmitInput.type = 'checkbox'; autoSubmitInput.checked = localStorage.getItem(AUTO_SUBMIT_STORAGE_KEY) === 'true'; autoSubmitInput.onchange = () => { localStorage.setItem(AUTO_SUBMIT_STORAGE_KEY, autoSubmitInput.checked); }; const autoSubmitSlider = document.createElement('span'); autoSubmitSlider.classList.add('lr-slider', 'round'); autoSubmitToggle.appendChild(autoSubmitInput); autoSubmitToggle.appendChild(autoSubmitSlider); autoSubmitDiv.appendChild(autoSubmitLabel); autoSubmitDiv.appendChild(autoSubmitToggle); tmplList.appendChild(autoSubmitDiv); const showSwipeButtonsDiv = document.createElement('div'); showSwipeButtonsDiv.style.display = 'flex'; showSwipeButtonsDiv.style.alignItems = 'center'; showSwipeButtonsDiv.style.justifyContent = 'space-between'; const showSwipeButtonsLabel = document.createElement('label'); showSwipeButtonsLabel.textContent = 'переименовать/удалить:'; showSwipeButtonsLabel.style.marginRight = '5px'; const showSwipeButtonsToggle = document.createElement('label'); showSwipeButtonsToggle.classList.add('lr-toggle'); const showSwipeButtonsInput = document.createElement('input'); showSwipeButtonsInput.type = 'checkbox'; showSwipeButtonsInput.checked = localStorage.getItem(SHOW_SWIPE_BUTTONS_STORAGE_KEY) === 'true'; showSwipeButtonsInput.onchange = () => { localStorage.setItem(SHOW_SWIPE_BUTTONS_STORAGE_KEY, showSwipeButtonsInput.checked); selectCategory(selectedCategory); }; const showSwipeButtonsSlider = document.createElement('span'); showSwipeButtonsSlider.classList.add('lr-slider', 'round'); showSwipeButtonsToggle.appendChild(showSwipeButtonsInput); showSwipeButtonsToggle.appendChild(showSwipeButtonsSlider); showSwipeButtonsDiv.appendChild(showSwipeButtonsLabel); showSwipeButtonsDiv.appendChild(showSwipeButtonsToggle); tmplList.appendChild(showSwipeButtonsDiv); const themeDiv = document.createElement('div'); themeDiv.style.display = 'flex'; themeDiv.style.flexDirection = 'column'; themeDiv.style.alignItems = 'flex-start'; themeDiv.style.gap = '4px'; themeDiv.style.marginTop = '10px'; const themeLabel = document.createElement('label'); themeLabel.textContent = 'Тема:'; themeLabel.style.marginRight = '5px'; const themeSelect = document.createElement('select'); themeSelect.style.padding = '6px 12px'; themeSelect.style.borderRadius = '6px'; themeSelect.style.border = '1px solid #ccc'; themeSelect.style.minWidth = '140px'; themeSelect.style.maxWidth = '200px'; themeSelect.style.marginLeft = '10px'; themeSelect.style.marginTop = '4px'; themeSelect.style.backgroundColor = dark ? '#444' : '#fff'; themeSelect.style.color = dark ? '#eee' : '#222'; themeSelect.style.boxShadow = '0 1px 3px rgba(0,0,0,0.2)'; themeSelect.style.fontSize = '14px'; themeSelect.innerHTML = ` <option value="auto" ${localStorage.getItem(THEME_STORAGE_KEY) === 'auto' ? 'selected' : ''}>Авто</option> <option value="light" ${localStorage.getItem(THEME_STORAGE_KEY) === 'light' ? 'selected' : ''}>Светлая</option> <option value="dark" ${localStorage.getItem(THEME_STORAGE_KEY) === 'dark' ? 'selected' : ''}>Тёмная</option>`; themeSelect.onchange = () => { localStorage.setItem(THEME_STORAGE_KEY, themeSelect.value); location.reload(); }; themeDiv.appendChild(themeLabel); themeDiv.appendChild(themeSelect); tmplList.appendChild(themeDiv); const exportImportDiv = document.createElement('div'); exportImportDiv.style.display = 'flex'; exportImportDiv.style.flexDirection = 'row'; exportImportDiv.style.gap = '10px'; const exportBtn = createButton('Экспорт', 'Экспорт шаблонов в JSON файл'); exportBtn.onclick = () => { const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(getTemplates())); const dlAnchorElem = document.createElement('a'); dlAnchorElem.setAttribute("href", dataStr); dlAnchorElem.setAttribute("download", "admin_templates.json"); dlAnchorElem.click(); }; const importBtn = createButton('Импорт', 'Импорт шаблонов из JSON файла'); importBtn.onclick = () => { const input = document.createElement('input'); input.type = 'file'; input.accept = '.json'; input.onchange = e => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = event => { try { const json = JSON.parse(event.target.result); if (typeof json === 'object' && json !== null) { if (confirm('Вы уверены, что хотите заменить текущие шаблоны на импортированные?')) { setTemplates(json); alert('Шаблоны успешно импортированы'); location.reload(); } } else { alert('Неверный формат файла. Ожидается JSON объект.'); } } catch (error) { alert('Ошибка при чтении файла: ' + error.message); } }; reader.readAsText(file); }; input.click(); }; exportImportDiv.appendChild(exportBtn); exportImportDiv.appendChild(importBtn); tmplList.appendChild(exportImportDiv); const saveBtn = createButton('Сохранить', 'Сохранить изменения'); Object.assign(saveBtn.style, { marginTop: '20px', alignSelf: 'center', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '10px 32px', fontSize: '16px', fontWeight: 'bold', borderRadius: '8px', backgroundColor: '#007bff', border: 'none', color: '#fff', boxShadow: '0 2px 6px rgba(0, 123, 255, 0.4)', transition: 'background-color 0.3s ease', cursor: 'pointer', whiteSpace: 'nowrap', minWidth: '140px', textAlign: 'center' }); saveBtn.onmouseenter = () => saveBtn.style.backgroundColor = '#0069d9'; saveBtn.onmouseleave = () => saveBtn.style.backgroundColor = '#007bff'; saveBtn.onclick = () => { alert('Настройки сохранены'); }; tmplList.appendChild(saveBtn); const closeBtn = createButton('Закрыть', 'Закрыть'); closeBtn.style.backgroundColor = dark ? '#444' : '#ccc'; closeBtn.onclick = () => document.body.removeChild(wrapper); wrapper.append(catPanel, tmplPanel, closeBtn); document.body.appendChild(wrapper); } function main() { const editor = document.querySelector('textarea[name="message"], .fr-element[contenteditable="true"]'); if (!editor) return; const replyButton = Array.from(document.querySelectorAll('button')).find(b => b.textContent.includes('Ответить')); if (!replyButton) return; let container = document.querySelector('#lr_template_buttons_container'); if (!container) { container = document.createElement('div'); container.id = 'lr_template_buttons_container'; container.style.display = 'flex'; container.style.gap = '12px'; container.style.alignItems = 'center'; container.style.marginLeft = '10px'; replyButton.parentNode.insertBefore(container, replyButton); } const buttonWidth = replyButton.offsetWidth + 'px'; const btnSettings = createButton('Настройки', 'Изменить тему и автоотправку', 'lr-admin-button-highlight'); btnSettings.style.minWidth = buttonWidth; const btnManage = createButton('Управление', 'Управление шаблонами и категориями'); btnManage.style.minWidth = buttonWidth; const btnCategories = createButton('Категории', 'Выбрать шаблон из категории'); btnCategories.style.minWidth = buttonWidth; let currentDropdown = null; let settingsMenuOpen = false; btnSettings.onclick = e => { e.stopPropagation(); closeDropdown(); openSettingsDialog(); }; const closeDropdown = () => { const existing = document.getElementById('lr_category_menu'); if (existing) existing.remove(); currentDropdown = null; } const createCategoryDropdown = () => { const dropdown = document.createElement('div'); dropdown.id = 'lr_category_menu'; dropdown.className = `lr-dropdown-menu ${isDarkMode() ? 'dark' : ''}`; Object.entries(getTemplates()).forEach(([category, templates]) => { const catHeader = document.createElement('div'); catHeader.textContent = category; catHeader.style.fontWeight = 'bold'; catHeader.style.marginTop = '10px'; catHeader.style.marginBottom = '4px'; dropdown.appendChild(catHeader); templates.forEach(tmpl => { const item = document.createElement('div'); item.textContent = tmpl.name; item.className = 'item'; item.onclick = () => { insertText(editor, tmpl.text); if (localStorage.getItem(AUTO_SUBMIT_STORAGE_KEY) === 'true') { const submit = editor.closest('form')?.querySelector('[type="submit"]'); if (submit) setTimeout(() => submit.click(), 100); } closeDropdown(); }; dropdown.appendChild(item); }); }); return dropdown; } btnManage.onclick = () => { closeDropdown(); openManageDialog(); }; btnCategories.onclick = e => { e.stopPropagation(); if (currentDropdown) { closeDropdown(); return; } const dropdown = createCategoryDropdown(); currentDropdown = dropdown; container.appendChild(dropdown); }; document.addEventListener('click', () => { closeDropdown(); }); [btnSettings, btnManage, btnCategories].forEach(btn => container.appendChild(btn)); } setTimeout(main, 1000); })();